连载:面向对象葵花宝典:思想、技巧与实践(4) - 面向对象是瑞士军刀还是一把锤子?

本文主要是介绍连载:面向对象葵花宝典:思想、技巧与实践(4) - 面向对象是瑞士军刀还是一把锤子?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要面向对象?

可以说,面向过程和计算机是如影随形的。从计算机诞生之日起,面向过程就是占据着主导地位的思想,即使到了现在,面向过程也是无处不在的,C语言、操作系统、协议栈、驱动系统,都是面向过程的代表。 


那为什么还会有面向对象的诞生并流行呢?当然是面向过程存在某些不足,如果面向过程足够好,谁还费心费力的去搞另外一套呢? 


前面我们提到,面向过程是一种机器的思想,我们以流水线作为类比,那么我们先抛开面向过程,来看看流水线有什么不足。 

举个简单的流水线例子:啤酒生产流水线。啤酒生产流水线分为“洗瓶”,“灌装”,“压盖”,“杀菌”等几个阶段,这些阶段总体上来说对生产一瓶醋是差不多的,但是一条啤酒生产线能够生产醋么?应该是不行的,即使行,估计也要换一些东西,但是换了东西后,又不能生产啤酒了。 

面向过程同样就有流水线的这个缺点,即:流程和原料相对固定,扩展比较麻烦 


对于工业系统来说,流水线的缺点几乎可以微不足道,因为工业化讲究的是效率,而扩展性却不是那么重要,一旦一条生产线建成,至少需要运行几年,甚至运行十几年都有。 

而对于软件系统来说,很难想象一个软件开发完成后,几年都不变,大部分的情况是,软件可能是1年扩展多次,甚至还没有开发完,客户新的需求又来了。 


在软件系统这种环境下,面向过程显得就比较吃力了,每次需求的变更,可能都要将流程的每个步骤、原料、中间产品都进行修改,这样的代价在软件系统中几乎是不可接受的,因为每次修改都需要对全系统改动一次,不但工作量上大大增加,同时风险也是大大增加。 


而面向对象正是为了解决面向过程的这个缺点儿诞生的,因此面向对象其实也不是什么复杂和玄妙的技术,面向对象思想的核心是“可扩展性”! 

注:中文“可扩展性”对应英文有两种解释:extensibility 和 scalability,extensibility指系统需求变化后,能够比较容易的扩展以支持新需求;scalability指系统访问压力增加后,能够通过简单的增加更多硬件设备以支撑访问压力,又翻译为“可伸缩性”。 本文的可扩展性是指extensibility。


面向对象应用范围

能做什么?

既然面向对象思想的核心是“可扩展性”,那么其适用范围就显而易见了:经常变化的地方就是面向对象应用的地方。 

对于软件系统来说,常见的可变的主要集中在客户需求部分,而不变的一般都是属于计算机系统的基础。 

因此,操作系统、数据库、协议(TCP、3GPP等)这些并不适合面向对象大展身手,因为这些基础软件一般都比较稳定(相对稳定,并不是不变)。而对于企业应用、互联网等应用,需求经常变更,功能不断扩展,这正是面向对象大展身手的地方。

 

不能做什么?

下图是一个软件质量属性的全图: 

 

大家可以看到,“可扩展性”只是软件质量属性中很小的一部分,其它的属性都不是面向对象能够解决的。 

明白了面向对象的特点和适用范围,是应用面向对象的关键,经过前面的分析,我们知道,面向对象不是瑞士军刀,而只是一个普通的锤子而已千万不要拿着锤子到处敲!

这篇关于连载:面向对象葵花宝典:思想、技巧与实践(4) - 面向对象是瑞士军刀还是一把锤子?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134969

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬