您的位置:首页 > 其它

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

2017-09-12 08:46 531 查看
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.可扩展性。代码之间的耦合少,这样就不惧怕需求改动和功能增删。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: