设计模式六大原则(1):单一职责(SRP)

0x00 什么是单一职责

实现单一功能,一个功能函数或者类只做一件特定的事,就叫做单一职责。

只是单纯的字面来解释什么是单一职责就太没意思了,所以我随便在网上找了一个c语言读写文件的小程序,在这里以代码的形式带大家了解设计模式原则。


0x01 冗余代码

#include <stdio.h>  
  
int main()  
{  
    //下面是写数据,将数字0~9写入到data.txt文件中  
    FILE *fpWrite=fopen("data.txt","w");  
    if(fpWrite==NULL)  
    {  
        return 0;  
    }  
    for(int i=0;i<10;i++)  
        fprintf(fpWrite,"%d ",i);  
    fclose(fpWrite);  
    //下面是读数据,将读到的数据存到数组a[10]中,并且打印到控制台上  
    int a[10]={0};  
    FILE *fpRead=fopen("data.txt","r");  
    if(fpRead==NULL)  
    {  
        return 0;  
    }  
    for(int i=0;i<10;i++)  
    {  
        fscanf(fpRead,"%d ",&a[i]);  
        printf("%d ",a[i]);  
    }  
    getchar();//等待  
  
    return 1;  
}  

定睛一看,这不是很正常的代码。重构代码先对代码进行分析和确定职责:

a.重构分析

1.我们要确定一件事的是 main作为主线程,只需要做业务调度。而现在运算,赋值,业务调度全部都耦合起来了,必须进行修改。

2.fopen("data.txt","r");  和fopen("data.txt","w");  阅读性欠佳,封装成两个单独的接口进行调用,可以解决阅读性和消除参数造成的上帝函数

b.确定职责和重构方案

1.main()主线程只做业务调用

2.封装文件读写接口


0x02 进行重构符合设计原则

1.main修改

int main()
{
	int execute_status;

	char buf[4096];
	memset(buf, 0,sizeof(buf));

	FILE * rfHandle = ReadFileHandle("C:\\Users\\Reacher\\Desktop\\data.txt");
	if (NULL == rfHandle)
	{
		printf("获取读句柄失败");
		exit(1);
	}
	 
	execute_status = ReadFileData(rfHandle, buf);
	if (-1 == execute_status)
	{
		printf("ReadFileData 读取数据失败");
		exit(1);
	}
	
    return 0;
}

2.职责功能的封装

#ifndef __FILE_FUNC_H_
#define __FILE_FUNC_H_

#define  EXECUTE_SUCCESS	0
#define  EXECUTE_FILT		-1

/****
@Describe: 返回读文件句柄

@Parameter:pFilePath 读取的文件路径

@Return:NULL	获取文件操作句柄失败
		!NULL	文件句柄
*/
FILE * ReadFileHandle(char* pFilePath);

/****
@Describe: 获取文件内的数据

@Parameter:fileHandle 文件读句柄
		   data		  见数据放入的存储空间

@Return:EXECUTE_SUCCESS	读取成功
		EXECUTE_FILT	读取失败
*/
int ReadFileData(FILE * fileHandle, char* data);

#endif

/****
@Describe: 返回读文件句柄

@Parameter:pFilePath 读取的文件路径

@Return:NULL	获取文件操作句柄失败
		!NULL	文件句柄
*/
FILE * ReadFileHandle(char* pFilePath)
{
	if (NULL == pFilePath)
	{
		printf("ReadFileHandle 参数有问题");
		return NULL;
	}
	FILE * handle = fopen(pFilePath, "r");

	return handle;
}


/****
@Describe: 获取文件内的数据

@Parameter:fileHandle 文件读句柄
	   data		  见数据放入的存储空间

@Return:EXECUTE_SUCCESS	读取成功
		EXECUTE_FILT	读取失败
*/
int ReadFileData(FILE * fileHandle, char* data)
{
	if ((NULL == fileHandle) || (NULL == data))
	{
		printf("ReadFileData参数有问题");
		return EXECUTE_FILT;
	}

	char ch;
	int i = 0;

	while (EOF != (ch = getc(fileHandle)))
	{
		data[i] = ch;
		i++;
	}

	return EXECUTE_SUCCESS;
}

0x03 总结

看过后一定会觉得这样写代码麻烦死了,但是习惯总是要慢慢开始养成的。小练习和测试就是养成习惯的最后过程,做的小而精致。现在对这样写代码的好处进行;

1.人员流失。代码模块化,专业化。这样人员流失带来的损失降到最低。

2.可阅读性。代码最终目的是执行,但是执行的前提是给人阅读啊,不注重阅读性的程序员一定不是好的程序员。

3.可维护性。代不论项目能不能最终存活,都要维持一个可以维护的状态,毕竟不能挖坑害人和别人挖坑啊。

4.可扩展性。代码之间的耦合少,这样就不惧怕需求改动和功能增删。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值