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;
}
posted @ 2026-02-22 19:34  自由的Charles  阅读(12)  评论(0)    收藏  举报