最近看了本书《Clean Code》,在结合之前看的《The art of readable code》聊一聊对Clean Code的看法。

我的经历

开始写代码的时候根本没有Clean Code的概念,把所有的变量和所有的方法堆在一起,代码无比丑陋。

后来慢慢的开始注重写“好看”的代码,学到很多关于代码的奇淫技巧。

后来系统的学习了Clean Code,在加上日常也在实践可以说对Clean Code有一些心得了。

Clean Code规范

这里引用书中的话,简单的总结一下Clean Code的规范

关于函数
  • 确保函数只做一件事,函数中的语句都要在同一个抽象级上
  • 如果一个函数用到了3个或者三个以上的参数,那么就要考虑把参数封装成类(struct)了
  • 函数不应该有副作用(反过来如果函数有了副作用,那么他肯定不只做了一件事)
  • 不要写重复的代码
关于注释
  • 很有意思的观点: 注释的恰当用法是弥补我们用代码表达意图时遭遇的失败
  • 这里的注释和SDK中的注释不一样:SDK中的注释是帮助使用者快速了解API接口的定义,而不需要他去读源码来了解
  • 遇到乱七八糟的代码时,要做的不是添加注释而是把代码弄干净
关于注释
  • 很有意思的观点: 注释的恰当用法是弥补我们用代码表达意图时遭遇的失败
  • 这里的注释和SDK中的注释不一样:SDK中的注释是帮助使用者快速了解API接口的定义,而不需要他去读源码来了解
  • 遇到乱七八糟的代码时,要做的不是添加注释而是把代码弄干净
关于对象和数据结构
  • 面向过程的代码难以添加新的数据结构,因为必须修改所有的函数
  • 面向对象的代码难以添加新的函数,因为必须修改所有的类
其他
  • 让变量名有更多的涵义
  • 不要取有误解的名字
  • 审美很重要,保持代码的一致性
  • 写有用的注释
  • 简化循环和逻辑
  • 一次只做一件事
  • 避免过度设计,尽量少写代码
  • 消除重复
  • 保证表达力
  • 尽可能减少类和方法的数量

以上我只挑了个人认为比较重要的记录下来。

实践

对于每个语言大致都应该有了一Lint工具来帮助你进行简单的Clean Code。比如Swift中有SwiftLint,Objective-C中有OCLint。日常的开发中可以通过这些工具来进行Clean Code。

毋庸置疑,Clean Code不论是在代码可读性还是在代码可维护性上都是无比重要的。

属性的存取方法有着严格的命名规范,正因为这样才可以用@property语法。@property会帮你自动生成一套存取方法。要访问属性可以使用“点语法”,编译器会自动的把“点语法”转换为对存取方法的调用,所以使用点语法跟使用存取方法没有丝毫差别。

Read More

先吐个槽,刚才ssh连接github的时候遇到了 ssh_exchange_identification: read: Connection reset by peer 的错误,查了半天资料也没找到问题,最后是因为开着代理VPS限制了TCP最大连接数所以失败的,关闭代理就可以使用了。

前言


几个月前看了RxSwift看的是云里雾里,还去作死翻译了一下官方的文档结果是翻译的一塌糊涂,最近又开始学习OC还是对响应式函数编程念念不忘,于是去踩坑ReactiveCocoa,看了一天加上之前的基础没那么难懂了。

Read More

GCD的API以及基本概念


  • 串行队列(Serial Dispatch Queue)
    一次只执行一个线程,按照添加到队列的顺序依次执行
  • 并发队列(Concurrent Dispatch Queue)
    一次可以执行多个线程,线程的执行没有先后顺序

Read More

自动布局相关的一些知识点,对今天看到的文章的小总结

layoutSubviews()

layoutSubviews()会在以下情况下调用

  • init初始化不会触发layoutSubviews。
  • addSubview会触发layoutSubviews。
  • 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
  • 滚动一个UIScrollView会触发layoutSubviews。
  • 旋转Screen会触发父UIView上的layoutSubviews事件。
  • 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
  • 直接调用setLayoutSubviews。

Read More