读书笔记--类的抽象【图文】

     如果你无法让初学者明白一件事,说明你没有真正弄懂它。
       
       类是一种抽象数据类型 抽象数据类型是指一些数据以及对这些数据所进行的操作的集合。 抽象数据类型可愿意让你像现实世界中一样操作实体,而不是在底层的实现上摆弄实体。 这是令人兴奋的!你不必在队列中插入一个节点或删除一个节点了,而是添加一个员工记录、删除一个员工记录。你不是在改变一个整型变量的值,而是在换另一支不同颜色的画笔或另一支笔画更粗的画笔。                  

          前面说过:抽象数据类型可愿意让你像现实世界中一样操作实体,而不是在底层的实现上摆弄实体。即类是对现实中实体的抽象。操作实体我们说是实体所支持的操作。比如画笔可以画线条、曲线、虚线和各种形状的图型。而实体所支持的操作依赖于实体的属性。画笔有颜色才能画出线条,画笔笔头有宽度才能画出一定宽度的线条。这样我们又得出实体的属性。实体的属性和所支持的操作在面向对象中叫属性和所暴露的接口。我们说一个类暴露了什么接口就是说这个类所代表的实体类型支持什么操作。   

对应关系为:       
       实体:属性,所支持的操作;       
       类: 属性,所暴露的接口;       
进一步简化为:                
       实体:属性,操作;                
        类:  属性,接口;

 
有些环境也把接口称作方法、函数。 


我们只关注需要的属性和接口:
   现实中的实体总有多种属性和支持的操作,而在程序中我们只关注我们需要的属性。假如要实现一个画图软件。我们根据现实中的画笔抽象出画笔类。我们只关注画笔的颜色,画出线条的粗细。我们肯定不会关心现实中画笔的笔杆长度,笔杆的粗细。也不会关心现实中的画笔可以当奶嘴啃。
   我们抽象出的画笔类肯定是这样的
     


   而不是这样的:
     
   
   设计良好的类应遵循的原则:
   a类的接口应表现出相关性(内聚):

   一个类应该暴露出一组相近的接口。比如手机类的接口可能是:打电话、接电话,发短信、收短信。这几个功能是相近的,这很好理解。而不是打电话,收发短信,剪指甲。这里剪指甲和打电话明显不是相近的操作,所以不要放在一个类中。(你能想象一个手机上带着一个指甲剪的功能是多么怪异吗?一只猫身上长了一只手也同样怪异)

谁随着时间的推移,你会对这只手的作用的产生疑惑。

   
   b.类的接口应该处于相同的抽象层次:
   我不知道怎么告诉你什么是相同的抽象层次。我这能给你打比方。比如我们用磁盘文件保存员工的信息记录。打开文件,关闭文件,修改文件是一个抽象层次。而增加员工记录,删除员工记录,更新员工记录是另一个抽象层次。打开文件和增加员工记录明显不是同一抽象层次。
   在一个时刻只思考同一层次的问题能使问题更有条理。在增加员工记录时不要考虑访问文件的问题。
   一个设计糟糕的员工管理系统:
     接口:
          增加员工记录
          删除员工记录
          更新员工记录
          打开文件
          修改文件
          关闭文件


      一个设计良好的员工管理系统:
      接口:
      增加员工记录
      删除员工记录
      更新员工记录


   把打开文件、修改文件和关闭文件的操作放到另一类中,或者不暴露出来。
       对应于C++的中的类,增加员工记录、删除员工记录、更新员工记录应该是类的public程序函数,而打开文件、修改文件和关闭文件应该放在另一类中或是private程序函数,或者包含在public程序函数的函数体中。

        掌握上面两个原则是设计好类的第一步。


       参考《代码大全》,个人认为该书上这部分提到的其他原则都是为了维护这两条原则。

你可能感兴趣的:(读书笔记--类的抽象【图文】)