接續上篇,本文深入剖析「封裝」的真實含義,揭露 Getter/Setter 反模式,確立包裝類設計模式,闡述面向物件架構的核心原則。
SpinInPlace()),破壞架構清晰度。教科書典型錯誤範例:
class Person {
private: char m_Name[20]; unsigned long m_Age; bool m_Sex;
public: const char* GetName() const; void SetName(const char*);
unsigned long GetAge() const; void SetAge(unsigned long);
bool GetSex() const; void SetSex(bool);
};
三大謬誤:
#define private public、強制轉型、相容結構體繞過 private。Person 若為資料庫緩衝區,本質是「箱子」,不應有 Get/Set;若為領域模型,行為應為 ChangeName、Promote 等業務動作。MFC CFile 封裝「檔案操作」而非「檔案資料」:
class CFile {
HANDLE m_hFile; // 被封裝資源句柄
public:
void Open(...); // 被動功能:被開啟
void Close(); // 被動功能:被關閉
void Read(...); // 被動功能:被讀取
void Write(...); // 被動功能:被寫入
};
封裝定義: 將**對某資源的一組操作**集合視為一種新資源,映射為**包裝類**。
m_hFile),操作時透過引用轉發。CFile f; 初始無效,Open 綁定,Close 解綁,物件存活。Tiger::Eat(Rabbit&):老虎主動功能,涉及兩資源。RabbitWrapper::BeEaten():兔子包裝類封裝「被吃」操作,單一資源。設計類時,若映射領域概念,邊界以領域為準,勿因演算法需求添加錯誤成員。
理解封裝本質,避免 Getter/Setter 濫用,掌握包裝類模式,才能設計出高內聚、低耦合、語義豐富的 C++ 系統。