《C++代码设计与重用》——2.1 抽象性

简介:

本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第2章,第2.1节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.1 抽象性

C++代码设计与重用
2.1 抽象性
每一个C++类—不论可重用与否—都应该表示某种抽象。例如类Rational可以表示有理数的集合,类Car可以表述车的概念,类Parser可以表述C++解析器的概念。当设计一个类的时候,我们要做的第一件事就是定义类所要表述的抽象。

一旦定义了类要表述的抽象,我们就可以有代表性地用某种方法来实现这个抽象。例如,我们可以这样来实现Rational类,定义两个整数,并且要求第二个整数不能为零。

class Rational {
    private:
              int num;
              int denom;
    pub1ic:
              //...
    };

或者,我们可以通过十进制反复展开的方法来表述一个有理数1。

将类的抽象从它的实现分开是很有裨益的。理由有二。第一,简化了类的抽象。当对类进行抽象的时候,我们会忽略那些对当前设计目的不重要的细节。譬如对Car驾驶者而言,诸如车的划痕数量、凹痕数量和是否有小的后备仓等细节就显得无关紧要了。因此对Car抽象的完整描述就不应该包含这些细节,Car驾驶者也会把这些细节抛于脑后。另外,类的文档化抽象是类的设计者和使用者之间契约的一部分。可以说,类的抽象越简单,所有团体对这个契约的解释越趋向一致。

第二,把抽象从实现分开,将使抽象的实现更富有灵活性。例如,某个程序库可能提供了上面所述的类Rational的两种实现方法。但是,如果我们把抽象从实现分开,并且程序库不提供上面任何一种实现方法,只是提供类Rational的设计方法;那么,用户就可以很容易地提供他们自己的实现方法。

恰如类应该表述抽象一样,函数也应该表述某种抽象行为。这就是说,几乎每个函数的语义都应该只根据操作对象的抽象值来定义。考虑下面的函数:

Rational operator*(const Rational& r, const Rational& s);

如果这个函数要实现乘法运算,我们可以这样来定义它的语义:

Return the product of r and s.(返回r和s的乘积)。

请注意这个语义的定义,它并没有提及返回的Rational中的num和denom是否会以简化形式存在(就是说,当num和denom的值本应分别为3和1的时候,它们是否会相应地以9和3这种非简化形式存在;对这点,这个语义并没有说明)。实际上,关于Rational是由num和denom来表述的这个细节,并不属于抽象的一部分。

1即把一个有理数展开成千位、百位、十位、个位和小数位等,然后用各个位上的数字来表述这个有理数。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
4天前
|
存储 缓存 算法
《C++ Concurrencyin Action》第8章--并发代码设计
《C++ Concurrencyin Action》第8章--并发代码设计
|
数据可视化 C++ Windows
非可视化编程的windows窗口 C++ 代码设计:附例程并多多知识点
非可视化编程的windows窗口 C++ 代码设计:附例程并多多知识点
175 0
|
4天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
18 0
|
2天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算