PLOOC模板學習筆記(一)——PLOOC的設計思維和哲學

原文地址:https://github.com/GorgonMeducer/PLOOC

介紹

PLOOC是使用ANSI-C(又名PLOOC ['plu:k])進行的受保護的低開銷面向對象編程,它是一組經過精心修飾的C宏模板,這些模板可:

  • 爲私有class成員提供保護

注意:可以通過定義宏__OOC_DEBUG__來禁用保護,以方便調試。

  • 支持受保護的成員
  • 支持多重繼承
  • 支持實現接口
  • 在某些編譯器中支持嚴格的類型檢查/驗證,例如啓用了多文件編譯的IAR。
  • 符合ANSI-C99
    還支持ANSI-C90,但私有功能保護已禁用。
  • 支持超載
    需要C11 或者 _Generic
  • 低開銷

注意:幾乎零開銷。該模板充分利用了ANSI-C強制執行的編譯規則,以最低的成本提供了所需的OO功能。

- Suitable for both bare-metal and RTOS.
- Suitable for both 8bit and 32bit MCU

是什麼使PLOOC與其他OOC有所不同?

OOC的概念並不新鮮。有很多庫,SDK,模板,它們提供了面向對象的ANSI-C語言編程擴展。儘管PLOOC在代碼大小和性能上都強調了其低開銷功能,但是許多基於宏模板的ooc解決方案也具有低開銷。PLOOC不會強制您使用堆或池進行內存管理,它不提供GC功能。它只是將這些選項留給用戶使用,因此它甚至適用於8位系統。好吧,您可以將此作爲PLOOC的缺點。我不想爲此爭論。

那麼,真正使PLOOC與衆不同的是什麼?它僅僅是另一個重新發明的輪子嗎?

答案是不。當然。PLOOC帶來了其他大多數人所沒有的獨特功能。它使class的私有成員真正成爲私有,即受保護的。因此,將阻止類源代碼之外的用​​戶訪問私有成員。他們看到的將是固態存儲器,即使用字節數組創建的掩碼。由於類是由C中的結構模仿的,因此PLOOC中的類是使用masked-structure實現的。正如人們所期望的那樣,只有類源代碼才能訪問私有成員,只有派生類的類源代碼才能訪問基類的受保護成員,每個人都可以訪問公共成員。

怎麼會這樣 您可能已經簡單地通過“ masked-structure”一詞弄清楚了。正如您所注意到的,它可能不過是頭文件中一個花哨的類型欺騙技巧。在遇到一些嚴格的類型檢查編譯器之前,類型作弊技巧很有效。最著名(臭名昭著)的是啓用了多文件編譯模式的IAR。沒有類型欺騙可以從IAR多文件編譯模式的血腥斧頭中倖存下來。

//! the original structure in class source code
struct byte_queue_t {
    uint8_t   *pchBuffer;
    uint16_t  hwBufferSize;
    uint16_t  hwHead;
    uint16_t  hwTail;
    uint16_t  hwCount;
};

//! the masked structure: the class byte_queue_t in header file
typedef struct byte_queue_t {
    uint8_t chMask [sizeof(struct {
        uint8_t   *pchBuffer;
        uint16_t  hwBufferSize;
        uint16_t  hwHead;
        uint16_t  hwTail;
        uint16_t  hwCount;
    })];
} byte_queue_t;

爲了使其工作,我們必須確保類源代碼不包括其自己的接口頭文件。您甚至可以這樣做…如果您對內容很認真

//! the masked structure: the class byte_queue_t in header file
typedef struct byte_queue_t {
    uint8_t chMask [sizeof(struct {
        uint32_t        : 32;
        uint16_t        : 16;
        uint16_t        : 16;
        uint16_t        : 16;
        uint16_t        : 16;
    })];
} byte_queue_t;

PLOOC通過類型欺騙以外的其他方案提供“私有保護”功能,因此它支持啓用了C99功能的幾乎所有C編譯器。作爲作者,我不得不承認,我花了很多時間才弄清楚如何處理嚴格類型檢查,並且最初的方案是醜陋的和違反直覺的。多虧了SimonQian所做的鼓舞人心的貢獻,我花了3個月的時間才使PLOOC變得優雅而簡單。HenryLong的支持也至關重要。

我希望您能喜歡這種獨特的嘗試,以應對面向對象的編程挑戰。

如果您有任何疑問或建議,請隨時告訴我們。

貢獻


模板

module Contrinutor
plooc.h GorgonMeducer
plooc_class.h GorgonMeducer, Simon Qian
plooc_class_strict.h GorgonMeducer
plooc_class_back_box.h GorgonMeducer
plooc_class_simple.h Simon Qian
plooc_class_simple_c90.h GorgonMeducer

例子

module Contrinutor
如何定義一個 class GorgonMeducer
如何訪問受保護的成員 GorgonMeducer
如何實現多態 GorgonMeducer

使用PLOOC的應用程序/項目

[VSF] [ https://github.com/vsfteam/vsf ]
[GMSI] [ https://github.com/GorgonMeducer/Generic_MCU_Software_Infrastructure ]

如何使用


PLOOC的示例

介紹

爲了說明PLOOC如何簡單易用,提供了一些示例來演示新OOPC方法的不同方面。當前,可用示例爲:

  • byte_queue
  • enhanced_byte_queue

更多示例將在以後添加…

示例1:如何定義一個類

這個例子說明

  • 如何定義一個class
    • 如何添加私有會員
    • 如何添加受保護的成員
  • 如何訪問class成員
  • 如何定義用戶友好接口

示例2:如何訪問受保護的成員

  • 如何從基類繼承
    • 如何訪問從基繼承的受保護成員
  • 如何繼承接口
  • 如何覆蓋基本方法

示例3:如何實現重載

  • 如何使用PLOOC實現重載
    • 需要C11支持
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章