三个编程思想:面向对象编程、面向接口编程、面向过程编程【概念解析系列_1】【C# 基础】
〇、前言
对于 .Net 中的编程思想还是十分重要的,也是编码出高效的程序的基础!
在使用之前了解其本质,那么用起来就游刃有余。下面来简单对比下三个编程思想,看下它们都是什么,它们之间又有什么关系。
一、对象、接口、过程
稍等,在介绍主角之前呐,先来了解下它们思想的基础是怎么回事。
对象
万事万物皆为对象。我们生活中的每一件东西都可以看作是一个对象,包括我们本身都是一个对象。
这是一种抽象的思想,我们将一件事物提取出特征和行为,将特征定义为属性,将行为封装成方法。
如,一个人,特征有姓名、年龄、性别、职业等等,行为有吃饭、睡觉、学习等等。
接口
接口声明了属性、方法和事件,这些都是接口的成员。
在 C# 8.0 之前,接口只包含成员的声明而不关心成员的实现,只是提供派生类实现的标准结构。在此之后时代变了,接口也可以拥有自己的带实现的方法,而且在未实现此方法的派生类中不能调用。
过程
顾名思义,就是广义上的一件事,通过一系列对象,按照顺序,执行一系列动作,从开始到完成的集合。
二、简介与示例
1.1 面向对象编程
面向对象编程(Object Oriented Programming:OOP),侧重点在对象,解决一个问题时,先将问题中的包含的事物抽象成对象概念,对象中包含具体的属性和行为,真正执行时再让每个对象去执行自己的某些方法,从而解决问题。
举个例子说明:
就拿日常洗手这个流程吧,简单点,水冲一下就好。
其中涉及的对象有:手、水龙头、水、毛巾。
- 针对“手”这个对象,有 5+5=10 根手指等属性,以及“开水龙头”“关水龙头”“洗”等动作,对应的就是方法。
- 针对“水龙头”这个对象,有开关、出水口等属性,以及“流出水”等动作。
然后就是执行:
- 手对象进行开水龙头动作,
- 水龙头对象进行流出水动作,
- 手对象进行洗动作,
- 手对象进行关水龙头动作,洗手过完成。
通过上边的例子知道,面向对象编程的方式,就是先将事件中的实体抽象成具体的对象,然后再将属性和方法封装到对象中,最后通过不同的对象执行相应的方法完成事件。
1.2 面向过程编程
面向过程编程(Procedure Oriented Programming:POP),侧重点在过程。解决一个事件的时候,先分析出处理这个事件需要的步骤,然后使用方法将这些步骤一步步实现,然后处理事件的时候,按照一定的顺序执行这些方法,全部执行一遍后事件就完成了。
还是上边那个洗手的例子:
面向过程,就需要先把吸收这个事件分步骤:
- 打开水龙头,
- 水龙头流水,
- 洗手动作开始,
- 关闭水龙头。
通过以上四步,完成洗手这个事件。
通过上边的例子知道,面向过程编程的思想在处理事件时,将整个事件拆分成一个个步骤,每个步骤封装成对应的函数,然后按照某个顺序去执行,来完成事件。
1.3 面向接口编程
面向接口编程(Interface Oriented Programming:OIP)是一种编程思想。接口作为实体抽象出来的一种表现形式,用于分离内部实现和外部沟通,最终达到内部变动而不影响外部与其他实现交互的目的。可以理解成,按照这种思想来设计编程的方式称为面向接口编程。
面向接口编程归属于面向对象编程。它是属于面向对象思想体系中的一部分,或者说它是面向对象编程体系中的思想精髓之一。
还是关于洗手的例子:
- 对于手这个对象,可以规范出一个接口,每个人的手都可以实现这个接口。这个接口都包含基本的属性,如肤色、手指等;都包含基本的方法,如洗手、开启水龙头等。
- 对于水龙头这个对象,可以规范出接口,每个不同的水龙头都可以实现这个接口。包含基本的属性,如材质、开关的方向等;包含基本的方法,如出水等
有了这两个接口,不管是谁、那个地方、那个国家的手或者水龙头,都可以实现上边两个接口,然后轻松完成洗手这个事件。
当然,以后如果科技发达了,不用水洗手了,直接用水龙头一照就可以了,那么我们就可以在水龙头接口里边,添加一个包含实现的方法(在 C# 8.0 之后可实现),这样也就不用担心已经实现了水龙头的类出错。
通过上边的例子知道,接口可以把某一类对象的统一属性和方法,声明在一起,然后实体类再来是现接口中的全部声明,然后在通过这个类实例化出具体的对象。这样就形成了高内聚低耦合、提高了可维护性,从而降低系统维护成本。
三、小小的总结
面向对象编程
适用于用户需求经常变化,性能要求不算最高的系统开发。
- 易理解:采用面向对象思想设计开发,更符合人的思考方式,可读性高。
- 易维护:面向对象有封装、继承、多态性的特性,即使需求有变动,需要维护的更多是局部模块,维护起来更加方便和更低成本。
- 易扩展:面向对象有封装、继承、多态性的特性,在设计系统阶段可以设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展。
- 易复用:也是同理,因为面向对象的三大特性,使得通用代码可以更简单的复用,提高开发效率。
- 性能会比面向过程低,编程复杂度较高
面向过程编程
适用于性能要求较高的系统开发。
- 简化了事件处理的过程,一步一步执行更加易于理解。
- 性能比面向对象编程高,面向对象编程中类调用过程需要加载、实例化,资源消耗更大。对性能要求高的产品,比如单片机、嵌入式开发、 Linux/Unix 等,一般采用面向过程开发。
- 没有面向对象编程易维护、易复用、易扩展
面向接口编程
- 程序结构清晰,使用方便
- 接口经过合理设计后,有利于程序设计的规范化,并可以并行开发,提高工作效率
- 实现了程序的可插拔性,对于不同的需求切换不同的实现,降低了耦合度,随着系统复杂性的提高这个优势会越来越明显
- 允许多重实现,弥补了继承的缺陷
- 增加了设计的复杂度,不佳的接口的设计会对所有使用接口的层都有影响,并且并不是所有的程序的都需要使用接口,接口只有在系统的复杂性达到一定程度才能体现出它的优势,否则只是纯粹的增加工作量
- 可能会降低代码的可复用性
- 可能会降低程序的执行效率
参考:https://zhuanlan.zhihu.com/p/407548596 https://zhuanlan.zhihu.com/p/75265007 https://blog.csdn.net/wantken/article/details/31763669
三个编程思想:面向对象编程、面向接口编程、面向过程编程【概念解析系列_1】【C# 基础】的更多相关文章
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
- Java中的面向接口编程
面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- java接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...
- java面向接口编程
在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...
- 杂项-编程:AOP(面向切面编程)
ylbtech-杂项-编程:AOP(面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一 ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
- 前端思想实现:面向UI编程_____前端框架设计开发
引子,我去小说看多了,写博客竟然写引子了!!!不过,没引子不知道怎么写了.言归正传吧,前端这个职业,也就这几年刚刚火起来的职业,以前那个混乱的年代,前端要么是UI设计师代劳解决问题,要么就是后端程序员 ...
随机推荐
- Java 网络编程 —— 创建多线程服务器
一个典型的单线程服务器示例如下: while (true) { Socket socket = null; try { // 接收客户连接 socket = serverSocket.accept() ...
- Swift WisdomProtocol 面向协议编程(下)
WisdomProtocol 面向协议编程(下) @[TOC] WisdomProtocol SDK 面向协议编程 # Welcome to use WisdomProtocol WisdomProt ...
- Prism Sample 2
例2引入了Region的概念. 例1中我们提到bootstrapper与app.xaml.cs,现在是这样的: public partial class App : PrismApplication ...
- Vue2到Vue3的改变
一.Vue2->Vue3 如果有Vue2的基础,并在此基础上学习Vue3,并不需要把完整的官网看完,我们只需要关注一下新功能和非兼容的变化即可进行开发. 二.Vue3变化 统一元素上使用的v-i ...
- 2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线、纵坐标上10条线的区域。给你三个 参数 x,y,k。返回“马”从(0,0)位置出发,必须走k步。最后落在(x,y)上的方法数有多少种?
2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线.纵坐标上10条线的区域.给你三个 参数 x,y,k.返回"马 ...
- vue全家桶进阶之路49:Vue3 环境变量
vue3 环境变量 在Vue3中,可以通过环境变量来管理应用程序中的配置.这些配置可以包括后端API的URL.API key.跟踪ID等等.在不同的开发.测试.生产环境中使用不同的配置是非常有用的.V ...
- AcWing 1209. 带分数
题目描述: 分析: 题意就是说给定一个整数N,求给定a,b,c,求a+b/c==N且a,b,c恰好包括0-9的答案的个数,需要注意的是,b/c可能得到的是小数,所以要尽量避免除法,将等式转换为乘法格式 ...
- 洛谷 P8742题解
简单版(P2347)传送门 原题传送门 有一道类似的题目(P2347),先扯一扯~ 1.P2347 题目分析 动态规划入门题(01背包可行性问题)~ 我们设 \(dp_j\) 为能否用砝码称出 \(j ...
- ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向
HTTPS是确保传输安全最主要的手段,并且已经成为了互联网默认的传输协议.不知道读者朋友们是否注意到当我们利用浏览器(比如Chrome)浏览某个公共站点的时候,如果我们输入的是一个HTTP地址,在大部 ...
- Git及可视化工具TortoiseGit的安装及使用
前言: TortoiseGit(中文称git小乌龟),是一款开源的git可视化gui工具,让你可以用图形化的界面来使用git,如此即使不会git命令也能流畅的使用git(我就是不想学git命令才使用的 ...