当前位置: 首页 > news >正文

C语言 软件设计的七大原则,及其应用案例

1. 单一职责原则 (Single Responsibility Principle, SRP)

定义: 一个模块或函数应当只有一个引起变化的原因。

应用案例:
在嵌入式系统中,可以将传感器数据的读取和处理分开成不同的函数。例如:

// 读取传感器数据的函数
float read_temperature_sensor() {// 读取温度传感器数据的代码return temperature;
}// 处理温度数据的函数
void process_temperature(float temperature) {// 处理温度数据的代码
}void main() {float temperature = read_temperature_sensor();process_temperature(temperature);
}

2. 开放-封闭原则 (Open-Closed Principle, OCP)

定义: 软件实体(类、模块、函数等)应当对扩展开放,对修改封闭。

应用案例:
在嵌入式系统中,如果要增加新的传感器类型而不修改现有代码,可以使用函数指针来实现扩展。

typedef float (*SensorReadFunction)();float read_temperature_sensor() {// 读取温度传感器数据的代码return temperature;
}float read_humidity_sensor() {// 读取湿度传感器数据的代码return humidity;
}void read_and_process_sensor(SensorReadFunction read_function) {float sensor_data = read_function();// 处理传感器数据的代码
}void main() {read_and_process_sensor(read_temperature_sensor);read_and_process_sensor(read_humidity_sensor);
}

3. 里氏替换原则 (Liskov Substitution Principle, LSP)

定义: 继承的子类应当能够替换其基类而不影响程序的正确性。

应用案例:
在嵌入式系统中,可以使用结构体和函数指针实现类似于面向对象的多态性。

typedef struct {float (*read)();
} Sensor;float read_temperature_sensor() {return temperature;
}float read_humidity_sensor() {return humidity;
}void read_and_process_sensor(Sensor *sensor) {float sensor_data = sensor->read();// 处理传感器数据的代码
}void main() {Sensor temperature_sensor = {read_temperature_sensor};Sensor humidity_sensor = {read_humidity_sensor};read_and_process_sensor(&temperature_sensor);read_and_process_sensor(&humidity_sensor);
}

4. 接口隔离原则 (Interface Segregation Principle, ISP)

定义: 客户端不应该依赖于它不需要的接口。

应用案例:
在嵌入式系统中,可以将不同的功能分离成不同的接口,避免客户端依赖不需要的功能。

typedef struct {float (*read_temperature)();float (*read_humidity)();
} Sensor;float read_temperature() {return temperature;
}float read_humidity() {return humidity;
}Sensor sensor = {read_temperature, read_humidity};void main() {float temperature = sensor.read_temperature();// 仅处理温度数据
}

5. 依赖倒置原则 (Dependency Inversion Principle, DIP)

定义: 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

应用案例:
在嵌入式系统中,可以使用抽象接口来实现不同的传感器驱动,而不直接依赖具体的传感器实现。

typedef struct {float (*read)();
} Sensor;float read_temperature_sensor() {return temperature;
}float read_humidity_sensor() {return humidity;
}Sensor temperature_sensor = {read_temperature_sensor};
Sensor humidity_sensor = {read_humidity_sensor};void read_and_process_sensor(Sensor *sensor) {float sensor_data = sensor->read();// 处理传感器数据的代码
}void main() {read_and_process_sensor(&temperature_sensor);read_and_process_sensor(&humidity_sensor);
}

6. 迪米特法则 (Law of Demeter, LoD)

定义: 一个对象应该对其他对象有尽可能少的了解。

应用案例:
在嵌入式系统中,可以通过封装和接口隐藏实现细节,只暴露必要的功能给外部模块。

typedef struct {float (*read)();
} Sensor;typedef struct {Sensor sensor;
} Device;float read_temperature_sensor() {return temperature;
}Device create_device() {Sensor temperature_sensor = {read_temperature_sensor};Device device = {temperature_sensor};return device;
}void read_and_process_device(Device *device) {float sensor_data = device->sensor.read();// 处理传感器数据的代码
}void main() {Device device = create_device();read_and_process_device(&device);
}

7. 单元测试原则 (Unit Testing Principle)

定义: 编写可测试的代码,通过单元测试来验证每个模块或函数的功能。

应用案例:
在嵌入式系统中,可以使用模拟(mock)和桩(stub)来编写单元测试。

// 原始函数
float read_temperature_sensor() {return temperature;
}// 测试模拟函数
float mock_read_temperature_sensor() {return 25.0; // 模拟固定温度值
}void process_temperature(float temperature) {// 处理温度数据的代码
}void test_process_temperature() {float temperature = mock_read_temperature_sensor();process_temperature(temperature);// 验证处理结果
}void main() {test_process_temperature();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • labelme标注的图像分割json文件转图片格式
  • Flutter 学习 一部分注意点记录
  • css实现磨砂效果(filter 与 backdrop-filter 的对比分析)
  • Lambda 表达式:解锁编程世界的魔法之门
  • 「MyBatis」数据库相关操作2
  • 【论文】NCScope: Hardware-Assisted Analyzer for Native Code in Android Apps
  • vue手搓悬浮在线客服按钮
  • 【深度学习与NLP】——注意力机制
  • Java 8: 根据对象的多个属性去除List中的重复元素
  • C控制语句:循环(1)
  • Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N]……解决
  • 七夕表白网页效果实现与解析
  • C++的7种设计模式原则
  • kafka下载|安装
  • C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
  • 《深入 React 技术栈》
  • angular2 简述
  • css布局,左右固定中间自适应实现
  • Docker容器管理
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6系列(二)变量的解构赋值
  • extract-text-webpack-plugin用法
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • leetcode46 Permutation 排列组合
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring boot下thymeleaf全局静态变量配置
  • Zepto.js源码学习之二
  • 从伪并行的 Python 多线程说起
  • 订阅Forge Viewer所有的事件
  • 力扣(LeetCode)357
  • 如何设计一个比特币钱包服务
  • NLPIR智能语义技术让大数据挖掘更简单
  • # 计算机视觉入门
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (void) (_x == _y)的作用
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (四)Linux Shell编程——输入输出重定向
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)Scala的“=”符号简介
  • *2 echo、printf、mkdir命令的应用
  • .NET 4.0中的泛型协变和反变
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 发展历程
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 验证控件和javaScript的冲突问题
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /dev下添加设备节点的方法步骤(通过device_create)