界面和排错 王栋 2007.11.21
界面和排错 王栋 2007.11.21 2007.11.21
界面( Interface) 在造墙之前,我必须设法弄清 该把什么放在墙里,什么放在墙外, 最需要防御的又是什么 确实有些东西不喜欢墙 总希望它倒下来 Robert frost,《修墙》
界面(Interface) (Interface) 在造墙之前,我必须设法弄清 在造墙之前,我必须设法弄清 该把什么放在墙里,什么放在墙外, 该把什么放在墙里,什么放在墙外, 最需要防御的又是什么。 最需要防御的又是什么。 确实有些东西不喜欢墙, 确实有些东西不喜欢墙, 总希望它倒下来。 总希望它倒下来。 — Robert Frost, Robert Frost,《修墙》
什么是界面( nterface)? >界面就是接口( Interface 。向调用者隐藏实现细节 程序界面 类和函数的接口 自己用的小程序中无关紧要 。在提供给别人用的时候非常有意义的 用户界面 风格:简单性、清晰性、规范性、统一性、熟悉性和 严谨性 鲁棒性:保证在遇到坏的输入时本身不会受到损害
什么是界面(Interface) (Interface) ? ¾ 界面就是接口(Interface) (Interface) z 向调用者隐藏实现细节 ¾ 程序界面 z 类和函数的接口 类和函数的接口 z 自己用的小程序中无关紧要 自己用的小程序中无关紧要 z 在提供给别人用的时候非常有意义的 在提供给别人用的时候非常有意义的 ¾ 用户界面 z 风格:简单性、清晰性、规范性、统一性、熟悉性和 简单性、清晰性、规范性、统一性、熟悉性和 严谨性 z 鲁棒性:保证在遇到坏的输入时本身不会受到损害 保证在遇到坏的输入时本身不会受到损害
程序界面 团队合作 课程项目 公司项目 开源项目 目标:让别的程序员无障得地,安全地使 用你的代码。 类和函数的接口 错误处理
程序界面 ¾ 团队合作 z 课程项目 z 公司项目 z 开源项目 ¾ 目标:让别的程序员 目标:让别的程序员无障碍地、安全地 无障碍地、安全地使 用你的代码。 z 类和函数的接口 类和函数的接口 z 错误处理
类和函数的设计原则 单一功能原则( Single Responsibility Principle) 开放/封闭原则(Open/C| ose Principle) >最小惊讶原理( Least Surprise Principle) 完整且最小化( Complete and Minimal) >尽量使用 const >避免公共成员变量 尽量使用传址 如果用不到编译器缺省的成员函数,就明确的禁用它 分割命名空间 写一个好的头文件
类和函数的设计原则 类和函数的设计原则 ¾ 单一功能原则(Single Responsibility Principle) (Single Responsibility Principle) ¾ 开放 /封闭原则(Open/Close Principle) (Open/Close Principle) ¾ 最小惊讶原理(Least Surprise Principle) (Least Surprise Principle) ¾ 完整且最小化(Complete and Minimal) (Complete and Minimal) ¾ 尽量使用const ¾ 避免公共成员变量 避免公共成员变量 ¾ 尽量使用传址 ¾ 如果用不到编译器缺省的成员函数,就明确的禁用它 如果用不到编译器缺省的成员函数,就明确的禁用它 ¾ 分割命名空间 ¾ 写一个好的头文件 写一个好的头文件
类和函数的设计原则(1/10) 单一功能原则( Single Responsibility Principle 处理的事情太多的类是脆弱的。 比如,一个全文索引类 FullTextsearch,既要 读取数据、分词,又要建立倒排索引并写入磁 盘,还要读取磁盘文件并检索,太大,太臃胂 类应该只提供单一的功能 只有一个可能引起修改类代码的原因 拆分与合并
类和函数的设计原则 类和函数的设计原则(1/10) ¾ 单一功能原则(Single Responsibility (Single Responsibility Principle) Principle) z 处理的事情太多的类是脆弱的。 处理的事情太多的类是脆弱的。 z 比如,一个全文索引类 比如,一个全文索引类FullTextSearch FullTextSearch,既要 读取数据、分词,又要建立倒排索引并写入磁 读取数据、分词,又要建立倒排索引并写入磁 盘,还要读取磁盘文件并检索,太大,太臃肿 盘,还要读取磁盘文件并检索,太大,太臃肿 了。 z 一个类应该只提供 一个类应该只提供单一的功能 • 只有一个可能引起修改类代码的原因 只有一个可能引起修改类代码的原因 • 拆分与合并
举例:全文索引系统 Query Data source search Hits index analysis Indices store
举例:全文索引系统 举例:全文索引系统 index analysis search Indices store utility Data source Hits Query
类和函数的设计原则(2/10) >开放封闭原则(open/ Close Principle) 一个类应该对扩展开放,对修改关闭 。对新的功能的扩充,应该通过增加新类实现,而不是 修改已有类的代码 比如,boss让你编写一个计算中国个人所得税的计算 器产品,而有一天一个美国客户来了 好处 降低程序各部分之间的耦合性,使程序模块互换成为可 使软件各部分便于单元测试。 利于实现软件的模块的互换,软件升级时可以只部署发生变化 的部分,而不会影响其它部分
类和函数的设计原则 类和函数的设计原则(2/10) ¾ 开放 /封闭原则(Open/Close Principle) (Open/Close Principle) z 一个类应该对扩展开放,对修改关闭 一个类应该对扩展开放,对修改关闭 z 对新的功能的扩充,应该通过增加新类实现,而不是 对新的功能的扩充,应该通过增加新类实现,而不是 修改已有类的代码 修改已有类的代码 z 比如,boss让你编写一个计算中国个人所得税的计算 让你编写一个计算中国个人所得税的计算 器产品,而有一天一个美国客户来了 器产品,而有一天一个美国客户来了 … z 好处 • 降低程序各部分之间的耦合性,使程序模块互换成为可能。 • 使软件各部分便于单元测试。 • 利于实现软件的模块的互换,软件升级时可以只部署发生变化 的部分,而不会影响其它部分
类和函数的设计原则(3/10) >最小惊讶原理( Least Surprise Principle) 程序对用户的响应尽可能不使用户感到惊讶 重载函数,覆盖函数,或者子类实现父类虚函 数时,应该基本维持函数原来所期望的功能 class Cat: public Pet i public class Pet i void Talko{cout<<“喵! public virtual Talko class Dog: public Pet i public void Talko[ Sleep: 1
类和函数的设计原则 类和函数的设计原则(3/10) ¾ 最小惊讶原理(Least Surprise Principle) (Least Surprise Principle) z 程序对用户的响应尽可能不使用户感到惊讶 程序对用户的响应尽可能不使用户感到惊讶 z 重载函数,覆盖函数,或者子类实现父类虚函 重载函数,覆盖函数,或者子类实现父类虚函 数时,应该基本维持函数原来所期望的功能 数时,应该基本维持函数原来所期望的功能 class Pet { class Pet { public: public: virtual Talk() = virtual Talk() = 0; }; class Cat: public Pet { class Cat: public Pet { public: public: void Talk() { void Talk() { cout << “ 喵!"; } } class Dog: public Pet { class Dog: public Pet { public: public: void Talk() { Sleep(); } void Talk() { Sleep(); } }
类和函数的设计原则(3/10)cont 致性和规范性 。比如,STL容器类提供了非常一致的界面,这 样,即使面对一个不熟悉的函数,预计应该如 何使用它也会变得很容易
类和函数的设计原则 类和函数的设计原则(3/10) cont. (3/10) cont. ¾ 一致性和规范性 一致性和规范性 z 比如,STL容器类提供了非常一致的界面,这 容器类提供了非常一致的界面,这 样,即使面对一个不熟悉的函数,预计应该如 样,即使面对一个不熟悉的函数,预计应该如 何使用它也会变得很容易。 何使用它也会变得很容易