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语言之—模块化编程

C语言编程的准则、设计模式、软件架构及思想_第1张图片

软件分层架构

分层架构是运用最为广泛的架构模式,几乎每个软件系统都需要通过层(Layer)来隔离不同的关注点(Concern Point),以此应对不同需求的变化,使得这种变化可以独立进行;此外,分层架构模式还是隔离业务复杂度与技术复杂度的利器。

操作系统和计算机网络的使用了软件分层架构,我们学习操作系统和计算机网络也一般是一层一层的来学习的。

具有良好模块设计的代码,至少分为两种形式:

  • 整体设计没有层次之分,但也有独立的子模块,子模块彼此之间耦合甚少,这些子模块构成了一个软件层,共同为上层应用提供服务;
  • 整个库/软件拥有明显的层次之分,从最底层,与应用业务毫无相关的一层,到最顶层,完全对应用进行直接实现的那一层,每一个相对高层的软件层依赖于更底层的软件层,逐层构建。

上述两种形式并非完全分离,在分层设计中,某一层软件层也可能由若干个独立的模块构成。另一方面,这里也不会绝对说低层模块就完全不依赖于高层模块。这种双向依赖绝对不是好的设计,但事实上我们本来就无法做出完美的设计。

在软件架构中,经典三层架构自顶向下由用户界面层(User Interface Layer)、业务逻辑层(Business Logic Layer)与数据访问层(Data Access Layer)组成。该分层架构之所以能够流行,是有其历史原因的。在提出该分层架构的时代,多数企业系统往往较为简单,本质上都是一个单体架构(Monolithic Architecture)的数据库管理系统。这种分层架构已经是Client-Server架构的进化了,它有效地隔离了业务逻辑与数据访问逻辑,使得这两个不同关注点能够相对自由和独立地演化。一个经典的三层架构如下所示:
C语言编程的准则、设计模式、软件架构及思想_第2张图片

可重用性

代码可重用的精髓,我认为可以用unix哲学的两个点来说明:

Write programs that do one thing and do it well. 写出来的代码只做一件事,并且把这件事作好。
Write programs to work together. 写出来的代码,相互之间要一起协作。
可重用性也是在

2. 区别和联系

面向过程是软件的基础,面向对象编程也包括了面向过程,可以这么说,面向对象是在面向过程的基础上发展而来的。

面向接口编程则不是和上面的面向过程和面向对象是同一层面的概念。在模块化编程中,我们通过.h文件暴露接口给调用者,在软件分层架构中,下层也要向上层通过接口提供服务。

模块化编程则是按照功能来进行模块划分,在模块内,我们的编码可以使用面向过程、面向对象。

软件分层则相比模块化更深入了一步,将软件分成了几层,每一层中可能包括几个模块,有句话叫做,分层是大智慧,分模块是小智慧。一般使用了软件分层的架构在每一层中都会继续分模块。

3. 项目代码架构思路

在我们进行了系统设计之后,我们一般构造软件架构的思路都是先构建抽象程度最高的分层,再根据每个分层需要提供的内容决定每个分层中应该有哪些模块。

后面就是数据结构的设计及每个模块的具体实现。

你可能感兴趣的:(软件架构,设计模式,c语言)