C语言编程的准则、设计模式、软件架构及思想
文章目录
- 1. 概念
- 面向过程
- 面向对象
- 面向接口编程
- 模块化编程
- 软件分层架构
- 可重用性
- 2. 区别和联系
- 3. 项目代码架构思路
在文章开始之前,我们先明确一些概念,当然有些概念本身就没有统一权威的定义,但是我们还是会进行说明,让大家在深入的过程中有相应的概念,不会混淆文章中的某些内容。
1. 概念
面向过程
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayjixD7M-1625671280263)(https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210707213328596.png)]
面向过程是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
面向对象
在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcCNky9C-1625671280264)(https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210707213503291.png)]
想要详细了解可以看这篇博文:面向过程 VS 面向对象
面向接口编程
接口这个概念我们一定不陌生,实际生活中最常见的例子就是:插座!
我们只需要事先定义好插座的接口标准,各大插座厂商只要按这个接口标准生产,管你什么牌子、内部什么电路结构,这些均和用户无关,用户拿来就可以用;而且即使插座坏了,只要换一个符合接口标准的新插座,一切照样工作!
同理,实际代码设计也是这样!
我们在设计一个软件的代码架构时,我们都希望事先约定好各个功能的接口(即:约定好接口签名和方法),实际开发时我们只需要实现这个接口就能完成具体的功能!后续即使项目变化、功能升级,程序员只需要按照接口约定重新实现一下,就可以达到系统升级和扩展的目的!
模块化编程
模块化是一种处理复杂系统分解为更好的可管理模块的方式。
所谓的模块化开发就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。模块化开发的基础就是函数。模块化开发使用代码耦合度降低,模块化的意义在于最大化的设计重用,以最少的模块、零部件,更快速的满足更多的个性化需求。
模块化编程的核心思想也正是如此: 将系统的各个功能进行封装,变成一个个独立的模块,其他人只需要使用你所提供的函数和变量等,就可以完成相对应的功能
模块化的本质也就是,新建一个.c和.h文件,
.c文件里面存放着你所构建的函数,功能,等等,而当你想让他可以被其他文件使用时,这时候便需要在对应的.H之中声明,
在外部调用时,只需要#include包含相对应的.h 即可。下图是一个嵌入式软件项目中的程序结构图。博客连接:嵌入式C语言之—模块化编程
软件分层架构
分层架构是运用最为广泛的架构模式,几乎每个软件系统都需要通过层(Layer)来隔离不同的关注点(Concern Point),以此应对不同需求的变化,使得这种变化可以独立进行;此外,分层架构模式还是隔离业务复杂度与技术复杂度的利器。
操作系统和计算机网络的使用了软件分层架构,我们学习操作系统和计算机网络也一般是一层一层的来学习的。
具有良好模块设计的代码,至少分为两种形式:
- 整体设计没有层次之分,但也有独立的子模块,子模块彼此之间耦合甚少,这些子模块构成了一个软件层,共同为上层应用提供服务;
- 整个库/软件拥有明显的层次之分,从最底层,与应用业务毫无相关的一层,到最顶层,完全对应用进行直接实现的那一层,每一个相对高层的软件层依赖于更底层的软件层,逐层构建。
上述两种形式并非完全分离,在分层设计中,某一层软件层也可能由若干个独立的模块构成。另一方面,这里也不会绝对说低层模块就完全不依赖于高层模块。这种双向依赖绝对不是好的设计,但事实上我们本来就无法做出完美的设计。
在软件架构中,经典三层架构自顶向下由用户界面层(User Interface Layer)、业务逻辑层(Business Logic Layer)与数据访问层(Data Access Layer)组成。该分层架构之所以能够流行,是有其历史原因的。在提出该分层架构的时代,多数企业系统往往较为简单,本质上都是一个单体架构(Monolithic Architecture)的数据库管理系统。这种分层架构已经是Client-Server架构的进化了,它有效地隔离了业务逻辑与数据访问逻辑,使得这两个不同关注点能够相对自由和独立地演化。一个经典的三层架构如下所示:
可重用性
代码可重用的精髓,我认为可以用unix哲学的两个点来说明:
Write programs that do one thing and do it well. 写出来的代码只做一件事,并且把这件事作好。
Write programs to work together. 写出来的代码,相互之间要一起协作。
可重用性也是在
2. 区别和联系
面向过程是软件的基础,面向对象编程也包括了面向过程,可以这么说,面向对象是在面向过程的基础上发展而来的。
面向接口编程则不是和上面的面向过程和面向对象是同一层面的概念。在模块化编程中,我们通过.h文件暴露接口给调用者,在软件分层架构中,下层也要向上层通过接口提供服务。
模块化编程则是按照功能来进行模块划分,在模块内,我们的编码可以使用面向过程、面向对象。
软件分层则相比模块化更深入了一步,将软件分成了几层,每一层中可能包括几个模块,有句话叫做,分层是大智慧,分模块是小智慧。一般使用了软件分层的架构在每一层中都会继续分模块。
3. 项目代码架构思路
在我们进行了系统设计之后,我们一般构造软件架构的思路都是先构建抽象程度最高的分层,再根据每个分层需要提供的内容决定每个分层中应该有哪些模块。
后面就是数据结构的设计及每个模块的具体实现。
C语言编程的准则、设计模式、软件架构及思想相关推荐
- c语言编程-小明的加减法(叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:)
c语言编程-小明的加减法 主要思想:整数的逆向输出 #include<stdio.h> int main() {int a,b,x,y,s,t,c=0,d=0;scanf("%d ...
- 【转载】C语言嵌入式系统编程修炼之二:软件架构篇
C语言嵌入式系统编程之软件架构篇 模块划分 模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设 ...
- Python编程风格和设计模式
http://blog.csdn.net/pipisorry/article/details/26840461 the Zen of Python Python的禅学 >>> imp ...
- Java多线程编程实战指南+设计模式篇pdf
下载地址:网盘下载 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而 解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然 ...
- PHP代码中的情话,php语言编程情话
为什么PHP是最好的编程语言呢 没有最好只有最合适. 无故比较语言的优劣是没有意义的. PHP是目前最先进的编程语言吗 Java和PHP语言两者各有千秋,都有自己独有的特点和应用场景,两者的对比. 1 ...
- c语言设计程序实现顺序冒泡_计算机C语言编程设计专业知识题库汇总
下列关于栈叙述正确的是(). A.算法就是程序 B.设计算法时只需要考虑数据结构的设计 C.设计算法时只需要考虑结果的可靠性 D.以上三种说法都不对 答案:D 下列叙述中正确的是(). A.有一个以上 ...
- plc 编程 c语言编程实例,PLC面向对象编程和梯形图编程,谁OUT了?
在工业自动化领域,梯形图逻辑仍然是最常用的编程语言之一,但对于更加复杂的控制对象,面向对象编程不失为一种高效率的方式.下面先来谈谈面向对象编程: 面向对象编程是计算机高级语言的一种先进的编程模式,在工 ...
- C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(三)
文章目录 C 语言编程框架 LW_OOPC 介绍(三) 方案的可扩展性如何? LW_OOPC最佳实践 LW_OOPC的优点: LW_OOPC的缺点: 总结: 幕后花絮: 参考资料: C 语言编程框架 ...
- 更适合用c语言编程的情况是,不大适合用汇编语言编程,更适合用C语言编程的情况是( )。...
不大适合用汇编语言编程,更适合用C语言编程的情况是( ). 挪威的滑雪运动,不大编语距今约有四千多年的历史,是世界滑雪的故乡. 适合不同平台的点位不一样 整数历史点位对股市有支撑作用,用汇言编C语言编 ...
最新文章
- java wms open,OpenLayers - 调用WMS安全层
- 同网段不同网段主机间通信原理
- Unbuntu 下安装node 环境
- jquery 弹出窗口_jQuery弹出窗口和工具提示窗口动画效果
- 使用Kmeans聚类分析对复杂的数据进行分类
- java mybatis 代码生成器_mybatis自动生成java代码
- 国二c语言程序设计技巧,计算机二级C语言考试必看技巧
- 土地土壤数据下载网站整理
- 科赫雪花曲线 matlab编程,科赫雪花曲线的MATLAB编程实现.doc
- 089【RTKLIB源码之postpos-5】pppos
- UEFI学习(一)-EDK II环境搭建
- 【C#进阶四】详细总结C#中的文件和I/O流之文件和目录(File 、 FileInfo、Directory、DirectoryInfo和Path)
- 单例模式、适配器模式
- 内蒙古对口升学2018年计算机,2018年届对口升学考试计算机专业月考三试题.doc
- 测试是ufs3.0的软件,可怕!UFS 3.0测试首曝光:速度竟是UFS 2.1的3倍
- 向量范数和矩阵范数的理解
- 实例【GPA计算器】的制作过程之MFC初体验收获
- 统计学(3)——数据抽样方法的细节
- linux教程超详细,linux搭建node超详细教程
- 科大奥瑞物理实验——声速的测量
热门文章
- 关于STM32G系列MCU芯片烧录挂掉解决方法
- 5G建设应用产业链全视图!
- matlab死亡时间推测实验,死后间隔时间推断的新研究.pdf
- 电子与信息工程专业必读书籍1000本
- 【数据分析】基于matlab GUI齿轮箱振动数据分析【含Matlab源码 2122期】
- Atitit.月度计划日程表 每月流程表 v7 raf Ver history V7 add fest list 00cate	Item	Imp	desc	R0 stat Body	Sport
- 红米ac2100有ipv6吗_红米AC2100刷入老毛子Padavan,配置锐捷认证,ipv6
- java基础之封装数据类型
- nt:手动安装Firefox的Flash插件
- 英语学习得建议和忠告 附送下载资料无数