作者回复: 知道为什么乱,才好改。
这一篇的最后一节,我们会总结一些编码规范方面的一些心理学知识。到时候,你在回头看看这一篇的文章,可能会有新的收获。
编码规范比较杂,知道了背后的道理,运用的就自如些,方便些。
作者回复: 嗯,我理解你的看法。这也是这个专栏不讨巧的地方。如果讲代码的话,我写的也轻松,你学的也带劲。其实,这也是我一直想和大家讨论的一个问题。
讲代码很重要。但是,看再多的代码,就这一节来说,我觉得都不如知道“大脑按块接受信息”这个行为模式重要。理解了基础的理论,所有的规范都不用死记硬背,你还可以创造新规范、改进旧规范。
有时候,我们对于一些规范很纠结,比如使用四个空格的缩进问题,比如if语句后要跟个括号的问题,也很难再实践中被遵守。为什么哪? 说白了,就是不知道不这样做的危害。很多公司有一套一套的规则,就是执行不了。为啥呢?大家根本不知道规则对自己有什么好处。
编码规范这东西,随便网上找找,都是一大堆的规范。阿里的规范,Google的规范,Java的规范的规范,都可以找到,讲的比我们这个专栏要全要多。当我开始筹划这个专栏的时候,我给自己定下的目标,是让大家了解为什么;然后给一些例子,说明怎么办。理解了为什么,好多事情你自然就知道怎么办了,这样好多东西才可能成为你自己的东西,而不是我塞给你的东西。
很可惜的是,这样做的确存在很大的问题:理论成了我要硬塞给你的东西。所以,理论这一块,有人可能就有点抗拒。🤣又让我学没用的理论!
我们在看代码的时候,很少有人说,这是代码规范规定的,你必须这样改、那样改,按照规范改。这样说,可能没人愿意搭理我们。我们常说的是,这样看着不舒服,那样容易出问题,说的更多的是为什么。如果让我找一找为什么给出理论重要,也许更愉快地工作,算是一点吧。
作者回复: 这个办法不错。我是在纸上各种画。
作者回复: 先要区分类和方法。在面向对象的设计中,类表示的是一个对象。比如人,身份,铅笔,钱包等。一般地,名词或者可以看作名词的词,需要用类来表示。
方法,一般表示的是行为,也就是你说的执行一个功能。比如买菜,拖地,钓鱼,吃没吃过晚饭,有没有购房资格,都可以看作是行为或者判断。一般地,动词和形容词,或者类似的词,要用方法来表示。
通常地,一句话,有主语、谓语、宾语,主语和谓语一般表示为类,而谓语就是连接两个类的方法。
举个例子,“授权的用户可以登录服务系统”这句话里的词语有“授权的", “用户”,“登录”,“服务系统”。那么,“用户”和“服务系统”就可以设计成类,而“授权的”是“用户”这个类的一个方法。“用户”和“服务系统”这两个类里,要分别有方法处理“登录”这个行为。
而Interface呢,一般用在高度抽象的场合。什么是高度抽象呢? 比如说,我们知道资源的使用最后应该关闭,那么“关闭”就可以是一个高度抽象的方法。 不管是什么资源,什么类,都可以有一个“关闭”的方法。实现了“关闭”接口的类,都可以调用“关闭”这个方法。 这里面有一个小问题就是,房屋的门可以实现“关闭”,下水管道也可以实现“关闭。可是,房屋和下水管道之间,并没有可以继承的关系。这时候,Interface就可以突破class的继承限制,多个没有继承关系的类,都可以实现Interface。一个类,只能继承一个父类,但是可以实现多个Interface。 比如说,class MySubClass extends MyClass implements Closeablse, Comparable {// snipped}。
不知道市面上还有没有"面向对象软件构造"这本书。太厚了,可以当作工具书查阅。 另外,多看看、琢磨琢磨Java标准类库的设计。这些API的设计,用“苛刻”这个词形容一点都不过分。这些API的背后,有着大量的权衡和考量,大部分都经得住了时间的考验。琢磨琢磨这些API的设计方式,也是一个学习设计的好办法。
作者回复: 一般来说,一个大的逻辑可以分成更小的逻辑,并列的小逻辑或者下层的小逻辑。这些小逻辑,可以分割成代码块,或者包装成方法。所以,一个大块里,你还可以再分小块。
作者回复: 是的。
作者回复: 嗯,我找找实际的代码。
就规范这一部分来说,你可以看看OpenJDK的String类的代码,或者其他基础类的代码,看看有什么可以改进的地方。 发现了问题,就给OpenJDK提交bug,提交补丁。
JDK用的太广泛了,每一个微小的修改,都会用到几十亿台设备上,都很有价值。还能成为OpenJDK成员😊
作者回复: 不谢,有收获就好。
作者回复: 我通常使用第二种。第二种规范推荐的多些。
作者回复: 收到;-)
作者回复: 挺好的。我建议在括号后换行,便于阅读和搜索,看到括号就知道这是一个方法或者函数。每个参数一行,这也是容易理解、视觉效果好的编排方式。
作者回复: “整理代码逻辑就能很好的分块”! 这个总结很棒!
作者回复: 一个大目标可以分解为小目标,大问题分解为小问题,这就是为什么会有缩进的逻辑。
方法独立的问题,我们后面还会谈到。 如果方法不独立,会有很多问题; 但是也做不到所有软件的所有方法都独立。
类一般是一个名词,表示一个对象;而方法一般可以使用动词,表示一种行为。从需求中找名词、动词(主语、谓语、宾语,形容词)这是一个常用的面向对象设计的办法。比如,一个授权的客户可以查询他的账户余额,客户、账户、余额,都是对象,可以考虑设计成类,而授权、查询,都是行为,可以考虑设计成方法。该怎么授权呢? 又是一大堆的描述,这就是把大问题分解成小问题。
行为也可以设计成类,比如授权当作名词看,就可以是个类。这种情况,需要复用设计,分离出抽象行为的时候用的比较多。
作者回复: 两种方式都很常见,“.”前面换行的稍微多一点。
作者回复: IDEA看来很多人爱啊
作者回复: 如果有空间,双倍缩进或者缩进更多到和同级别的表达式对齐。只要多于双倍缩进,怎么好看怎么来。
作者回复: 是的,认为写好代码只有一种规范是不对的。所以,我们要理解规范要求背后的一些东西,这样就计较容易写出别人看的顺眼的代码。不过,如果一个项目有规范,还是要遵守的。审美偏好太难协调,每个人一套规范也很麻烦。
插件是个好东西。有些规范,也是我们思考的逻辑的延展。要是编写代码的时候,就主动使用规范,也能帮助我们写好代码。