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

第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-08-26 05:07:40

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

代码大全学习笔记(什么是构建)

  构建有时也被认为是"coding"或者"programing".编码算不上是最贴切的词,因为它有一种"把已经存在的设计机械化的翻译成计算机语言"的意味,而构建并不是机械化的,需要可观的创造力和判断力,人们常常用编程代替构建.   构建的步骤: 1.验证前面的工作已经完成(如定义问题,需求分析). 2.确定如何去测试所写的代码. 3.设计并编写类或者子程序. 4.创建并命名变量和具名常量. 5.选择控制结构,组织语句块. 6.对你的代码进行单元

代码大全学习笔记(四):第7章--设计高质量的子程序

1. 子程序是为实现特定目的而编写的一个可被调用的方法(method)或过程(procedure),例如c++中的函数.java中的方法 子程序避免代码段重复,提高代码可读性,同时方便代码改动 2. 好的子程序名字 (1)   避免使用无意义.模糊不清的动词,例如processInput() (2)   根据需要确定子程序名字的长度,以清晰易懂为标准 (3)   子程序名称一般为 动词加宾语的形式 (4)   准确使用对仗词提供完整接口 3. 子程序的最佳长度 理论上最佳长度为50-150行,一

代码大全学习笔记(二):第4-5章

1. 主要的构建实践 2. 软件构建中的设计是一个确定取舍和调整顺序的过程,处处都有tradeoff 3. 软件的首要技术使命就是 管理复杂度 将整个系统分解为多个子系统,子系统高内聚.低耦合,尽量减少在特定时间段所面临的复杂度,从而减少脑力负担 4. 高质量设计的具体特征: (1)   最小的复杂度:简洁.易于理解 (2)   易于维护:编程规范:命名.注释等 (3)   松散耦合 高内聚:类接口合理抽象.封装.信息隐藏 低耦合:减少各组成部分之间的关联 (4)   可扩展性 (5)   可重

代码大全学习笔记(一):第1-3章

1. 本书全面阐述 软件构建活动的方方面面 2. 软件开发过程中的各种活动: (1)   定义问题 (2)   需求分析 (3)   规划构建 (4)   软件架构 (5)   详细设计 (6)   编码与调试 (7)   单元测试 (8)   集成测试 (9)   集成 (10)  系统测试 (11)  保障维护 3. 发现错误的时间要尽可能接近引入该错误的时间 4. 软件开发两种方式: (1)迭代式开发:需求不稳定或理解暂时不透彻,变动较多 (2)序列式开发:需求比较稳定,长期可预测性 5.

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

C++学习笔记之作用域为类的常量和作用域内的枚举

一.作用域为类的常量 有些情况下,使符号常量的作用域为类很有用.如,类声明(不是定义)可能使用字面值30来指定数组长度,由于该常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错的主意,也许我们想像下面这样做: 1 class Weather 2 { 3 private: 4 const int Months = 12; //声明一个常量 5 double temperature[Months]; 6 ... 7 } 要注意的是,我们这是在声明阶段,需要在声明类的时候就有一个

java学习笔记07--日期操作类

java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. [java] view plaincopy public class T { public static void main(String[] args) { Date date  = new Date(); System.out.println("当前日期:"+date); //当前日期:Thu May 16 23:00:57 CST 

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

代码大全读书笔记 - 开篇

说起来,<代码大全>这本书书名实在恶俗.在我推荐给展鸿的时候,他说"雾草,这名字看着就像天朝地摊那种XX全书一类的山寨书-" 是的,其实买这个书的原因就是京东买100减30,我买了10块钱的东西,凑了一下单,书到手之前还以为是代码清单,或者以前ACM模板一样的书,甚至买来的一个月里面都拿来当枕头(足足10+cm厚). 这个周末偶然的翻开,才发现,世界上竟然有如此精彩的书,而且很多东西讲的虽然是软件项目,但给了我很多引申到其他东西上面的灵感.很多地方我读到之后,都会兴奋的心跳