您的位置:首页 > 编程语言

如何写出好代码(一)

2017-11-23 21:15 190 查看
前言
有人问我,什么样的代码才是好的代码?
我答不上来,ios开发6年多,大部分都在独立开发,合作开发也都是主程,看开源库学习我也只看大的好的。
我说,我觉得我的代码就很好,我这么多年开发基本没加过班,每次需求都能很快做完和修改,除了积累的东西多,大部分还是因为代码好看,东西好找。
我继续说,我看开源库也都只看大的,公认优秀的。
他问,那你觉得你得代码具体好在哪?
我说,我也不知道,因为我也没看过差代码。
他问,那你没看过差代码,你怎么会觉得别人的代码不如你的?
我不知道说什么了。。。。

最近跳槽去了一家新的公司,公司现有的代码让我加点东西,公司都是全栈,让我做swift和android,我现学了swift和java,边学边做。
本来想写点学习笔记,不过我发现,这老代码可真难看,我终于看到了烂代码,于是一边学习,一边重构,一边做需求。
我还发现设计模式每人都能随口说出一大堆,真正会用的却没几个。

我决定针对如何写出好的代码写几篇博客。
内容如下:
1,易读易修改的代码
2,设计模式的灵活运用
3,重构思想和实际运用

正文

一,结构
1,分块
objc:#program mark - 名称
swift: /MARK: - 名称
在一个类中应该有以下几种:
Public
Override
Private
Action
XXXDelegate等
每一类方法都应该放在块中,当寻找方法的时候就会很好找。

2,长方法
有时候一个方法会很长,比如三四十行去完成一件事。
让一个阅读者去看的时候,一行一行看会非常的费劲。
以前我们通常会做的是方法拆分,把里面做的每一件事单独抽成一个有意义的私有方法,但是这么做有个弊端,就是私有方法会很多,我们在看之前的长方法的时候需要一个一个点进去看。
OC有了block,swift可以函数套嵌,我们可以去利用。

打个比方:
show方法{
  1-5行show一个label
  6-12行show一个textview
  13-19行show一个textfield
}
那么这个方法有19行,读起来会很费劲,读者必须一行一行看,才知道这个方法里一共做了哪些事。如果需求变了,需要给里面的某个控件做一些更改,我们需要找半天。

我们现在改成
show方法{
    分别调用下面三个方法
}
showlabel方法
showtextview方法
showtextfield方法
这样写就会清晰很多,但是有些问题:
1,会让该类方法变得特别的多,不容易寻找某一个方法
2,如果需求变了我们需要删除某个控件,我们删除方法的时候需要去查找到底哪些地方用到了,结果最后发现只有一个地方用到。

对于这种,我们可以采用block(objc)或者函数套嵌(swift)的方式:
show方法{
    showlabel方法
    showtext方法
    showtextfield方法
    分别调用这三个方法
}
这样就会解决一个类有过多的方法,即使这个类很长,也能很快定位到我们需要找的地方,修改删除添加都极为方便。
不过要注意的是:
1,即使这样写也还是不要太长太长了,一个方法内本就不该做很多很多很多的事情。
2,方法套一层可以,别套两层以上,会反而让代码变得难读。
这种方式还能很好的解决一些其他问题,之后我会提到。

3,接口
合作开发中,干净整齐的接口变得极为重要 。
我们应该有一种黑盒概念,类执行部分不需要使用者考虑,使用者只需要看到这个类的接口就知道如何调用。
也叫外观模式。

接口一定要干净整洁,
现在有一个场景,一个view类,接口中有3个属性。
而作为一个使用者,拿到这个类会考虑:
这3个属性都必须要传吗,为空会不会有问题?
这个view应该如何创建,是init呢还是从xib中加载?
等等一系列问题,于是他会去问这个开发者这个类怎么调用,或者自己去看类如何实现的,这不是理想的。
这还只简单的类接口,如果复杂的类接口将更难理解如何使用。
我们写一个类就应该任何人看到都知道怎么调用。
这还是比较好的写法,如果你把私有方法都暴露到接口里,那你不应该看这篇文章。

objc是有个h文件,接口还算明显。
我们在接口中定义一个类方法,类方法返回自身的实例。
类方法有三个参数,我们可以直接在参数前标注是否可为空。
然后将属性移到.m文件。
如果外部需要访问的属性,我们可以暴露在接口里,并且标注为只读,用户就知道这个属性不能从外部set。
这样使用者拿到这个类一看到接口就这一个方法,就知道如何使用了,而且任何都不用考虑直接一行代码搞定。

Swift没有.n,所有代码都在一个文件内,这样做。
Class xxxxx{
/MARK - Public
写定义一个如同上面类方法功能一样的静态方法。
/MARK - Private
成员变量
函数
…………
}
这样一来,当使用者一拿到这个类看到上面的标注,就知道这里是接口,而且他不需要往下滑。因为下面所有的东西都不是使用者应该关心的。
这要做好处很明显,但是也会有些隐性的维护问题,后面会说如何解决。
还有些情况更要用到这种方式,之后我也会提到。

暂时先写到这,改天继续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息