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支持

猜你喜欢

转载自blog.csdn.net/sinat_31039061/article/details/105982613