1.函数
只做一件事情,函数应该做一件事情。做好这件事情。只做这件事情。
如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是做了一件事。编写函数毕竟是为了把大一些的概念拆分为另一抽象层上的一系列步骤。
所以要判断函数是否不止做了一件事情,还有一个办法,就是看是否能在拆分有一个函数,该函数不仅只是单纯地重新诠释其实现。
每个函数一个抽象层级
自顶向下读代码:向下规则
2.用整理代码的决心替代创建废话的冲动。你会发现自己成为更优秀,更快乐的程序员。
3.对象和数据结构
隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象。类并不是简单地用取值器和复制器将其变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现就能操作数据本体。
看看代码清单6-3和6-4。前者使用具象层手段与机动车的原料层通讯,而后者则采用百分比抽象。你能确定前者里面的都是些变量存取器,而却无法得知后者中的数据形态。
具象机动车
public interface Vehicle{
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
抽象机动车
public interface Vehicle{
double getPercentFuelRemaining();
}
以上两段代码以后者为佳,我们不愿意暴露数据细节,更愿意以抽象形态表述数据。这并不是用接口或复制器就万事大吉。要以最好的方式呈现某个对象包含的数据,需要做严肃的思考,
4.单一全责原则
内聚
类应该只有少量实体变量。类中的每个方法都应该操作一个或多个这种变量。通常而言,方法操作的变量越多,就越聚到类上。如果一个类中的每个变量都被每个方法所使用,则该类具有最大的类聚性。
一般来说,创建这种极大化内聚类是不可取也不可能;另外一方面,我们希望内聚性保持较高位置。内聚性高,意味类中的方法和变量相互依赖,互相结合为有一个整体逻辑。
5.一定要时刻记住保持代码的整洁性。
6.函数名称应该表述其行为
如果你必须查看函数的实现(或文档)才知道它是做什么的,就该换个更好的函数名,或者重新安排功能代码,放到较好名称的函数中。
7.函数只做一件事情
8.函数应该只在一个抽象层级上
函数中的语句应该在同一个抽象层级上,该层级应该是函数名所示操作的下一个层。这可能是最难理解和遵循的启发。