嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践

一、面向对象编程(OOP)

尽管 C 语言并非面向对象编程语言,但借助一些编程技巧,也能实现面向对象编程(OOP)的核心特性,如封装、继承和多态。

image.png

1.1 封装

封装是把数据和操作数据的函数捆绑在一起,对外部隐藏内部实现细节。在嵌入式 C 语言中,可通过结构体和函数指针来实现封装。

#include <stdio.h>

// 定义一个LED结构体
typedef struct {
    int pin;
    void (*turnOn)(struct LED*);
    void (*turnOff)(struct LED*);
} LED;

// 实现LED开启函数
void ledTurnOn(LED* led){
    printf("LED on pin %d is turned on.\n", led->pin);
}

// 实现LED关闭函数
void ledTurnOff(LED* led){
    printf("LED on pin %d is turned off.\n", led->pin);
}

// 初始化LED
void ledInit(LED* led, int pin){
    led->pin = pin;
    led->turnOn = ledTurnOn;
    led->turnOff = ledTurnOff;
}

int main(void){
    LED myLed;
    ledInit(&myLed, 13);
    myLed.turnOn(&myLed);
    myLed.turnOff(&myLed);
    return0;
}

844d340c655e33f2b963e0810e02de27.png

LED结构体封装了pin数据和turnOn、turnOff函数指针。ledInit函数用于初始化LED结构体,把具体的函数赋值给函数指针。外部代码仅能通过这些函数指针来操作LED,而无需了解内部实现细节。

1.2 继承

继承是指一个对象直接使用另一对象的属性和方法。在嵌入式 C 语言中,可通过结构体嵌套实现继承。

#include <stdio.h>

// 定义一个基类结构体
typedef struct {
    int id;
    void (*printInfo)(struct Base*);
} Base;

// 实现基类的打印信息函数
voidbasePrintInfo(Base* base){
    printf("Base ID: %d\n", base->id);
}

// 定义一个派生类结构体
typedef struct {
    Base base; // 继承Base结构体
    char* name;
} Derived;

// 实现派生类的打印信息函数
void derivedPrintInfo(Derived* derived){
    basePrintInfo(&derived->base);
    printf("Derived Name: %s\n", derived->name);
}

// 初始化基类
void baseInit(Base* base, int id){
    base->id = id;
    base->printInfo = basePrintInfo;
}

// 初始化派生类
void derivedInit(Derived* derived, int id, char* name){
    baseInit(&derived->base, id);
    derived->name = name;
    derived->base.printInfo = (void (*)(Base*))derivedPrintInfo;
}

int main(void){
    Derived myDerived;
    derivedInit(&myDerived, 1, "Derived Object");
    myDerived.base.printInfo((Base*)&myDerived);
    return0;
}

a4cb6b6581022271005e1da9e13d08e0.png

1.3 多态

多态是指不同对象对同一消息做出不同响应。在嵌入式 C 语言中,可通过函数指针实现多态。

#include <stdio.h>

// 定义一个基类结构体
typedef struct {
    void (*operation)(struct Base*);
} Base;

// 定义一个派生类1结构体
typedef struct {
    Base base;
} Derived1;

// 定义一个派生类2结构体
typedef struct {
    Base base;
} Derived2;

// 派生类1的操作函数
void derived1Operation(Base* base){
    printf("Derived1 operation.\n");
}

// 派生类2的操作函数
void derived2Operation(Base* base){
    printf("Derived2 operation.\n");
}

// 初始化派生类1
void derived1Init(Derived1* derived1){
    derived1->base.operation = derived1Operation;
}

// 初始化派生类2
void derived2Init(Derived2* derived2){
    derived2->base.operation = derived2Operation;
}

// 执行操作
void performOperation(Base* base){
    base->operation(base);
}

int main(void){
    Derived1 myDerived1;
    Derived2 myDerived2;
    derived1Init(&myDerived1);
    derived2Init(&myDerived2);

    performOperation((Base*)&myDerived1);
    performOperation((Base*)&myDerived2);
    return0;
}

f74aabdc489581d0b018da4afe783746.png

Base结构体包含一个函数指针operation。Derived1和Derived2结构体继承了Base结构体,并分别实现了自己的operation函数。performOperation函数接收一个Base指针,依据具体对象调用相应的operation函数,从而实现了多态。

二、测试驱动开发(TDD)

测试驱动开发(Test-Driven Development,TDD)是一种软件开发方法论,它强调在编写实际功能代码之前先编写测试代码。

TDD 的核心流程遵循 “红 - 绿 - 重构” 循环,下面将详细介绍其原理、流程、优势、局限性以及示例。

点击嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践 查看全文

《基于S7-200的全自动洗衣机控制系统》一文主要探讨了如何利用西门子S7-200系列微型可编程控制器(PLC)来设计并实现全自动洗衣机控制系统。该系统旨在提升洗衣机的自动化水平,满足现代生活及工业生产对洗衣机功能的更高要求。S7-200系列PLC凭借其高性能经济性,成为理想的控制设备,其丰富的设计知识和方法可确保系统的稳定性和可靠性。 洗衣机的历史可追溯至19世纪,从最初的木制手摇洗衣机到电动洗衣机,再到如今的全自动洗衣机,其发展经历了从半自动到全自动再到智能化的演变。全自动洗衣机可自动完成除放衣、取衣和启动之外的所有洗衣步骤,极大地便利了人们的生活。在工业领域,洗衣机也在不断进化,追求更高的效率、更低的能耗和更优化的结构。 全自动洗衣机的发展历程见证了技术创新的足迹。1932年,前装式滚筒全自动洗衣机的出现标志着洗衣机进入新阶段,其在一个滚筒内完成洗涤、漂洗和脱水全过程。此后,洗衣机技术不断进步,包括微电脑控制、新型洗涤方式、高速脱水和低噪音等特性。近年来,中国在全自动洗衣机制造技术上取得显著进步,产品种类丰富,技术性能优良,产量逐年增长。 全自动洗衣机的控制系统有多种类型,如单片机控制、PLC控制和工业控制计算机集中控制。单片机控制虽小巧、功耗低,但开发难度大,硬件保护机制复杂,可能增加故障率和维修成本;工业控制计算机则适合大型控制系统,提供强大的软硬件支持。而PLC因其卓越的抗干扰能力、高可靠性、编程便利性、操作简便性、维护快捷性和设计灵活性等优势,成为全自动洗衣机控制系统的首选。S7-200系列PLC的模块化设计使系统扩展和维护更简单,能够快速完成设计和调试,推动洗衣机控制系统向更高级别的自动化迈进。基于S7-200的全自动洗衣机控制系统是现代科技传统家电的完美结合,体现了PLC技术在日常生活中的广泛应用和价值。通过深入理解和掌握PLC的工作原理和编程技巧,可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值