《代码大全》学习笔记 可以工作的类

第6章 可以工作的类

//针对如何创建高质量的类,提供一些精辟的建议。

类的基础

1.类的基础:抽象数据类型

要理解面向对象编程,首先要理解ADT。

2.使用ADT的益处

可以隐藏实现细节;
改动不会影响到整个程序;
让接口能提供更多信息;
更容易提高性能;
让程序的正确性更显而易见;
程序更具自我说明性;
无需在程序内到处传递数据;

3.使用ADTs的指导建议:

把常见的底层数据创建为ADT并使用这些ADT,而不再使用底层数据
把文件这样的常用对象当成ADT
简单的事物也可当作ADT
不要让ADT依赖于其存储介质

良好的类接口

//创建高质量的类,第一步,可能也是最重要的一步,就是创建一个好的接口。

3.创建类的抽象接口的一些建议:

类的接口应该展现一致的抽象层次
一定要理解类所实现的抽象是什么
提供成对的服务
把不相关的信息转移到其它类中
尽可能让接口可编程,而不是表达语义
谨防在修改是破坏接口的抽象
不要添加与接口抽象不一致的公用成员
同时考虑抽象性和内聚性

4.良好的封装:

尽可能限制类和成员的可访问性
不要公开暴露成员数据
避免把私用的实现细节放入类的接口中
不要对类的使用者做出任何假设
避免使用友元类
不要因为一个子程序里仅使用公用子程序,就把它归入公开接口
让阅读代码比编写代码更方便
要格外警惕从语义上破坏封装性
留意过于紧密的耦合关系

“关注类的接口所表现出来的抽象,比关注类的内聚性更有助于深入的理解类的设计。”

有关设计和实现的问题

5.包含(has a “有一个 ”的关系):

包含是一个非常简单的概念,它表示一个类含有一个基本数据元素或对象。包含是面向对象编程的主力技术。

通过包含实现“有一个(has a)”的关系
在万不得已时通过private继承来实现“有一个”关系
警惕有超过7个数据成员的类

6.继承(is a “是一个 ”的关系):

用public继承实现“是一个(is a……)”的关系
要么使用继承并进行详细的说明,要么就不要用它
遵循Liskov替换原则(派生类必须能通过基类的接口而被使用,且使用者无需了解两者之间的差异)
确保只继承需要继承的部分
不要“覆盖”一个不可覆盖的成员函数(即:派生类中的成员函数不要与基类中不可覆盖的成员函数重名)
把共用的接口、数据和操作放到继承树中尽可能高的位置
只有一个实例的类是值得怀疑的
只有一个派生类的基类也是值得怀疑的
派生后覆盖了某个子程序。但在其中没做任何操作,这种情况也值得怀疑
避免让继承体系过深
尽量使用多态,避免大量的类型检查
让所有数据都是private(而非protected)
7.
要么使用继承并进行详细的说明,要么就不使用它。使用继承程序增加复杂度,是一种危险的技术,要尽量少用。

总结

  • 类的接口应提供一致的抽象。很多问题都是由于违背该原则而引起的。
  • 类的接口应该隐藏一些信息——如某个系统接口、某项设计决策、或者一些实现细节。
  • 包含往往比继承更为可取——除非你要对“是一个/is a”的关系建模。
  • 继承是一种有用的工具,但它却会增加复杂度。
  • 类是管理复杂度的首选工具。
时间: 2024-12-21 03:08:38

《代码大全》学习笔记 可以工作的类的相关文章

Ruby简洁学习笔记(二):类继承、属性、类变量_ruby专题

1.如何声明一个子类 复制代码 代码如下: class Treasure < Thing 这样Thing类中的属性name,description都被Treasure继承 2.以下三种方式传入父类initialize方法的参数分别是什么? 复制代码 代码如下: # This passes a, b, c to the superclass def initialize( a, b, c, d, e, f ) super( a, b, c ) end # This passes a, b, c t

php编程代码规范学习笔记(适合初学者)(1/2)

命名规范 Θ 类文件都以.class.php为后缀,使用驼峰法命名,并且首字母大写,例如 Pay.class.php; Θ 类名和目录_文件名一致.例如:类名Zend_Autoloader的目录是Zend/Autoloader.class.php; Θ 函数的命名使用小写字母和下划线的方式.例如:get_client_ip; Θ 方法的命名使用驼峰法,首字母小写或者使用下划线"_",例如listComment(),_getResource(),通常下划线开头的方法属于私有方法; Θ 属

ruby学习笔记(4)-动态修改类的属性

动态语言之所以"动态",最明显的特征就是:类实例的行为/属性可以在new出后,动态修改!个人觉得这种处理相对java/c#(静态语言)来说,更符合现实世界. 比如:一个人刚出生时,除了哭.吃奶等这些基本原始本能,其它的几乎全都不会(原始本能可理解类定义中最开始定义的属性和方法),但随着时间推移,学会了看书,走路,说话...(相当于新增了方法/属性),再往后的人生谁也无法预料,一切都是未知的,所以不太可能象静态语言那样,在运行前就事先把所有的属性/方法全写齐,甚至一个人后来失忆,把原先学

PHP学习笔记 用户注册模块用户类以及验证码类_php技巧

所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友. :User类,包括读取和设置数据库,以及保存更改交互 复制代码 代码如下: <?php class User{ private $uid; private $fields; public function __construct(){ $this->uid=null; $this->fields=array('username'=>'','password'=>'','emailAddr'=>''

Java学习笔记之对象与类(1/3)

一.类 类(class)是构造对象的蓝图或模板.由类构造(construct)对象的过程就是创建类的实例(instance)的过程. 封装(encapsulation)是与类有关的一个重要概念.形式上来说,封装是把数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.对象的数据称为实例域(instance field),操作数据的过程称为方法(method). 继承(inheritance)使得Java中的一个类可以通过拓展另一个类而来.实际上,Java中所有的类都是继承了一个最原始的

Android学习笔记(37):用Configuration类获取和监听设备信息

Configuration类用于描述手机设备上的配置信息.有时候我们的app需要获取手机的系统信息,并根据手机的信息来调整我们的app,这时候我们就需要用到Configuration类.   (1)获取Configuration对象 调用Activity的方法获取系统的Configuration对象: Configuration config = getResources().getConfiguration();   (2)获取设备系统信息 在获取了Configuration对象之后,直接访问

javascript常用的代码片段(学习笔记)

获取DOM对象    代码如下 复制代码 function getel(e) {     if (document.getElementById) {         return document.getElementById(e);     } else if (document.all){         return document.all[e];     } } xmlHttp  代码如下 复制代码 //定义方法 获取XMLHttpRequest对象 function ajaxLoa

TEX学习笔记

整理在这里, 方便以后容易查找. 毕竟每个tex的模板有些不一样.   Beamer: Latex beamer 学习总结 http://blog.sina.com.cn/s/blog_6cf921f30101aq0g.html  Beamer 主题选择: http://deic.uab.es/~iblanes/beamer_gallery/       https://latex.simon04.net/   Tex arrows: http://www.sascha-frank.com/Ar

《代码大全》学习笔记(1):欢迎进入软件创建世界

写在前面:          它山之石,可以攻玉!        <代码大全>是编程领域里的一本经典书籍,全书介绍了基本数据类型.变量命名.子程序和函数的编写.编程工具以及调试等内容.全书内容翔实.实用性强,特别适合刚入门或即将入门的程序员学习.该书对于良好编程习惯的养成具有极大的促进作用!         本系列文章是我在阅读<代码大全>过程中的学习笔记,基本上是按照原书的章节顺序进行编排的.在每一章的最后还有个人学习小结,供大家参考.希望大家能够从这本经典的书籍中受益,写出高质