前言:
眼前姐妹们对“封装复杂接口简单”都比较注意,看官们都想要了解一些“封装复杂接口简单”的相关文章。那么小编也在网络上网罗了一些有关“封装复杂接口简单””的相关知识,希望姐妹们能喜欢,朋友们一起来学习一下吧!如何创建一个质量高的类,最重要的是创建一个好的接口。
▍好的抽象与差的抽象
抽象是一种以简化的形式来看待复杂操作的能力。类的接口为隐藏在其背后的具体实现提供了一种抽象。
比如一个Employee的类,包括了雇员的一些信息(C++的类),下面是一个体现抽象的类的设计:
class Employee {public: //public constructors and destructors Employee(); Employee( FullName name, String address, String workPhone, String homePhone, TaxId taxIdNumber, JobClassification jobClass ); virtual ~Employee(); FullName GetName() const; String GetAddress() const; String GetWorkPhone() const; String GetHomePhone() const; TaxId GetTaxIdNumber() const; JobClassification GetJobClassification() const; ... private: ...};
通过上面的接口,程序员就可以了解这个类可以做些什么事,可以对它进行一些什么样的操作。
如果是一个抽象很差的类,就会像下面这样:
class Program { public: ... // public routines void InitializeCommandStack(); void PushCommand( Command command ); Command PopCommand(); void ShutdownCommandStack(); void InitializeReportFormatting(); void FormatReport( Report report ); void PrintReport( Report report ); void InitializeGlobalData(); void ShutdownGlobalData(); ... private: ...};
▍创建抽象接口的指导意见
类的接口应该展现一致的抽象层次
把类看成一种用来实现抽象数据类型的机制,每个类应该实现一个ADT,并且仅实现这个ADT。下面这个例子,就是抽象的层次不一致:
一定要理解类所实现的抽象是什么
必须仔细地理解接口应该捕捉的抽象是哪一个。
提供成对的服务
有开就有关,有插入就要有删除
把不相关的信息转移到其它类中
如果一个类中一半方法用了一关的属性,而另一半方法用了另一半的属性,这时就说明你需要把这个类拆成两个类了。
尽可能让接口可编程,而不是表达语义
每个接口都有一个可编程部分和一个语义部分组成。
谨防在修改时破坏接口的抽象
修改的时候要严格控制接口的抽象层次
不要添加与接口抽象不一致的公用成员
保持抽象的完整性。
同时考虑抽象性与内聚性
抽象与内聚基本保持一致性,
▍类的封装
封装是一个比抽象更强的概念,抽象通过提供一个可以忽略细节的模型管理复杂度,而封装则强制阻止看到细节。
尽可能地限制类和成员的可访问性不要公开暴露成员数据避免把私有的实现细节放入类的接口中
下面类暴露了内部细节:
下面是隐藏了实现细节:
不要对类的使用者做任何假设避免使用友元类让阅读代码比编写代码更方便要格外警惕从语言上破坏封装留意过于紧密的耦合关系
程序员们,请克制敲代码的冲动!
每个程序员都想做系统设计,可是你做得了吗?
程序员,不要一上来就开始敲代码!
系统设计其实很简单,只要掌握这五步就可以!
抽象数据类型都不懂?那谈系统设计都是扯淡!
标签: #封装复杂接口简单