大多数面向对象程序设计都提倡封装:我们应该隐藏实现细节的类,尽可能减少对象之间的耦合。但在C ++(包括其他编译语言),我们还需要关心其他方面的设计。如何才能做到这一点呢?
一个普通类的例子:
#include "Engine.h" #include "Gearbox.h" #include "..." #include "Wheels.h" class Car { private: Engine m_engine; Gearbox m_gearbox; Wheels m_wheels; public: Car() { } virtual ~Car() { } void drive() { } private: void checkInternals(); }
假设它的逻辑设计是不错的,那该类相关的物理设计方面的问题是什么?
第一:如果我们在Engine类中添加一个方法吗?不仅Car.cpp将必须重新编译(当然这是预期),调用Car的客户端也要重新编译。
第二:如果我们对Car类的Private域添加或修改方法,这样,客户端也必须重新编译。
对于小项目来说重新编译是可以的,但是对于大项目,编译的时间将会很长。对于使用Car的客户类真的要重新编译吗?可以使用下面的方法来避免编译:
class Engine; class Gearbox; class Wheels; class Car { private: std::unique_ptr<Engine> m_engine; std::unique_ptr<Gearbox> m_gearbox; std::unique_ptr<Wheels> m_wheels; public: Car(); virtual ~Car(); void drive(); private: void checkInternals(); }
或者
class Car { private: std::unique_ptr<class CarImpl> m_pImpl; public: Car(); virtual ~Car(); void drive(); // private methods 'moved' to source file... }
推荐书籍《Large-Scale C++ Software Design, by John Lakos》