高内聚与低耦合实现小记

总所周知,实际软件开发中要实现高内聚、低耦合的设计原则。c语言和c++不同,c语言面向过程、c++面向对象。

真正的项目中,要对业务升级,原来的业务函数需要保留,要保证老的功能继续维持,不能直接删除,这时候

c语言面向过程,通常使用回调的方法。c++面向对象,要实现高内聚、低耦合,需要使用接口技术。

C语言为例:

软件通常有后台日志的记录功能,用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 <stdio.h>
#include <unistd.h>

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即可。

C++为例:

C++中强调面向对象的思想。

#include <iostream>
using namespace std;

class Log
{
public:
	void log()
	{
		cout << "logging..." << endl;
	}
};

class Business
{
private:
        Log *l;
public:
        Business(Log *l = NULL)
        {}

	void business()
	{
		while(1)
		{
			sleep(1);
			cout << "Deal Business..." << endl;
			l->log();
		}
	}
};

int main()
{
       Business b(new Log);
       b.business();
       return 0;
}

现在,我们需要对后台日志功能升级,怎么做?有人想到了C++中的重载,在Log类中重载一个函数log2;

也有人想到了继承Log类,覆写log函数等等,但是这几种方法,都需要对Business类中的代码进行变动。如何解决呢?于是C++中的接口技术就派上用处了。

记住,接口强调的是方法,接口里的方法定义为纯虚函数,接口不能实例化、也不需要实例化,需要接口里的功能的类只需要继承该接口即可!下面给出示例:

#include <iostream>
using namespace std;

class Log
{
public:
	virtual void log() = 0;//纯虚函数
};

class Log1 : public Log//继承接口
{
public:
	void log()
	{
		cout << "1 logging..." << endl;
	}
};

class Log2 : public Log//继承接口
{
public:
	void log()
	{
		cout << "2 logging..." << endl;
	}
};

class Business
{
public:
	void business(Log * f)//函数参数只要Log指针,具体传入的是Log1还是Log2的实例,由多态进行实现
	{
		while(1)
		{
			sleep(1);
			cout << "Deal Business..." << endl;
			f->log();
		}
	}
};

int main()
{
	Business b;
	b.business(new Log2);//会调用Log2类中的log日志函数!
	return 0;
}

此时,对日志业务升级就不会影响business的代码了,只需将不同的日志实例化传入business中即可。

这是一种很棒的设计思想。

高内聚与低耦合实现小记

时间: 2024-12-13 05:43:40

高内聚与低耦合实现小记的相关文章

对高内聚,低耦合的理解

内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量 最近编码的时候,总是在犹豫是把某个方法封装在一个类里,还是单独的封装成一个类.这让我突然想起内聚耦合这两个名词. 我们一直追求着,高内聚,低耦合. 对于低耦合,我粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在. 也就是说,让每个模块,尽可能的独立完成某个特定的子功能. 模块与模块之间的接口,尽量的少而简单. 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分. 这样有利于

什么是高内聚、低耦合?

起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单,两个定性的度量标准――耦合性和内聚性. 内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越紧密,其耦合性就越强,模块的独立性则越差.模块间耦合高低取决于模块间接口的复杂性.调用的方式及传递的信息. 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦

大型项目架构搭建_高内聚、低耦合(1)

软件开发中的项目的架构的终极目标就六个字: 高内聚.低耦合. 架构搭建好了,后期可维护性才干提高,在这基础上,假设还想提高项目的高效性,就仅仅能从算法着手 假设项目中算法都已经做到极致了,还想提高项目的高效性,怎么办?(算法并不一定能处理高并发的问题) 就要用到中间件的技术了 以下我就从这三方面来搭建一个项目 假设我们有个这么需求 我公式和YC公式合作,开发一个项目.这个项目功能是用来測量东西的一个项目,我们公式在存储数据方面做得好,YC公司所以要和我们合作.要我们做一个对数据进行保存的容器,他

高内聚,低耦合

之前一直对“高内聚,低耦合”这句话不太理解.. 高内聚在<代码大全>书中解释是:“类内部的子程序或者子程序内所有的代码在支持一个中心目标上的紧密程度--这个类的目标是否集中,当一个类的代码越集中在一个中心目标的时候,就越容易记住这些代码功能所在”.我的理解就是指一个模块使内各个元素彼此结合的紧密程度高,且模块内所有元素共同完成一个功能.代码就体现在一个类只形容一个事物对象,一个方法只执行一种功能操作,一个功能可以是多个方法的结合,但每个方法尽快做到单一. 而低耦合书中说:“耦合度表示类与类之间

面向对象设计之高内聚、低耦合

内聚 内聚的含义:内聚指一个模块内部元素彼此结合的紧密程度 在面向对象领域,谈到"内聚"的时候,模块的概念远远不止我们通常所理解的"系统内的某个模块"这个范围,而是可大可小,大到一个子系统,小到一个函数,你都可以理解为内聚 里所说的 "模块".所以可以用"内聚"来判断一个函数设计是否合理,一个类设计是否合理,一个接口设计是否合理, 一个包设计是否合理,一个模块/子系统设计是否合理. 其次:"元素"究竟是什么

小菜学设计模式——高内聚、低耦合

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅. 真诚的希望自己能够从一名小菜成长为一名大鸟! 编写的程序应该满足: 1)可维护 2)可扩展 3)可复用 4)够灵活 废话少说,言归正传,设计模式原则之:高内聚.低耦合 当然,这条原则不是面向接口编程的具体原则,他是所有原则.所有设计模式都必须遵循的一条亘古不变的宗旨. 网上学习与记录 起因:模块独立性指每个模

什么是高内聚,低耦合?

概念: 高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则. 低耦合是:一个完整的系统,模块与模块之间,尽可能的使其独立存在. 内聚性又称块内联系.指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量.若一个模块内各元素(语名之间.程序段之间)联系的越紧密,则它的内聚性就越高. 内聚性匪类(低――高): 偶然内聚;逻辑内聚;时间内聚;通信内聚;顺序内聚;功能内聚; 1 偶然内聚: 指一个模块内的各处理元素之间没有任何联系. 2 逻辑内聚:

JAVA : 关于高内聚与低耦合

高内聚与低耦合的概念说实话,对本人来说每次提起来总是有些模糊,下午看了一些博主的文章,感觉清晰了一些,在此记录一下个人的理解. 首先感谢几位老哥的文章,如下: https://blog.csdn.net/qq_39521554/article/details/79489180 https://www.cnblogs.com/corvoh/p/5747856.html https://blog.csdn.net/kingscoming/article/details/78836229 内聚: 每个

什么是耦合,关于高内聚,低耦合

耦合分为两类: 代码的耦合和数据结构的耦合: 数据结构的耦合是必然的,无法避免. 代码的耦合是可以降低的, 基本条件如下: MVC为例,下层不能调用上层方法,上层不能跨层调用: 封装的类只需要暴露自己的数字签名:名字,方法数,返回值等,方法的具体实现不能被调用者知道.