电子发烧友网 > 今日头条 > 正文

C语言的策略模式提高了程序的可维护性和扩展性

2020年06月24日 16:29 次阅读

这里先插一点题外话,在C语言中,实现封装、继承、隐藏、多态等等特性,是完全没有问题的。但是在使用过程中,必定是不如自带这些特性的语言方便好用的,比如C++\java等。

一旦要通过C语言来实现各种设计模式,必定会在严谨地维护类层次上造成非常繁琐和臃肿的代码。这是因为C++/java等自带一套面向对象的工具,而C语言要在代码设计中,不断地根据实际情况来创造面向对象的工具。因此对于文章的内容,请大家主要关注、体会设计模式本身,更多地去考虑程序的可扩展性和可维护性。

文章本身是希望向C语言爱好者普及设计模式的知识,在所有的程序设计中,本意都是尽可能地简单易懂。因此抛开设计模式的本意去讨论程序的代码实现优劣,是没有任何意义的。之前发表的c语言面向对象系列文章确实参考了网上很多资料和书籍,也借鉴了其中一些案例。但是代码确实是自己完整实现的,并复制粘贴在菜鸟 C 在线工具进行验证了。今后类似借鉴、抄袭等等话题不想再次和大家争论,容易伤和气。毕竟只是希望大家能从我的文章有所收获而已,不喜欢直接左上角关闭就好。

鉴于之前有部分读者过于关注程序本身的功能性,更有甚者仅因为某一两方面见解不同就口出恶言。唯恐这样下去只会把技术的圈子搞臭。因此以后的c语言设计模式将不再给出具体实现,只讲解模式动机和设计思路。希望大家可以针对设计模式方面给文章提出一些改进的建议,本人可以保证,对于无恶意、有针对性的建议,一定会吸收接纳、及时改正。

模式动机

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。简单来说,策略模式就是用统一的方法接口分别对不同类型的数据进行访问。

场景案例

场景:现在我们想用pc看一部电影,但是影片本身有多种播放格式。比如rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。

传统代码实现

... void main() { ... if (movie == avi) {    ...//avi影片的播放策略 } else if (movie == rmvb) {    ...//rmvb影片的播放策略 } else if ... }

在上面的代码实现中,把所有的功能代码全部集中在一个函数里面完成了,随着分支的扩展,整个函数会越来越臃肿,非常难以维护。我们应该把每个分枝的实现抽离出来,封装在函数里面实现。

改进代码实现1:

... void main() { if (movie == avi) {   play_avi_movie();//avi影片的播放策略 } else if (movie == rmvb) {   play_rmvb_movie();//rmvb影片的播放策略 } else if ... }

在上面的代码实现中,我们通过把分支代码封装起来,减少了主函数的复杂性。但是从更高的一层的抽象看,主函数其实不关心各种分支情况。它希望的是,在进行必要的配置工作以后,直接调用某一个函数接口就能完成功能。

因此,我们应该把各个分支函数抽离出来,统一用某个函数接口来表示。只要在程序中进行完配置工作以后,那么主函数接下来就能直接调用该函数接口。

改进代码实现2:

void (*play_movie)(); void set_movie(char movie) {  if(movie == avi)  {    play_movie = play_avi_movie;  }  else if(movie == rmvb)  {    play_movie = play_rmvb_movie;  }  else if  ... } void main() { ... set_movie(); ... play_movie(); ... }

这就是c语言中的策略模式,重点在于分离各个分支的实现函数,主程序只需要通过唯一的接口,就能完成相应功能,提高了程序的可维护性和扩展性。

fqj

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

嵌入式C语言进阶课程

实际工程经验为蓝本,结合C语言中易错和长期被误解的知识点进行深度讲解。
发烧友学院发表于 2018-12-14 00:00 5263次阅读
嵌入式C语言进阶课程

在C语言中,全局变量滥用的后果是什么

01 啥是全局变量 说起全局变量,就不得不提到全局变量,局部变量,静态全局变量,静态局部变量,这些都....
发表于 2020-06-24 17:14 0次阅读
在C语言中,全局变量滥用的后果是什么

盘点一些在C语言中比较容易犯的错误

本题中的#运算符可以利用宏参数创建字符串。##运算符和#运算符一样也可以用于类函数宏的替换部分。另外....
发表于 2020-06-24 16:45 0次阅读
盘点一些在C语言中比较容易犯的错误

开展无人机教学过程中如何结合编程与硬件去定制编程...

当STEAM教育理念日益成为共识,加之政策导向、科技发展与商业利益驱动,中小学无人机教育也迅速进入大....
发表于 2020-06-23 15:50 109次阅读
开展无人机教学过程中如何结合编程与硬件去定制编程...

c语言入门:c语言的具体结构

变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前....
发表于 2020-06-23 15:38 112次阅读
c语言入门:c语言的具体结构

初学者开发人员都会犯的7个Python错误

这篇文章主要介绍了七个初学者常犯的Python调试错误,并告诉大家如何去避免这些错误。
发表于 2020-06-23 15:19 79次阅读
初学者开发人员都会犯的7个Python错误

为什么要将C语言作为入门语言?

编程是向计算机发出指令以执行特定任务或执行指令的行为,目前专业行业和学术界使用数百种编程语言。一个人....
发表于 2020-06-23 15:13 40次阅读
为什么要将C语言作为入门语言?

大学生如何学习FPGA初学者怎么学FPGA

无论是从自身的发展,还是从FPGA所拥有的巨大市场来讲,学习FPGA都是一个不错的选择,对大家来说FPGA技术...
发表于 2020-06-23 15:12 84次阅读
大学生如何学习FPGA初学者怎么学FPGA

算法:计算Fibonacci number的六个...

算法:计算Fibonacci number的六个方法
发表于 2020-06-22 17:27 124次阅读
算法:计算Fibonacci number的六个...

C语言算法分析:求最长的递增数列

求最长的递增数列(Longest Increasing sequence, LIS)是一个比较常见的....
发表于 2020-06-22 14:57 83次阅读
C语言算法分析:求最长的递增数列

虚拟机:编译器对C函数的名字修饰

虚拟机:编译器对C函数的名字修饰
发表于 2020-06-22 11:44 157次阅读
虚拟机:编译器对C函数的名字修饰

详解C语言二分查找算法细节

我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏....
发表于 2020-06-22 09:05 115次阅读
详解C语言二分查找算法细节

C语言:LeetCode 153寻找旋转排序数组...

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
发表于 2020-06-22 08:59 74次阅读
C语言:LeetCode 153寻找旋转排序数组...

查找山脉数组最大值的三个方法

何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:
发表于 2020-06-22 08:51 85次阅读
查找山脉数组最大值的三个方法

C语言: Leetcode 33搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
发表于 2020-06-22 08:51 75次阅读
C语言: Leetcode 33搜索旋转排序数组

C语言:leetcode 35搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会....
发表于 2020-06-22 08:40 58次阅读
C语言:leetcode 35搜索插入位置

单片机LCD1602的显示不正常是程序哪一部分错误?是不是ds1302的程序错误?

#ifndef _DS1302_H_ #define _DS1302_H_ #define uchar unsigned char sbit SCLK=P2^3;  //d...
发表于 2020-06-21 19:39 213次阅读
单片机LCD1602的显示不正常是程序哪一部分错误?是不是ds1302的程序错误?

PDIUSBD12USB固件编程与驱动开发

PDIUSBD12USB固件编程与驱动开发
发表于 2020-06-19 09:27 289次阅读
PDIUSBD12USB固件编程与驱动开发

在编程文件生成时遇到DRC错误怎么办

我在编程文件生成时遇到DRC错误: 错误:PhysDesignRules:2022 - 在块::>上发生引脚连接和/或配置问题。 R...
发表于 2020-06-19 06:51 17次阅读
在编程文件生成时遇到DRC错误怎么办

探讨单片机C语言编程理论知识

编程思路和算法决定一个程序的优劣,是单片机编程的大问题,只有在实际动手编写的时候才会有深切的感悟。一....
发表于 2020-06-18 16:06 205次阅读
探讨单片机C语言编程理论知识

单片机C语言编程:.H文件与.C文件的关系

经过查找资料得知,.H文件就是头文件,估计就是Head的意思吧,这是规范程序结构化设计的需要,既可以....
发表于 2020-06-18 15:18 182次阅读
单片机C语言编程:.H文件与.C文件的关系

linux下多线程编程中,一次等待多个信号量怎么解决

linux下多线程(非进程)编程中,一次等待多个信号量怎么解决? 并且等到信号量来了后,能判断是那一个​ 功能如同...
发表于 2020-06-17 05:55 41次阅读
linux下多线程编程中,一次等待多个信号量怎么解决

JTAG用于读取和编程的疑问谁来解答

我在JTAG链中只有一个V6。 在IMPACT中,我可以读取设备ID和状态位。 但是当我尝试编程FPGA时,它将...
发表于 2020-06-16 09:35 25次阅读
JTAG用于读取和编程的疑问谁来解答

virtex5 xc5vfx30t FPGA配置问题如何解决

这是一个xc5vfx30t板,我可以在jtag模式下使用测试位文件成功配置它,测试位很简单,只是用于打开LED。 但是我没有...
发表于 2020-06-16 07:15 19次阅读
virtex5 xc5vfx30t FPGA配置问题如何解决

有人用过C语言位域吗

typedef struct {u16 b :5; u16 g :6; u16 r :5; } RGB; RGB *rgb; tx=0xf40f;      &n...
发表于 2020-06-16 04:35 21次阅读
有人用过C语言位域吗

编程接口的规范说明

编程接口规范
发表于 2020-06-15 17:10 51次阅读
编程接口的规范说明

CC3200例程中OS的问题如何解决

您好,我在运行例程getting_started_with_wlan_station时,发现main函数里调用了osi.h中的函数,但是osi.h是有两套实现...
发表于 2020-06-15 06:10 19次阅读
CC3200例程中OS的问题如何解决

什么是脚本?---脚本程序学习

在脚本中编写VB脚本代码。可以象使用系统函数一样使用项目中完成的脚本。创建脚本时,确定其型号并定义传....
发表于 2020-06-12 15:39 202次阅读
什么是脚本?---脚本程序学习

博途STEP7-V15激活ProDiag功能

SIMATIC ProDiag是用于机器和工厂诊断的完全集成的TIA解决方案。它节省了在工程阶段在C....
发表于 2020-06-11 16:38 343次阅读
博途STEP7-V15激活ProDiag功能

库卡机器人编程之程序库

采用结构化编程,可以通过严密的分段结构来解决复杂的问题,使复杂的任务得以分解成若干个简单的分步任务,....
发表于 2020-06-11 15:56 325次阅读
库卡机器人编程之程序库

库卡机器人编程之BAS程序

注意:带S运动指令不会直接使用BAS的功能,但是会使用BAS文件里的其他带S的程序,如SBASE,S....
发表于 2020-06-11 15:44 198次阅读
库卡机器人编程之BAS程序

轻松掌握FANUC机器人编程 维护与外围集成

对于机器人的学习者和技术员来说,学习一款机器人后对自学其他机器人应能触类旁通,在各大机器人品牌中 F....
发表于 2020-06-10 14:37 302次阅读
轻松掌握FANUC机器人编程 维护与外围集成

C语言中对变量的使用需要注意的问题

只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更....
发表于 2020-06-09 10:39 197次阅读
C语言中对变量的使用需要注意的问题

linux中编译c语言的方法

以上就是linux中如何编译c语言的详细内容。
发表于 2020-06-09 08:58 83次阅读
linux中编译c语言的方法

可编程控制器常用的几种编程语言

可编程控制器目前常用的编程语言有以下几种:梯形图语言、助记符语言、顺序功能图、功能块图和某些高级语言....
发表于 2020-06-08 17:24 364次阅读
可编程控制器常用的几种编程语言

各路大牛的C语言编程建议和技巧

对于清晰的程序来说,排版规范一向都是至关重要的。当然,众所周知最有用的是缩进,但是当墨水遮盖了意图时....
发表于 2020-06-08 17:05 219次阅读
各路大牛的C语言编程建议和技巧

导电胶点胶加工时点胶机编程的几种方式介绍

导电胶点胶加工机器编程方式分为两种:一种是采用手持控制手柄的方式进行编程出控制出胶路径;一种是使用工....
发表于 2020-06-08 09:42 79次阅读
导电胶点胶加工时点胶机编程的几种方式介绍

C语言编程建议和技巧

对于变量名称,长度并不是名称的价值所在,清晰的表达才是。不常用的全局变量可能会有一个很长的名称,像 ....
发表于 2020-06-05 16:25 353次阅读
C语言编程建议和技巧

为什么C语言不会过时?

先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排....
发表于 2020-06-05 16:12 412次阅读
为什么C语言不会过时?

一些良好的和内存相关的编码实践

这是所有类型。即使迁移到 C++ 面向对象的语言,这些类型也不会有明显变化;无论数据是简单类型还是 ....
发表于 2020-06-05 16:08 226次阅读
一些良好的和内存相关的编码实践