首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

空物件模式探討:優雅處理「無意義物件」的返回問題

     編輯:關於C語言

問題場景

函式需返回物件引用,但索引可能無效:

const Layer& Frame::GetLayer(uint32 layerIndex) const {
    if (CheckLayerIndexValid(layerIndex))
        return m_layers[layerIndex];
    return ?; // 返回什麼?引用不能為 null
}

常見替代方案

  1. 返回指標:const Layer*,無效返回 nullptr。呼叫端需檢查。
  2. 輸出參數 + bool 返回:bool GetLayer(..., Layer& out)。語意清晰,但調用較繁瑣。

空物件模式 實作嘗試

嘗試保持引用返回,引入 Nullable<T> 基類,提供靜態空物件單例:

template<class T>
class Nullable {
protected: Nullable() {} virtual ~Nullable() {}
public:
    static boost::shared_ptr<T>& NullPtr() { static boost::shared_ptr<T> p(Null()); return p; }
    bool IsNull() { return this == ms_null; }
private:
    static T* Null() { if (!ms_null) ms_null = new T; return ms_null; }
    static T* ms_null;
    static boost::shared_ptr<T> ms_nullPtr;
};

class Layer : public Nullable<Layer> { /* ... */ };

使用:return *Layer::NullPtr();,呼叫端需檢查 IsNull()。

模式局限與反思

  • 引用語意破壞:引用隱含「必指向有效物件」,返回空物件違反契約,易誤導呼叫端忘記檢查。
  • 執行時檢查負擔:將編譯期類型安全推延至執行期,增加認知負荷。
  • 適用場景受限:僅適合「查無此物為正常業務流程」(如 Manager 查找),不適用於「索引無效屬程式錯誤」的情境(斷言/拋異常更佳)。

現代 C++ 更佳選擇

  • std::optional<Layer> (C++17):明確表達「可能無值」,強制呼叫端處理,零開銷抽象。
  • std::expected<T, E> (C++23):攜帶錯誤資訊。
  • 若效能極度敏感且確定無效極少:返回指標 + 契約文檔(// Returns nullptr if not found)。

總結

空物件模式在特定領域(如 GUI 空控制項、策略模式預設策略)有價值,但不建議用於通用容器查找的引用返回。現代 C++ 提供 std::optional 等標準工具,能以類型系統保證安全,應優先採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved