CodingTour
ARTS #118

Algorithm

本周选择的算法题是:Contains Duplicate

规则

Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.

Example 1:

Input: nums = [1,2,3,1]
Output: true

Example 2:

Input: nums = [1,2,3,4]
Output: false

Example 3:

Input: nums = [1,1,1,3,3,4,3,2,4,2]
Output: true

Constraints:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

Solution

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(nums) != len(set(nums))

Review

Ten Years Of Kotlin Programming Language

一个技术能不能发展起来关键看三点:

  • 有没有一个比较好的社区
  • 有没有一个工业化的标准
  • 有没有一个或多个杀手级的应用

其他因素:

  • 学习难度
  • 开发效率
  • 技术支持
  • 击中痛点

Kotlin 发布10年了,没有太明显的短板,在 JetBrains 的大力支持下,Kotlin 已经可以在 iOS 平台像 Native 那样运行,还是很值得投入精力学习的。而且从个人的角度来看:

  • 能参与技术发展的过程非常重要
  • 抢占技术的先机能给个人建立护城河

希望未来 Kotlin 在生态上能覆盖到更多的领域。

Tip

彻底解决 uwsgi 的编码问题,在 ini 文件中添加:

env = LANG=en_US.utf8
env = LC_ALL=en_US.UTF-8
env = LC_LANG=en_US.UTF-8

Share

组件化方案随笔

组件化方案是移动端常见的设计抉择,它有以下好处:

  • 降低模块间的耦合性,并提高模块的内聚性

  • 模块独立编译、运行,对持续集成系统更友好
  • 业务隔离,可独立进行版本控制
  • 组件即应用

组件化落地过程中有两个直观的问题需要解决:

  • 横向通信问题
  • 数据依赖问题

其中横向通信有很多基于 Router 或接口之类的解决方案,但两者都不可避免的维护成本过高,而且会有一定的风险性:由于失去了编译期的检查,运行期的调用问题要在运行时才能暴露。

数据依赖问题也有很多方案,比如 ORM 后再传参,但这样破坏了面向对象(试想模块内如何通信),而且对能力的提供方来说,它不应该关心自己何时以何种方式调用,无论是组件化通信方案还是直接依赖,这不是能力的提供方太需要关心的事情;数据模型下沉也是常见选择,但这大多发生在找不到合适的地方来存放这些对象,于是选择了被动下沉,这种行为破坏了组件化,我们原本期望通过组件化提高模块的内聚性,但如果模型对象都不在模块内,内聚性从何说起?而且这种方式也很难做到可选依赖或按需依赖。

中心化的 API 提供方式带来的好处是调用方不用太关心服务方是谁,离散式的好处是容易做到按需依赖,但其实也可以尝试“全都要”,比如微信团队的分享: Android 大型工程 App Bundle 模块化实践