且谈面向对象

面向对象的思想到底好不好,谁也说不好。但是它经历了这么多的风风雨雨发展到今天,势必有它的生存之地。比如许多一开始不支持面向对象的语言也都发展出了面向对象的应用,比如大前端的jsvascript。在面向对象之上,“四人帮”提出的设计模式,让面向对象在使用和开发的时候有规律可循,使得我们可以在体系内进行创作,一定程度上保证了代码的效率。但是也曾经有人提出了面向对象的反设计模式,虽然存活时间不长,但是我觉得这种对面向对象的挑战,更能使得我们在面向对象使用的时候加入更多的反思和思考,一个程序到底是否值得去用面向对象的思想去解决,毕竟直接用函数来解决显得更直接,这要比直接“套用”面向的思想更能帮助我们去解决实际的问题。

面向对象思想出现之前的服务方式

在面向对象思想出现之前,其实我们的程序就是一堆变量和函数,就拿web作为例子,假设我们的后台服务器语言用的java,当一群web用户去请求服务端资源的时候,其实服务端就是在不断的执行这一堆函数去为用户服务的,也就是一种“压栈”似的处理方法。如下图,当客户端请求到来之后,server端其实就是执行一堆变量和函数来对客户端进行服务。

SERVER
fun...
fun1
fun2
fun4
http listener
client 1
client 2
client ...
DB

上面这种方式其实很容易理解其不足,当项目变大的时候,函数之间的联系越来越多,也越来越密切,导致整个系统各个部分纠缠复杂,使得真个系统难于维护和扩展。

面向对象出现之后

面向对象其实也是为了解决上面的问题而出现的,其实面向对象思想和模块化的思想在一定程度上是不谋而合的,我们不妨叫它们“大模块化”和“小模块化”也不为过。
面向对象思想的出现使得我们在写函数的时候就是不是像以前那样毫无章法的去进行“创作”,而是在一个体系内进行工作,拿一句名言来说,“在框架内干活,再烂也烂不到哪去”。
回到刚才的web的例子。中间server就不是这种烦乱不堪的状态了,而是在面向对象思想的指导下进行写代码。

SERVER
CLIENT
start
object
end
class
interface
client 1
client 2
client ...
DB

为什么要使用面向对象

其实,对于计算机来说,越是结构化对东西才是越简单的,AI也正是在突破这种限制。我们可以从两点来看,程序执行的机构化:程序的执行不就只有顺序、判断和循环三种吗。第二点则是数据的结构化,也就是面向对象了。(松本行宏)
因此编程应该,简单&抽象 ------ 抽象完成后才能简单,简单的前提是我们能够抽象好。

总结

面向对象思想的出现确实解决了很多问题,让编码方式更加优雅,维护性和扩展性更强。但是在工作中,大多数人总是将维护性和扩展性等一些所谓高大上的词语挂在嘴边,好像任何一个程序,任何一个应用都要满足这些标准才好,这毫无疑问会增加我们思考和理解的负担。个人而言,在一个就几个页面的程序中,如果我们可以预想到的项目大小只是一个小项目而言,直接用以前的面向函数编程就足够用,抽象的层级越高,程序对于我们来说则越不容易理解,维护成本范围更大,适得其反。当然,你遇到java这种纯粹的面向对象语言也没办法,你必须写class/interface这样的“东西”你的程序才会运行。这也是为什么很多人不喜欢java的原因之一(也有非常多的人喜欢的),借用网上的一句话说,“其实java最大的优势就是找工作”。python/js等支持面向对象的语言之所以有一部分人喜欢,也是因为其兼顾了面向函数编程和面向对象编程的思想。其实,归根结底,用最简单的方式解决问题才是最重要的,思想只是在我们遇到问题的时候给力我们更过的可能性,但是在简单的问题中去套用更抽象的思想的时候很可能出现预想不到的后果。
BYW,但是我觉得在去学习一门新技术的时候,一定要在简单的问题上套用更抽象的思想,这有助于我们去思考和升华对思想的认识。

你可能感兴趣的:(others)