首页 > 编程语言 >面向对象编程思想杂谈

面向对象编程思想杂谈

时间:2024-05-24 15:28:37浏览次数:14  
标签:范式 思想 编程 杂谈 面向对象 抽象 OOP 面向对象编程 设计

最近在写一篇编程语言发展历史相关的书。正好在书中聊到了面向对象思想,摘录一些内容,跟大家分享。

什么是OOP?

面向对象编程(Object-Oriented Programming, OOP)自上世纪80年代兴起以来,便以其独特的理念和强大的抽象能力,成为软件工程领域的主流编程范式。面向对象编程通过引入类和对象的概念,提供了一种强大的抽象机制,使得软件设计能够更加贴近现实世界的逻辑结构,从而降低了软件的复杂性。
然而,随着技术的发展和应用范围的扩大,OOP的一些核心原则在实践中逐渐遭遇挑战,引发了人们对这一编程范式的反思。

OOP的核心价值

1. 现实需求的建模与抽象

OOP的首要价值在于其强大的建模能力。通过对象(类的实例)来代表现实世界中的实体,以及对象之间的关系和行为,OOP能够帮助开发者以一种自然且直观的方式理解复杂系统。这种基于对象的抽象,使得软件设计更加贴合业务逻辑,便于团队沟通和维护。

2. 代码分层与复杂度管理

通过封装(Encapsulation)原则,OOP将数据和操作数据的方法捆绑在一起,并限制外界对内部实现的直接访问,从而实现了代码的分层。除了可以保护数据的完整性,还降低了模块间的耦合度,使得系统在需求变更时,可以更加灵活地调整内部实现,而不影响外部接口,有效管理了软件的复杂度。

OOP在实践中偏离初心的分析

1. 过度抽象

在追求模型的完美性时,往往会陷入过度抽象的陷阱。过度抽象意味着创建了过多的层次和概念,超出了实际需求的必要,增加了代码的复杂度,还使得系统难以理解和维护。其根源在于对抽象的过度追求,忽视了“够用就好”的原则,以及对实际业务需求理解不足。
特别是面向对象中的多态的特性,提供高度抽象的能力外,运用不当也很容易对代码可读性产生负面影响。

2. 隐藏实现的副作用

隐藏实现本意是职责单一,模块隔离,但在实践中,它也可能成为“隐藏问题”的温床。这反映出开发者在设计类时,可能忽略了实现细节的重要性,或是缺乏对OOP深入实践的经验,没有形成良好的编码习惯。

3. 设计僵化与妥协

现实中的问题是复杂的,当抽象或设计不合理时,很少有人会去调整抽象或设计,而是肆意地破坏类的隐藏实现以达到需求目的,这就抛弃了面向对象最精华的部分。
在需求变更频繁的项目中,当抽象或设计不再适应新的需求时,由于重构成本高,开发者往往选择绕过原有的设计,直接修改类的内部实现,这破坏了封装原则,长远来看会累积技术债务。

4 何时使用抽象难以把握

假设有一个电子商务平台的商品管理系统,在面向对象思想的影响下,很容易创建出诸如ProductEntity、AbstractProduct、VirtualProduct、PhysicalProduct等多个层级的类,每个类只比前一个多了微小的差异。这样的设计看似严谨,实际上却导致了类爆炸,增加了系统复杂度,使得维护成本激增。当需求变更时,开发者更倾向于直接修改这些高度抽象类的内部,破坏了封装性,长此以往,整个系统变得难以维护和扩展。

一些有用的应对策略

1. 实践适度抽象

坚持“YAGNI”(You Aren’t Gonna Need It)原则,避免过度设计。在抽象时,应紧密联系实际需求,确保抽象层级清晰、必要,避免无意义的复杂度增加。

2. 设计灵活性与迭代改进

及时重构,当发现设计不再适合时,勇于调整和优化,而不是盲目妥协。利用设计模式和原则(如开闭原则、依赖倒置原则)来增加设计的灵活性和可扩展性。

3. 结合现代编程范式

面向对象编程并不是孤立存在的。随着软件行业的演进,函数式编程、响应式编程等现代编程范式也在不断融入日常开发。有效的软件架构往往需要多种编程范式的融合。例如,在处理复杂异步逻辑和数据流时,结合Reactives Programming可以让代码更加声明式、易于理解;在进行数据处理时,函数式编程的不可变数据和高阶函数特性,能有效减少副作用,提高代码的可测试性。面向对象设计应开放包容,与其他编程范式协同,共同解决实际问题。

4. 使用非面向对象友好的语言

已经有不少语言对面向对象嗤之以鼻,以go、rust为代表。学习掌握这些语言,尝试使用更简单直观的方式实现功能。感受这些语言的设计原则和特性,促使我们思考如何在非面向对象的框架下,依然高效、安全地实现复杂系统的设计与构建。

结语

面向对象编程作为软件开发的重要范式,其核心价值在于通过对象建模和封装实现对现实世界的抽象和逻辑复杂度的管理。我们在享受OOP带来便利的同时,也要警惕其潜在的陷阱。
面向对象思想本身并未过时,关键在于如何正确地掌握并适度应用,成为既能把握理论精髓又能灵活应变的开发者。

标签:范式,思想,编程,杂谈,面向对象,抽象,OOP,面向对象编程,设计
From: https://blog.csdn.net/hebhljdx/article/details/139175202

相关文章

  • 【测试杂谈】测试前景展望:当前趋势、技术革新与未来发展潜力
    一、引言随着信息技术的飞速发展,软件行业在全球经济中扮演着越来越重要的角色。作为软件质量保证的关键环节,测试行业也迎来了前所未有的发展机遇。本文将从当前测试行业的发展趋势、技术革新以及未来发展潜力三个方面,对测试前景进行深入探讨,为测试人员提供有价值的信息和启......
  • 分治思想求众数_虽然效率不好_但是便于学习分治的思想方法
    //解释:/*采用分治法的思想在这道题中的体现就是对于一个区间去分成两份,然后count函数的作用是对于一个区间段的函数去进行统计某个数的个数find函数的作用是负责把区间分开,然后对比两个区间中的出现次数更多的数,把这个数作为这两个区间合成的区间的众数。对比的依据就是count......
  • hash思想与字符串
    哈希思想与字符串窥见前两天听了一个学长讲字符串,KMP,Tire,DFA,AC自动机,马拉车...叽里呱啦的我这个小蒟蒻也听不明白。虽然但是学长在最后清了清嗓子,敲了敲黑板,拿出了镇场子的家伙——hash算法。听完之后,满座惊呼,醍醐灌顶,恍然大悟。我也这般激动,便趁着这股劲写下这篇窥见,随便纪念这......
  • 面向对象编程(basic)
    面向对象内容的三条主线:Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类面向对象的特征:封装、继承、多态、(抽象)其他关键字的使用:this、super、package、import、static、final、interface、abstract等1.面向对象VS面向过程面向过程思想线性思维步......
  • Python进阶之面向对象编程
    【一】人狗大战小游戏【1】游戏前提分析人可以打狗,狗掉血,狗可以咬人,人掉血人的属性有名字、年龄、伤害、血量、类型狗的属性有名字、年龄、伤害、血量、类型【2】游戏实现(1)定义人和狗的属性#【1】用字典定义,代码较冗余dog1={'name':'狗蛋','d_type':'中......
  • Java面向对象编程概念
    面向对象编程(OOP)概念,如类、对象、继承、封装、多态概念:面向对象编程(Object-OrientedProgramming,简称OOP)是一种程序设计范型或编程范式。这种范式使用“对象”来设计应用程序和系统的各个部分。在面向对象编程中,万物皆对象,程序被视作一系列对象的集合,这些对象通过消息传递来交互......
  • [java与https]第一篇、证书杂谈
    一、算法、密钥(对)、证书、证书库令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客。令狐冲说,你把你租马合同给我看看,这就是证书。没成想这租客是个二道贩子,他呼啦一下掏出来一个装满租马合同的文件......
  • 07.面向对象编程
    Java的核心思想就是OOP(面向对象编程)1.面向对象面向对象编程:Object-OrientedProgramming,OOP)本质:以类的方式组织代码,以对象的组织(封装)数据2.对象的创建2.1.创建与初始化对象创建对象:new使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化......
  • Java面向对象编程
    什么是面向对象:以类的方式组织代码,以对象的来组织(封装)数据三大特性:封装,继承,多态构造器:和类名相同,没有返回值;作用:new本质就是在调用构造方法,默认使用无参构造;还可以初始化对象的值;注意:定以有参构造之后,若还想使用无参构造的话必须要显示的定义;封装:数据的隐藏;通常应禁止......
  • 快速幂的思想和code实现
     解法:浮点数快速幂的应用快速幂的思想就是倍增的思想5的20次方如果是一次一次乘需要5*5*5*5*5*5………20次乘法快速幂就是20(10)=00010100(2)20=4+16所以原来的就变成了:(a)(*)(a)a2(a*a)(*)(a*a)a4((a*a)*(a*a))(*)((a*a)*(a*a))a8(((a*a)*(a*a))*((a*a)*(a*a)......