世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

单片机编程:高内聚低耦合

[复制链接]
查看: 994 |回复: 1
1
yzpc05d_x04
  • 积分:6298
  • |
  • 主题:85
  • |
  • 帖子:1034
积分:6298
版主
  • 2021-7-2 17:31:41
好久没有来论坛了,单片机编程:高内聚低耦合的一种方法:函数类型和函数指针
//计算四边形的周长
#include <stdio.h>
#define RECTANGLE 0  //长方形
#define SQUARE 1 //正方形
//多边形
struct polygon{
    int type;
    int length;
    int width;
};
int get_rectangle_cir(struct polygon pygn)
{
    return 2 * (pygn.length + pygn.width);
}
int get_square_cir(struct polygon pygn)
{
    return 4 * pygn.width;
}
int (* get_circumference[])(struct polygon pygn) ={get_rectangle_cir, get_square_cir};
#define get_cir(pygn) get_circumference[pygn.type](pygn)
int main(void)
{
    struct polygon pygn_rec, pygn_squ;
    pygn_rec.type = RECTANGLE;
    pygn_rec.width = 6;
    pygn_rec.length = 10;
    pygn_squ.type = SQUARE;
    pygn_squ.width = 6;
    printf("get cir rec is: %d\n",get_cir(pygn_rec));
    printf("get cir squ is: %d\n",get_cir(pygn_squ));
    return 0;
}
        当调用get_cir(pygn)时,用类型字段pygn.type做索引,从指针数组get_circumference中取出相应的函数指针来调用,也可以达到if ... else ...的效果,但相比之下这种实现更好,每个函数都只做一件事情,而不必用if ... else ...兼顾好几件事情,比如get_rectangle_cir和get_square_cir各做各的,互相独立,而不必把它们的代码都耦合到一个函数中。
汇总:
  • 所有与模块相关的功能都应集成到单个源文件中,这是高内聚的体现。
  • 模块对外提供一个头文件,该文件声明了该模块的所有资源(硬件依赖/宏/常量/变量/函数)。尽量用struct将紧密相关的变量进行集总封装。
  • 在源文件中包括自检代码部分,以实现该模块模块的所有自检功能。
  • 固件模块的接口应经过精心设计和定义。
  • 由于固件取决于硬件,因此需要在源文件头中明确提及硬件的相关性。比如利用宏将硬件依赖转定义,或者利用函数将基本操作进行封装。则在新的架构体系,仅仅需要移植这部分实现即可使用。
  • 通常,固件模块可供其他团队成员在其他项目中使用。可能涉及到管理更改,缺陷修复、所有者应维护模块。源文件头应包含“作者”和“版本”信息。
  • 固件在某种程度上取决于编译器。源文件头中应声明基于什么开发环境进行过验证,以指定编译器或与IDE相关的信息。
ZWC317441532
  • 积分:14404
  • |
  • 主题:54
  • |
  • 帖子:1254
积分:14404
LV10
总工程师
最新回复
  • 2021-7-3 08:17:23
  • 倒数1
 
原来就是一个计算周长的函数,长方形=(6+10)X2=32
正方形=6X4=24.

结果.png


热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号