Single Responsbility Principle(SRP)
一. What is Single Responsibility Principle
相同的功能要高度内聚到一个类(结构体、函数、方法、模块等)中,关系不大的功能要分离开来进行解耦,即类(结构体、函数、方法、模块等)的定义应当高内聚,低耦合。
二. SRP error example
2.1 温度传感器
一个文件(sensor.c)、函数(readTemperatureSensor) 同时负责读取传感器、转换数据、滤波、校准和报警,职责过多,难以维护和测试。
// sensor.c - 违反 SRP 的典型嵌入式代码
#include "stm32f4xx_hal.h"
#include <math.h>
// 混合了硬件访问、数据转换、过滤、校准、状态判断
float readTemperatureSensor(void) {
static float last_value = 0;
// 1. 硬件访问 - ADC 读取
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t raw_adc = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
// 2. 原始值转换
float voltage = (raw_adc * 3.3f) / 4096.0f;
// 3. 传感器特性转换(NTC 热敏电阻)
float resistance = 10000.0f * (3.3f / voltage - 1.0f);
float temperature = 1.0f / (log(resistance / 10000.0f) / 3950.0f + 1.0f / 298.15f) - 273.15f;
// 4. 低通滤波
float alpha = 0.1f;
temperature = alpha * temperature + (1 - alpha) * last_value;
last_value = temperature;
// 5. 校准偏移
temperature += 1.5f; // 固定校准值
// 6. 检查温度是否超限
if (temperature > 85.0f) {
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // 报警
} else {
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
return temperature;
}
浙公网安备 33010602011771号