切記將成員變量聲明為 private。 這不僅是封裝的體現,更賦予了類設計者對實現細節的完全控制權。
若成員變量為 public,客戶代碼需區分「讀取變量」和「調用函數」:
class AccessLevels {
public:
// 無訪問:完全隱藏
// int noAccess; // 無 getter/setter
// 只讀:僅提供 const getter
int getReadOnly() const { return readOnly; }
// 讀寫:提供 const getter + 非 const setter
int getReadWrite() const { return readWrite; }
void setReadWrite(int v) { readWrite = v; }
// 唯寫:僅提供 setter(罕見但可行)
void setWriteOnly(int v) { writeOnly = v; }
private:
int noAccess;
int readOnly;
int readWrite;
int writeOnly;
};
這種細粒度控制對不變量維護、線程安全、數據驗證至關重要。
若 data 為 public,未來想改為「計算得出」或「添加日誌/驗證/同步」,所有客戶代碼都會崩潰。
// 貧血模型:只有數據無行為,業務邏輯散落在服務層
class Order {
public:
int id;
double amount;
int status; // 0=新建 1=支付 2=發貨 3=完成
};
// 業務邏輯分散,難以維護狀態機不變量
void pay(Order& o) { if(o.status==0) o.status=1; }
void ship(Order& o) { if(o.status==1) o.status=2; }
充血模型:封裝狀態機,保證不變量: