完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1、定义
高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。 2、概念 耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。 内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。 3、如何实现 c语言面向过程,通常使用回调的方法。c++面向对象,要实现高内聚、低耦合,需要使用接口技术。 要做到高内聚低耦合,设计模块时需要做到: (1)各个模块之间的功能必须明确; (2)各个功能模块间实现的功能不可以有交叉; (3)不允许出现模块间的相互调用; (4)如果必须出现模块间调用,那么只允许单向调用,即A可以调用B,B不可以调用A。 C语言中常见的形式(1)--函数接口: 尽量避免使用全局变量,不使用全局变量那又如何进行模块间的数据传递呢?例如在别的模块中(例如LED显示)想要知道按键的状态或设置按键的状态,一般的思想是不是定义一个keyFlag全局变量呢?然后再LED显示模块和按键模块中都去直接操作keyFlag,这样就提高了模块间的耦合度; 这样做还有很多弊端,假设哪天需要按键模块引入到别的工程中使用,但是工程中已经定义了全局按键变量为keyStatus或是没有定义,那这个时候我们又怎样去获取按键的状态呢?是改全局名称或重新定义全局变量,是不是都很麻烦? 所以在按键模块中定义两个函数供外部调用就可以了: u8_t get_key_status(void) { return key_flag; } void get_key_status(u8_t flag) { key_flag = flag; } 需要知道按键状态的模块只需要调用以上两个函数就可以了,并不需要关心按键模块中定义的按键状态的变量名是什么,这样就减少了全局变量的使用! C语言中常见的形式(2)--函数指针: 软件通常有后台日志的记录功能,用log函数实现,主业务用business函数表示: void log() { printf("Logging...n"); } void business() { while(1) { sleep(1); printf("Deal Business...n"); log(); } } int main() { business(); return 0; } 现在需要对后台日志功能进行升级,该如何实现? 一般人的想法是这样:再写一个函数log2,然后business中log改为log2,这样不就可以了? 但是你想想,主业务代码怎能轻易改动?因为一个小小的功能而要改变主要的业务代码,这样不是显得智商很捉急? 换一种思路,使用回调: #include #include void log1() { printf("1 Logging...n"); } void log2() { printf("2 Logging...n"); } void business( void (*f)() ) { while(1) { sleep(1); printf("Deal Business...n"); f(); } } int main() { business(log1); return 0; } business函数接受一个函数指针,该指针指向的函数没有参数,返回值为void,符合log函数的原型。business中只要f()即可调用相应的函数。 当需要使用log1时,向business传log1、要使用升级后的log2时,传入log2即可。 这样做就business函数并不需要所传入数据的变化,只关心自身的功能就行,具体传入什么数据待用户调用的时候让用户决定,这样就提高了函数的通用性和灵活性。 |
|
|
|
只有小组成员才能发言,加入小组>>
3262 浏览 9 评论
2943 浏览 16 评论
3442 浏览 1 评论
8952 浏览 16 评论
4036 浏览 18 评论
1078浏览 3评论
558浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
551浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2286浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1848浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 11:34 , Processed in 0.830873 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号