用C语言编写低耦合程序

  • 耦合的定义
    • 低耦合的优点
  • 实现例子
    • 普通的实现方式
    • 低耦合的实现方式

耦合的定义

  耦合,是对模块间关联程度的度量。 模块间的耦合度是指模块之间的依赖关系,其耦合性越强,同时表明其独立性越差。

低耦合的优点

  降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行。

实现例子

实现两个功能:
1、统计字符串的单词总数。
2、统计字符串中长度大于n的个数。
在这两个功能中,都需要将字符串中的每个单词分离单独处理。

普通的实现方式

typedef enum _parse_words_mode_t {MODE_SUM = 0,  /* 模式:统计单词总数 */MODE_SUM_GT,   /* 模式:统计长度大于n单词数 */
} parse_words_mode_t;int count_words(const char* str, parse_words_mode_t mode, int len) {int ret = 0;if (NULL == str || len < 0) {return FALSE;}bool ret = TRUE;for (const char* iter = str; '\0' != *iter; iter++) {/** 获取单词word和单词长度word_len(省略) **/if (MODE_SUM == mode) {ret++;} else if (MODE_SUM_GT == mode) {if (word_len > len) {ret++;}}}return ret;
}
#include <stdio.h>int main() {char str[64] = "Read Text, demo.kun abcdefg abcdefg";int sum_word = count_words(str, MODE_SUM, 0);if (sum_word >= 0) {printf("\nword num:%d\n", sum_word);} else {printf("\nword sum error!\n");}int gt6_word = count_words(str, MODE_SUM_GT, 6);if (gt6_word >= 0) {printf("\ngreat 6 letter : word num:%d\n", gt6_word);} else {printf("\nword sum gt error!\n");}return 0;
}

  这个方法看上去好像没什么问题,但如果功能增加了十多个,那么count_words函数的选择结构就会越来越庞大,修改就会变得麻烦。

低耦合的实现方式

  使用函数指针调用功能函数来代替使用选择结构(if else; switch case)调用函数。
  函数指针类型参数使用void*类型的ctx变量作为功能函数的上下文,即功能函数的返回值或一些参数。
  函数指针类型返回值用于判断函数执行是否成功。

typedef int bool;
#define TRUE 1
#define FALSE 0/* 定义函数指针类型名 */
typedef bool (*on_word_t)(void* ctx, const char* word, unsigned int size);/*** @method parse_words* 解析字符串中的单词* @param {const char*} str 需要解析单词的字符串。* @param {on_word_t} word_func 单词处理函数指针。* @param {void*} ctx 单词处理函数指针的上下文。** @return {bool} 解析成功则返回TRUE。*/
bool parse_words(const char* str, on_word_t word_func, void* ctx) {if (NULL == str || NULL == word_func) {return FALSE;}bool ret = TRUE;for (const char* iter = str; '\0' != *iter; iter++) {/** 获取单词word和单词长度len(省略) **/ret = word_func(ctx, word, len + 1); /* 通过函数指针调用功能函数 */}return ret;
}
/* 统计单词总数 */
static bool words_sum(void* ctx, const char* word, unsigned int size) {if (NULL == ctx) {return FALSE;}int* p_count = ctx;(*p_count)++;  /* 单词数+1 */return TRUE;
}/*** @method count_word_sum* 计算单词总数。* @param {const char*} str 需要计算单词总数的字符串。** @return {int} 单词总数(若计算的字符串为空指针,返回值为-1)。*/
int count_words_sum(const char* str) {int ret = 0;return (TRUE == parse_words(str, words_sum, &ret)) ? ret : -1;
}
/* 统计长度大于n的单词数 */
/* count_word_sum_gt()函数内部使用的相关参数 */
typedef struct _ctx_word_sum_gt {int count;  /* 单词数 */const unsigned int word_len;  /* 单词长度 */
} ctx_word_sum_gt;static bool words_sum_gt(void* ctx, const char* word, unsigned int size) {if (NULL == ctx) {return FALSE;}ctx_word_sum_gt* sum_gt_ctx = ctx;if ((size - 1) > sum_gt_ctx->word_len) {  /* 长度是否大于word_len */sum_gt_ctx->count++;  /* 单词数+1 */}return TRUE;
}/*** @method count_word_sum_gt* 计算单词长度大于word_len的数量。(word_len为0时为单词总数)* @param {const char*} str 需要计算单词数量的字符串。* @param {int} word_len 单词长度。** @return {int} 单词数量(若计算的字符串为空指针或单词长度小于0,返回值为-1)。*/
int count_words_sum_gt(const char* str, int word_len) {if (word_len < 0) {return -1;}ctx_word_sum_gt ret = {.count = 0,.word_len = word_len,};return (TRUE == parse_words(str, words_sum_gt, &ret)) ? ret.count : -1;
}
#include <stdio.h>int main() {char str[64] = "Read Text, demo.kun abcdefg abcdefg";int sum_word = count_word_sum(str);if (sum_word >= 0) {printf("\nword num:%d\n", sum_word);} else {printf("\nword sum error!\n");}int gt6_word = count_word_sum_gt(str, 6);if (gt6_word >= 0) {printf("\ngreat 6 letter : word num:%d\n", gt6_word);} else {printf("\nword sum gt error!\n");}return 0;
}

  使用低耦合的实现方式将不变的代码和易变的代码隔离,在添加新功能时,无需再改动原有的函数,更加安全和高效。

用C语言编写低耦合程序相关推荐

  1. c语言字符串dna,转录流程(c语言编写DNA转录程序)

    c语言编写DNA转录程序 AT,CG 进行互换就可以了 #include #include main() { char input[50];/*Defined to store the DNA cod ...

  2. 使用C语言编写测速程序

    可以使用 C 语言编写测速程序.要实现这个功能,你可以使用 C 语言中的时间函数来计算程序运行的时间. 具体来说,可以使用 clock() 函数来计算程序运行的时间.这个函数返回从程序开始运行到调用 ...

  3. 编写程序C语言 用递归法求n,用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n...

    用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  4. 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。

    在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...

  5. 使用Scala语言编写Spark应用程序实现数据去重

    使用Scala语言编写Spark应用程序实现数据去重 一.题目需求 二.建立目录结构 (一)创建 sparkapp4 文件夹并切换 (二)创建 data 文件夹(存放A.txt B.txt) (三)创 ...

  6. linux gui编程语言,使用 Red 语言编写 GUI 应用程序

    一句话概括 - 使用 Red 语言编写原生跨平台桌面 GUI. 尝试在 Windows 上使用 PyInstaller 将"可执行"的 ducktape 封装在 Python 脚本 ...

  7. 用c语言编写研究生录取程序,C语言_课程设计---研究生初试录取管理系统.doc

    计算机科学与技术系 课程设计任务书 2010-2011年第二学期 课程 C语言课程设计 课程设计名称 研究生初试录取管理系统 专业班级 10 计本4 指导教师 2011年6月 一. 课程设计目的 将理 ...

  8. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

  9. C语言编写一个四位数的和,c语言编写一段程序,输入一个四位数,输出各位数字的和...

    用C语言编写程序,输入一个正整数n(1 #include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x0 ...

最新文章

  1. Memcached Java客户端2.6.1发布
  2. 【加法笔记系列】逻辑电路的实现
  3. boot loader能全部用C程序编写吗
  4. 分享网页加载速度优化的一些技巧?
  5. Wi-Fi 6值得升级吗?从Wi-Fi 5升级到Wi-Fi 6需要什么?
  6. Windows10安装TeXlive和TeXstudio
  7. 机器学习实战(八)分类回归树CART(Classification And Regression Tree)
  8. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
  9. Linux CentOS安装JDK
  10. Python画新冠肺炎国内和世界各国累计确诊数量热图!某国破百万了
  11. json对象获取json数组
  12. 软件设计---概要设计和详细设计
  13. 线性回归 T检验P值计算
  14. Java Keytool工具简介
  15. 汽车租赁系统V1.0
  16. 偶数求和打分 c语言acm,杭州电子科技大学ACM2015-偶数求和-解题思路(accept)
  17. 清华王牌专业建系70年,撑起中国半导体半壁江山,王兴李健都是系友
  18. 三国演义亲和度python_Python之三国演义源码
  19. android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
  20. 小程序毕设作品之微信疫苗预约小程序毕业设计(7)中期检查报告

热门文章

  1. ubuntu镜像的选择:i386还是amd64?
  2. 通过GPS获取位置信息
  3. jQuery实现钟表
  4. List的初始化大小
  5. 什么是i妇,为什么有用
  6. 数据分析全球油产量及油价变动
  7. Pymoo学习 (11):有偏随机密匙遗传算法 (BRKGA: Biased Random Key Genetic Algorithm) 的使用
  8. 信创银河麒麟操作系统局域网内文件拷贝,该命令同样适用于linux操作系统
  9. lvextend/lvreduce/lvresize
  10. redis三:集群配置