当前位置: 首页 > 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();
}

相关文章:

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

1. 单一职责原则 (Single Responsibility Principle, SRP) 定义: 一个模块或函数应当只有一个引起变化的原因。 应用案例: 在嵌入式系统中,可以将传感器数据的读取和处理分开成不同的函数。例如: // 读取传感器数据的函数 floa…...

初学嵌入式-C语言常犯错误详解

1、对于下面这道题,估计有很多人会选择B答案,但其实答案是D 2.int a10, b9,c9,d; d b || (a>c),请问上述代码执行完毕后a b c d的值分别是 。 A、10 9 10 9 B、10 10 10 1 C、10 9 10 1 D、10 10 9 1 答案解释: 在C语言…...

Golang 语法入门

Golang 语法入门 Hello World package mainimport "fmt"func main() {fmt.Println("hello world") }变量 package mainimport "fmt"// 全局变量 var ans 123 var cnt intfunc main() {// 单个局部变量a : 114514// 多个局部变量b, c : 114, …...

Filebeat+Kafka+ELK

架构: 部署: #配置nginx,部署filebeat systemctl stop firewalld setenforce 0 systemctl restart nginx#解压filebeat tar -xf filebeat-6.7.2-linux-x86_64.tar.gz mv filebeat-6.7.2-linux-x86_64 filebeat#日志收集 cd firebeat vim fil…...

Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)

在使用Excel进行数据处理和分析时,对特定单元格进行背景颜色填充不仅能够提升工作表的视觉吸引力,还能帮助用户快速识别和区分不同类别的数据,增强数据的可读性和理解性。 本文将通过以下三个示例详细介绍如何使用Python在Excel中设置不同的单…...

家里浮毛粉尘到处飞?宠物空气净化器出动帮你解决

由于家里收养的十几只流浪猫咪夏季掉毛非常严重,整个房子弥漫着猫毛,而且这十几只里面有七八只还是长毛的品种,掉落的毛发都因为太长而直接掉落成毛团,而短毛的那几只也在掉毛,这十几只掉下的浮毛,家里已经…...

计算机网络ISO七层网络模型及TCP

思维导图(通俗理解) 首先,先用最通俗的话来描述ISO七层模型,思维导图结构如下: ISO七层网络模型概念 应用层(Application Layer):应用层是OSI模型的最高层,直接与用户交…...

机器学习知识点全面总结

一、机器学习基础概念 1、什么是机器学习 机器学习是一种人工智能技术,通过对数据的学习和分析,让计算机系统自动提高其性能。简而言之,机器学习是一种从数据中学习规律和模式的方法,通过数据来预测、分类或者决策。 机器学习的本…...

【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核

文章目录 前言 背景介绍 C28x内核 浮点单元(FPU) 快速整数除法单元(FINTDIV) 三角数学单元(TMU) VCRC单元 CPU总线 指令流水线 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解…...

LeetCode.27.移除元素

题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以…...

redis面试(十二)可重入锁总结

可重入锁总结 从实现原理以及源码的层面,真正剖析和了解到了redis分布式锁的企业级的实现,这个分布式锁实现的还是非常漂亮的,麻雀虽小,五脏俱全,分布式的可重入锁,总结一下流程 (1&#xff0…...

软件测试知识点3

063、一份测试计划应该包括哪些内容? 背景、项目简介、目的、测试范围、测试策略、人员分工、资源要求、进度计划、参考文档、常用术语、提交文档、风险分析。 065、如何定位测试用例的作用? 组织性:编写、组织性、功能覆盖、重复性、跟踪、测试确认 066、什么…...

WPF Treeview开启虚拟化后如何找到TreeViewItem

用VirtualizingStackPanel的BringIndexIntoViewPublic方法就好&#xff0c;没必要像微软给的例子那样还要继承一个VirtualizingStackPanel /// <summary> /// Recursively search for an item in this subtree. /// </summary> /// <param name"container…...

给python初学者的一些建议

写在开篇 关于Python&#xff0c;可以这么说&#xff0c;这几年借着数据科学、机器学习与人工智能的东风&#xff0c;Python 老树开新花&#xff0c;在风口浪尖上居高不下。 Python 之所以这么受大家的青睐&#xff0c;是因为它语言简洁&#xff0c;上手容易&#xff0c;让非…...

【Python学习手册(第四版)】学习笔记17-作用域

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文介绍Python作用域&#xff0c;介绍了变量名解析的LEGB原则&#xff0c;以及内置作用域&#xff0c;全局作用域global语句&#xff0c;嵌套作用域及nonlocal语…...

大语言模型(LLM)文本预处理实战

大语言模型&#xff08;LLM&#xff09;文本预处理实战 文章目录 大语言模型&#xff08;LLM&#xff09;文本预处理实战2.1 理解词嵌入2.2 文本分词2.3 将 token 转换为 token ID2.4 添加特殊上下文 token2.5 字节对编码 (BytePair Encoding, BPE)2.6 使用滑动窗口进行数据采样…...

宠物健康新守护:智能听诊器的家庭应用

宠物已成为我们情感的寄托和生活的一部分&#xff0c;为宠物的健康守护带来了科技的温度。 科技与关怀结合 这款智能听诊器&#xff0c;以其科技感和关怀精神&#xff0c;为宠物的健康监测提供了全新的视角。 家庭友好设计&#xff1a;考虑到家庭使用环境&#xff0c;智能听…...

六、go函数

函数在任何语言中并不难理解&#xff0c;但是不论是有几年开发经验的人&#xff0c;真正想要写好一个函数并不是那么容易的 1、go语言中函数结构 func main() {fmt.Println(isEven(2)) } func isEven(x int) bool {return x%2 0 }&#xff08;这里我写了一个简单的判断是否是…...

高原型垂直起降高速无人机技术详解

1. 技术概述 高原型垂直起降高速无人机&#xff08;High-Altitude Vertical Take-off and Landing High-Speed Unmanned Aerial Vehicle, HAVTHS UAV&#xff09;是针对高原复杂环境设计的一种先进无人机系统。它结合了垂直起降的灵活性与高速飞行的能力&#xff0c;能够克服高…...

Selenium + Python 自动化测试10(unittest概念)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上几篇我们讨论了元素的定位方法、操作方法以及一些特殊元素的操作。 在实际的测试项目组中每个模块会写多条案例&#xff0c;如第一条用例那里我们的登录。登录的话就可以有多…...

Phi-3-mini-4k-instruct-gguf入门必看:q4-GGUF量化对中文语义保留的影响实测

Phi-3-mini-4k-instruct-gguf入门必看&#xff1a;q4-GGUF量化对中文语义保留的影响实测 1. 模型简介 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本&#xff0c;特别适合中文场景下的问答、文本改写、摘要生成等任务。这个经过量化的模型版本在…...

DriverStore Explorer:突破Windows驱动管理瓶颈,释放系统空间提升80%存储效率

DriverStore Explorer&#xff1a;突破Windows驱动管理瓶颈&#xff0c;释放系统空间提升80%存储效率 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 诊断存储异常&#xff1a;设…...

淘宝虚拟商品选品实操:从儿童学习资料到游戏攻略的蓝海挖掘术

淘宝虚拟商品选品高阶指南&#xff1a;从儿童教育到游戏产业的精细化运营策略 在淘宝虚拟商品领域&#xff0c;真正能够持续盈利的卖家往往不是那些追逐热门品类的跟风者&#xff0c;而是懂得在细分市场中寻找差异化机会的"蓝海猎手"。儿童学习资料和游戏攻略这两个看…...

原神高帧率解锁终极方案:一键突破60帧限制的完全指南

原神高帧率解锁终极方案&#xff1a;一键突破60帧限制的完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想象一下这样的场景&#xff1a;你在蒙德的原野上自由奔跑&#xff0c;角…...

【技术解析】SimpleNet:用极简网络架构革新工业图像异常检测

1. 工业图像异常检测的现状与挑战 工业生产线上的质检环节一直是个让人头疼的问题。想象一下&#xff0c;你站在一条每分钟生产上百件产品的流水线旁&#xff0c;需要肉眼检查每个产品表面是否有划痕、凹陷或污渍——这几乎是不可能完成的任务。传统计算机视觉方法在这个领域已…...

Nuxt3 + PM2 + Nginx:打造高可用前端部署方案(附常见问题排查指南)

Nuxt3 PM2 Nginx&#xff1a;打造高可用前端部署方案&#xff08;附常见问题排查指南&#xff09; 在当今快速迭代的Web开发领域&#xff0c;Nuxt3凭借其出色的服务端渲染能力和现代化的开发体验&#xff0c;正成为越来越多技术团队的首选框架。然而&#xff0c;将Nuxt3应用部…...

用ESP32和TB6612FNG做个遥控小车:从硬件接线到Arduino代码调试全记录

从零打造ESP32智能遥控小车&#xff1a;硬件选型、代码优化与避坑指南 项目背景与核心组件解析 去年夏天&#xff0c;我在工作室里堆满了各种电机和开发板&#xff0c;试图为侄子制作一个生日礼物——能通过手机控制的遥控小车。经过多次迭代&#xff0c;最终选择了ESP32TB6612…...

从《阵列天线分析与综合》到HFSS实战:手把手教你仿真4x1微带天线阵(含相位扫描设置)

从理论到实践&#xff1a;HFSS中4x1微带天线阵的建模与相位扫描全解析 微带天线阵列因其低剖面、易集成和成本优势&#xff0c;在现代通信系统中扮演着重要角色。对于刚接触天线设计的工程师和学生而言&#xff0c;如何将《阵列天线分析与综合》等经典教材中的理论概念转化为可…...

iarduino_KB矩阵键盘库:硬件感知型Arduino按键驱动方案

1. 项目概述iarduino_KB是由俄罗斯嵌入式开发团队 iArduino.ru 面向 Arduino IDE 推出的专用矩阵键盘驱动库。该库并非通用型扫描抽象层&#xff0c;而是针对其自研四款物理形态与电气特性高度定制化的柔性/机械式矩阵键盘模块进行深度适配的固件级解决方案。其核心价值在于将底…...

RB3201-RBProtocol:ESP32机器人轻量通信协议栈解析

1. RB3201-RBProtocol 库深度解析&#xff1a;面向机器人控制的轻量级嵌入式通信协议栈 1.1 协议背景与工程定位 RB3201-RBProtocol 是由 RoboticsBrno 团队开发的嵌入式通信协议库&#xff0c;专为 ESP32 平台设计&#xff0c;核心目标是实现与 Android 端 RbController 移动…...