C++编程规范之36:优先提供抽象接口

简介:

摘要:

    偏爱抽象艺术吧:抽象接口有助于我们集中精力保证抽象的正确性,不至于受到实现或者状态管理细节的干扰。优先采用实现了抽象接口的设计层次结构。

应该定义和继承抽象接口。抽象接口是完全由(纯)虚函数构成的抽象类,没有状态(成员设计),通常也没有成员函数实现。在抽象接口中避免使用状态能够简化整个层次结构的设计。

    应该遵守依赖倒置原理(DependencyInversion Principle ,DIP):

   1.高层模块buy应该依赖于低层模块。相反,两者都应该依赖抽象。

   2 .抽象不应该依赖于细节。相反,细节应该依赖于抽象。

   遵守DIP意味着层次结构应该以抽象类而不是具体类为根。抽象基类必须负责定义功能,而不是实现功能。换言之,策略不应该上推,而应该实现下放。

  DIP设计的优点有:

   1.更强的健壮性。系统中较不稳定的部分(实现)依赖于更稳定的部分(抽象)。健壮的设计就是能够将修改限于局部的设计。相反,在一个脆弱的系统中,很小的修改也会以种种糟糕的方式传播到系统意料不到的部分去。包含具体基类的设计正是如此。

   2.更大的灵活性。基于抽象接口的设计通常更加灵活。如果能正确地建模抽象,那么就能很容易地针对新的需求设计新的实现。相反,依赖于许多具体细节的设计是很难改变的,因为新的需求将会导致核心性的修改。

   3.更好的模块性。依赖于抽象的设计,其模块性较好,因为它的依赖层次很简单:高度可变的部分依赖于稳定部分,而不是相反。相反,设计如果含有混合了实现细节的接口,就很可能会出现复杂的依赖网,这样一来,想要将这个设计作为一个单元插入到另一个系统中重新应用,就会变得困难。

   于此相关的二次机会定律是这样陈述的:需要保证正确的最重要的东西是接口。其他所有的东西以后都可以修改。如果接口弄错了,可能再也不允许修改了。

   通常,应该选择公用虚拟析构函数以允许多态删除,除非使用了诸如COM或者CORBA这样的对象代理,它们使用的是另一种内存管理机制。

   要对并非抽象接口的类进行多重继承时要多加小心。虽然使用了多重继承的设计具有很强的表达力,但还是很难保证正确,很容易出错。尤其是这种设计中的状态管理非常困难。

相关文章
|
6天前
|
设计模式 算法 测试技术
C++ 创建兼容多个IPC机制的上层接口
C++ 创建兼容多个IPC机制的上层接口
61 1
|
6天前
|
自然语言处理 算法 Java
C/C++ 程序员编程规范之注释
C/C++ 程序员编程规范之注释
48 1
|
6天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
21 1
|
6天前
|
存储 算法 测试技术
|
6天前
|
程序员 编译器 C++
|
6天前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
5 0
|
6天前
|
算法 C++ 容器
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
12 0
|
6天前
|
C++
【C++】string类(介绍、常用接口)
【C++】string类(介绍、常用接口)
18 2
|
6天前
|
C语言 C++ 容器
探索c++:string常用接口 迷雾
探索c++:string常用接口 迷雾
43 0
|
6天前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。