搜索
bottom↓
回复: 36

转——怎么样知道自己有没有掌握面向对象编程的思想

  [复制链接]

出0入8汤圆

发表于 2017-5-19 17:04:00 | 显示全部楼层 |阅读模式
本帖最后由 Jmhh247 于 2017-5-19 16:58 编辑

作者:在好
链接:
https://www.zhihu.com/question/20925030/answer/102239120
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入


•面向接口编程
那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力。然而,你一定曾为这些“高深术语”感到过困扰。也许时至今日,你仍对它们一知半解。不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心。


•内聚       
内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做。  
经典理论告诉我们,程序的两大要素:一个是数据(data),一个是操作(opration)。而 PASCAL之父Nicklaus Wirth则进一步提出了“程序 = 数据结构 + 算法”的著名公式。虽然提法上有所差异,但是其根本内涵却是一致的,微妙的差别在于,“数据 + 操作”是微观的视域,“数据结构 + 算法”则是中观的视域。而在宏观的视域下,我认为“程序 = 对象 + 消息”。对象是什么?对象就是保管好自己的东西,做好自己的事情的程序模块——这就是内聚!传统的面向过程编程方法由于割裂了数据结构和算法,使得软件的内聚性普遍低迷,曾一度引发了软件危机。试想,大家都自己的东西不好好保管,自己的事情也不好好做,不引发危机才怪呢!当然,对象的内聚只是内聚的一个层次,在不同的尺度下其实都有内聚的要求,比如方法也要讲内聚,架构也要讲内聚。      
《周易•彖传》中讲“乾道变化,各正性命,保合太和,乃利贞”,就是要求每一个个体因循着各自的禀赋而努力成就各自的品性,然后各自保全,彼此和合,最终达成宇宙的完满状态。《论语•宪问》中,子路问君子。子曰:“修己以敬。”曰:“如斯而已乎?”曰:“修己以安人”,更是明确的教导我们要不断提高自身的内聚性,最大限度地减少给他人造成的麻烦,从而达到安人、安百姓、安天下的目标。我想,成长的过程就是一个不断提升内聚的过程。“自己的东西自己保管,自己的事情自己做”,这些孩提时代的教诲,放到今天仍能让不少“大人”脸红不已。太多的人保管不好自己的“东西”,保管不好自己的身体,保管不好自己的婚姻,更保管不好自己如蛛丝般震颤飘荡的狂乱的心。至于做好自己的事情,则更是惘然,甚至很多人连自己的事情是什么都搞不清楚,因此浑浑噩噩,饱食终日。内聚,是一个值得我们好好反思的问题。


•依赖•耦合       
在面向对象编程中,对象自身是内聚的,是保管好自己的数据,完成好自己的操作的,而对外界呈现出自己的状态和行为。但是,没有绝对的自力更生,对外开放也是必要的!一个对象,往往需要跟其他对象打交道,既包括获知其他对象的状态,也包括仰赖其他对象的行为,而一旦这样的事情发生时,我们便称该对象依赖于另一对象。只要两个对象之间存在一方依赖一方的关系,那么我们就称这两个对象之间存在耦合。 比如妈妈和baby,妈妈要随时关注baby的睡、醒、困、哭、尿等等状态,baby则要仰赖妈妈的喂奶、哄睡、换纸尿裤等行为,从程序的意义上说,二者互相依赖,因此也存在耦合。首先要说,耦合是必要的。我们来看以下这个实验。
【王阳明与山中之花】

View Code      
由于王阳明这个对象不依赖山花这个对象,又没有其他的方式来获知山花的盛开状态,所以他要么选择不说,要么瞎说,但不说编译是通不过,而瞎说作为王阳明来讲也是通不过的,所以这个系统是无法成立的。要想系统成立,必须要这样写:        
public bool AdmireFlowers()
        {
            return flower.IsBloomed; ;
        }
      无论这个山花对象是怎么来的,作为参数传入还是作为属性设置、还是在内部构造出来,总之,王阳明与山花之间发生了依赖,二者之间产生了耦合。 当然,这是一个很浅显的问题。有趣的是王阳明对此事的看法:“你未看花时,花与你同寂;你来看花,花于你则一时分明起来。可见心外无物!”王阳明讲的是对的!“心外无物”翻译技术语言是这样的:不存在耦合的两个对象必然拿不到对方的引用!

•耦合度•解耦和     
耦合的程度就是耦合度,也就是双方依赖的程度。上文所说的妈妈和baby就是强耦合。而你跟快递小哥之间则是弱耦合。一般来说耦合度过高并不是一件好事。就拿作为IT精英的你来说吧,上级随时敦促你的工作进度,新手频繁地需要你指导问题,隔三差五还需要参加酒局饭局,然后还要天天看领导的脸色、关注老婆的心情,然后你还要关注代码中的bug 、bug、bug,和需求的变化、变化、变化,都够焦头烂额了,还猝不及防的要关注眼睛、颈椎、前列腺和头发的状态,然后你再炒个股,这些加起来大概就是个强耦合了。从某种意义上来说,耦合天生就与自由为敌,无论是其他对象依赖于你,还是你依赖其他对象。比如有人嗜烟、酗酒,你有多依赖它们就有多不自由;比如有人家里生了七八个娃,还有年迈的父母、岳父母,他们有多依赖你,你就有多不自由。所以老子这样讲:“五音令人耳聋,五色令人目盲,驰骋狩猎令人心发狂,难得之货令人行妨。”卢梭也是不无悲凉的说“人生而自由,却又无往而不在枷锁中”。因此,要想自由,就必须要降低耦合,而这个过程就叫做解耦和。

•依赖倒置(Dependence Inversion Principle)      
解耦和最重要的原则就是依赖倒置原则:      
高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。      
《资本论》中都曾阐释依赖倒转原则——在商品经济的萌芽时期,出现了物物交换。假设你要买一个IPhone,卖IPhone的老板让你拿一头猪跟他换,可是你并没有养猪,你只会编程。所以你找到一位养猪户,说给他做一个养猪的APP来换他一头猪,他说换猪可以,但是得用一条金项链来换——所以这里就出现了一连串的对象依赖,从而造成了严重的耦合灾难。解决这个问题的最好的办法就是,买卖双发都依赖于抽象——也就是货币——来进行交换,这样一来耦合度就大为降低了。      
再举一个编程中的依赖倒置的例子。我们知道,在通信中,消息的收发和消息的处理往往密不可分。就一般的通信框架而言,消息的收发通常是已经实现了的,而消息的处理则是需要用户来自定义完成的。先看一个正向依赖的例子:轻量级通信引擎StriveEngine。tcpServerEngine是StriveEngine.dll提供通信引擎,它发布有一个MessageReceived事件。假设我定义了一个CustomizeHandler类来用于消息处理,那么CustomizeHandler的内部需要预定tcpServerEngine的MessageReceived事件,因此customizeHandler依赖于tcpServerEngine,这就是一个普通的依赖关系,也就是高层模块依赖于低层模块。



而ESFramework通信框架则应用了依赖倒转原则。ESFramework定义了一个IcustomizeHandler接口,用户在进行消息处理时,实现该接口,然后将其注入到rapidPassiveEngine客户端通信引擎之中。  
View Code      
很明显,相比于上一个例子,这里的依赖关系变成了rapidPassiveEngine依赖于customizeHandler,也就是说依赖关系倒置了过来,上层模块不再依赖于底层模块,而是它们共同依赖于抽象。rapidPassiveEngine依赖的是IcustomizeHandler接口类型的参数,customizeHandler同样是以实现的接口的方式依赖于IcustomizeHandler——这就是一个依赖倒置的典范。

•控制反转(Inversion of Control)      
控制反转跟依赖倒置是如出一辙的两个概念,当存在依赖倒置的时候往往也存在着控制反转。但是控制反转也有自己的独特内涵。
首先我们要区分两个角色,server 跟 Client,也就是服务方和客户方。提供服务端的一方称为服务方,请求服务的一方称为客户方。我们最熟悉的例子就是分布式应用的C/S架构,服务端和客户端。其实除此之外,C/S关系处处可见。比如在TCP/IP协议栈中,我们知道,每层协议为上一层提供服务,那么这里就是一个C/S关系。当我们使用开发框架时,开发框架就是作为服务方,而我们自己编写的业务应用就是客户方。当Client调用server时,这个叫做一般的控制;而当server调用Client时,就是我们所说的控制反转,同时我们也将这个调用称为“回调”。控制反转跟依赖倒置都是一种编程思想,依赖倒置着眼于调用的形式,而控制反转则着眼于程序流程的控制权。一般来说,程序的控制权属于server,而一旦控制权交到Client,就叫控制反转。比如你去下馆子,你是Client餐馆是server。你点菜,餐馆负责做菜,程序流程的控制权属于server;而如果你去自助餐厅,程序流程的控制权就转到Client了,也就是控制反转。


控制反转的思想体现在诸多领域。比如事件的发布/ 订阅就是一种控制反转,GOF设计模式中也多处体现了控制反转,比如典型的模板方法模式等。而开发框架则是控制反转思想应用的集中体现。比如之前所举的ESFramework通信框架的例子,通信引擎回调用户自定义的消息处理器,这就是一个控制反转。以及ESFramework回调用户自定义的群组关系和好友关系,回调用户自定义的用户管理器以管理在线用户相关状态,回调用户自定义的登陆验证处理,等等不一而足。再比如与ESFramework一脉相承的轻量级通信引擎StriveEngine,通过回调用户自定义的通信协议来实现更加灵活的通信。      
由此我们也可以总结出开发框架与类库的区别:使用开发框架时,框架掌握程序流程的控制权,而使用类库时,则是应用程序掌握程序流程的控制权。或者说,使用框架时,程序的主循环位于框架中,而使用类库时,程序的主循环位于应用程序之中。框架会回调应用程序,而类库则不会回调应用程序。ESFramework和StriveEngine中最主要的对象都以engine来命名,我们也可以看出框架对于程序主循环的控制——它会为你把握方向、眼看前方、轻松驾驭!

•依赖注入(Dependency Injection)  
依赖注入与依赖倒置、控制反转的关系仍旧是一本万殊。依赖注入,就其广义而言,即是通过“注入”的方式,来获得依赖。我们知道,A对象依赖于B对象,等价于A对象内部存在对B对象的“调用”,而前提是A对象内部拿到了B对象的引用。B对象的引用的来源无非有以下几种:A对象内部创建(无论是作为字段还是作为临时变量)、构造器注入、属性注入、方法注入。后面三种方式统称为“依赖注入”,而第一种方式我也生造了一个名词,称为“依赖内生”,二者根本的差异即在于,我所依赖的对象的创建工作是否由我自己来完成。当然,这个是广义的依赖注入的概念,而我们一般不会这样来使用。我们通常使用的,是依赖注入的狭义的概念。不过,直接陈述其定义可能会过于诘屈聱牙,我们还是从具体的例子来看。


比如OMCS网络语音视频框架,它实现了多媒体设备(麦克风、摄像头、桌面、电子白板)的采集、编码、网络传送、解码、播放(或显示)等相关的一整套流程,可以快速地开发出视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统。然而,OMCS直接支持的是通用的语音视频设备,而在某些系统中,需要使用网络摄像头或者特殊的视频采集卡作为视频源,或者其它的声音采集设备作为音频源,OMCS则提供了扩展接口——用户自己实现这个扩展的接口,然后以“依赖注入”的方式将对象实例注入到OMCS中,从而完成对音、视频设备的扩展。
“依赖注入”常常用于扩展,尤其是在开发框架的设计中。从某种意义上来说,任何开发框架,天生都是不完整的应用程序。因此,一个优秀的开发框架,不仅要让开发者能够重用这些久经考验的的卓越的解决方案,也要让开发者能够向框架中插入自定义的业务逻辑,从而灵活自由地适应特定的业务场景的需要——也就是说要具备良好的可扩展性。比如上面提到的OMCS网络语音视频框架可应用于音、视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统;以及ESFramework通信框架能够应用于即时通讯系统,大型多人在线游戏、在线网页游戏、文件传送系统、数据采集系统、分布式OA系统等任何需要分布式通信的软件系统中——这种良好的扩展性都与“依赖注入”的使用密不可分!

•面向接口编程      
谈到最后,“面向接口编程”已经是呼之欲出。无论是依赖倒置、控制反转、还是依赖注入,都已经蕴含着“面向接口编程”的思想。面向接口,就意味着面向抽象。作为哲学范畴而言,规定性少称为抽象,规定性多称为具体。而接口,就是程序中的一种典型的“抽象”的形式。面向抽象,就意味着面向事物的本质规定性,摆脱感性杂多的牵绊,从而把握住“必然”——而这本身就意味着自由,因为自由就是对必然的认识。      
也许以上的这段论述太过“哲学”,但是“一本之理”与“万殊之理”本身就“体用不二”——总结来看,依赖倒置、控制反转、依赖注入都围绕着“解耦和”的问题,而同时自始至终又都是“面向接口编程”的方法——因此,“面向接口编程”天生就是“解耦和”的好办法。由此也印证了从“抽象”到“自由”的这一段范畴的辩证衍化。      
“面向对象”与“面向接口”并非两种不同的方法学,“面向接口”其实是“面向对象”的内在要求,是其一部分内涵的集中表述。我们对于理想软件的期待常被概括为“高内聚,低耦合”,这也是整个现代软件开发方法学所追求的目标。面向对象方法学作为现代软件开发方法学的代表,本身就蕴含着“高内聚,低耦合”的思想精髓,从这个意义上来说,“面向对象”这个表述更加侧重于“高内聚”,“面向接口”的表述则更加侧重于“低耦合”——不过是同一事物的不同侧面罢了。           
除此之外,我们也能从“面向接口编程”的思想中得到“世俗”的启迪——《论语》里面讲,不患无位,患所以立;不患人之不己知,患其不能也——就是教导我们要面向“我有没有的本事?”、“我有没有能力?”这样的接口,而不是面向“我有没有搞到位子?”、“别人了不了解我?”这样的具体。依我看,这是莫大的教诲! (完)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

 楼主| 发表于 2017-5-19 17:04:21 | 显示全部楼层
我是沙发……知乎上看到的,写的挺有意思,转给大家看看怎么提升知(逼)识(格)!

为了好看我专门排了版,脖子好累。。。

出0入0汤圆

发表于 2017-5-19 17:38:24 | 显示全部楼层
支持一个先!!!!!!!!!!

出0入58汤圆

发表于 2017-5-19 19:47:18 | 显示全部楼层
我一直没有面向对象的编程思想,难道是C语言用多了的缘故?

出0入0汤圆

发表于 2017-5-19 20:54:30 来自手机 | 显示全部楼层
单身狗 得先有个对象 然后才能 面向对象编程

出0入0汤圆

发表于 2017-5-19 21:22:43 | 显示全部楼层
面向对象,嵌入式OS等高级特性,这些都要学,但是单片机的系统不一定能完全搬过来就能用的,资源太有限了,重要的是学习编程思想,剪裁后使用.

出0入0汤圆

发表于 2017-5-19 21:34:18 来自手机 | 显示全部楼层
作者厉害,理解的深透,将哲学思想搬过来说明。

出0入0汤圆

发表于 2017-5-20 05:53:28 来自手机 | 显示全部楼层
越来越不认识编程了

出100入101汤圆

发表于 2017-5-20 08:09:35 | 显示全部楼层
大话风格,看看

出0入8汤圆

 楼主| 发表于 2017-5-20 09:04:30 | 显示全部楼层
shawn_bu 发表于 2017-5-19 19:47
我一直没有面向对象的编程思想,难道是C语言用多了的缘故?

与语言无关。。。

出0入8汤圆

 楼主| 发表于 2017-5-20 09:06:43 | 显示全部楼层
sipure 发表于 2017-5-19 21:22
面向对象,嵌入式OS等高级特性,这些都要学,但是单片机的系统不一定能完全搬过来就能用的,资源太有限了,重要 ...

get!

无关平台,无关语言,要的只是个思想。

出0入8汤圆

 楼主| 发表于 2017-5-20 09:07:46 | 显示全部楼层
lovemini 发表于 2017-5-20 05:53
越来越不认识编程了

这状态很好……觉得自己都懂就危险了。。。

出0入0汤圆

发表于 2017-5-20 19:40:53 | 显示全部楼层
看了几个关键字发现都不是很理解,就发现自己的路还很长

出0入0汤圆

发表于 2017-5-21 22:07:20 来自手机 | 显示全部楼层
太长了点

出0入4汤圆

发表于 2017-5-22 09:13:06 | 显示全部楼层
中心思想是耦合接口的标准化。

出0入0汤圆

发表于 2017-5-22 09:48:02 | 显示全部楼层
作者主要是拿.Net开发来举例的,其他面向对象的语言也适用

出0入0汤圆

发表于 2017-5-23 19:37:59 来自手机 | 显示全部楼层
太深奥了。

出0入0汤圆

发表于 2017-5-23 20:41:17 | 显示全部楼层
谢谢楼主,学习了,面向对象编程

出5入14汤圆

发表于 2017-5-25 14:04:56 | 显示全部楼层
看了半天、理解了半天,深以为然啊!,,,,,,然而回头一想,还是啥也没学到啊?

出0入0汤圆

发表于 2017-5-25 14:34:42 | 显示全部楼层
面向对象吹得越来越玄乎了。

知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。

背景是什么? 背景是:尽管这个时代越来越自动化了,可是编写代码这玩意,仍然是人工。而且软件越来越大,要好多人一起来编写。

这么多人,就出麻烦了。 从软件危机后,明白要模块化,可是光模块化都不够,当一堆人的程序都写在一起时,会有各式各样的问题产生。

所以就提出面向对象,其目的在于:1. 自己的错误不会影响到别人;2. 任意模块可以自由改写不会影响别人。针对1,2,可以使得软件出错减少,测试减少,容易发现问题。3. 如果代码写得好,松耦合加模块化,那就可以重复利用。

可是为什么到现在,都没有一个非常成功的经典案例呢? 因为这些玩意是违反天道的:
1. 一个集体内,一个人的错误不会影响他人? are you kidding me?
2. 松耨合松耦合松耦合,怎么也得耦合。没有办法不耦合,所以第一条还是实现不了!
3. 好的软件和其他东西一样,最优的一定是充分利用现实场景的优缺点,可是如此紧密利用就不会是松耦合,而是紧耦合。
4. 重复利用? are you kidding me? 如果我针对这一个场景写得代码可以很简洁,如果是考虑到方方面面,那么我花费的力气以及代码量会以几何级数上升的!那还不如针对另外一个场景再写一个呢!当然,最终一定有很多代码可以重复利用,但是如果以重复利用为己任的代码,那精力和效率又TMD会出问题。

所以,到现在,面向对象都是叫得响,实际应用中却免不了束手束脚。

出0入0汤圆

发表于 2017-5-25 14:35:50 | 显示全部楼层
我的理解就是:像机器人一样思考,就是面向对象

出0入0汤圆

发表于 2017-5-25 14:41:15 | 显示全部楼层
我去,王阳明,论语都扯出来了,别扯了
面向对象很高级吗?理解面向对象就一句话就行了: everything is an object.
现在一个趋势是: functional programming...

出0入0汤圆

发表于 2017-5-25 15:24:43 | 显示全部楼层
本帖最后由 stdio 于 2017-5-25 15:26 编辑
TBG3 发表于 2017-5-25 14:34
面向对象吹得越来越玄乎了。

知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。



C++是用来编程的,结果在编程之前,研究C++研究不完了。。
面向对象是用来解决问题的,结果在解决问题之前,研究对象、模式、分析,研究不完了。。
磨刀不误砍柴功,结果磨刀磨不完了。。
如果有人跟你说他精通C++和面向对象,那你要慎重,小心他把你抽象了。。

出0入8汤圆

 楼主| 发表于 2017-5-25 15:49:51 | 显示全部楼层
TBG3 发表于 2017-5-25 14:34
面向对象吹得越来越玄乎了。

知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。

天才级别的程序员?  呵呵……

出0入8汤圆

 楼主| 发表于 2017-5-25 15:52:07 | 显示全部楼层
stdio 发表于 2017-5-25 15:24
C++是用来编程的,结果在编程之前,研究C++研究不完了。。
面向对象是用来解决问题的,结果在解 ...

Linux之父Linus Torvalds表过态:C++糟糕程序员的垃圾语言……  

出0入8汤圆

 楼主| 发表于 2017-5-25 15:53:41 | 显示全部楼层
EMC菜鸟 发表于 2017-5-25 14:04
看了半天、理解了半天,深以为然啊!,,,,,,然而回头一想,还是啥也没学到啊? ...

哇,这很6啊,想起当年张无忌学太极了……

出0入0汤圆

发表于 2017-5-25 17:21:59 | 显示全部楼层
Jmhh247 发表于 2017-5-25 15:49
天才级别的程序员?  呵呵……

毕竟是针对问题的一种解决方法,只是无法彻底解决而已。
普通人用着,能解决很多问题。
至于天才,非我等所能想象。 某大牛入了C++那个团队,花了一个星期把编译器重写了一遍,码农就只能高山仰止了。

出0入0汤圆

发表于 2017-5-25 17:25:19 | 显示全部楼层
哎,看了这个,表示我还是继续搬砖好了!

出0入8汤圆

 楼主| 发表于 2017-5-26 08:57:19 | 显示全部楼层
TBG3 发表于 2017-5-25 17:21
毕竟是针对问题的一种解决方法,只是无法彻底解决而已。
普通人用着,能解决很多问题。
至于天才,非我等 ...

“普通人用着,能解决很多问题。”……    你这样说就很好了,多接地气儿啊

出0入0汤圆

发表于 2017-5-26 09:48:43 | 显示全部楼层
Jmhh247 发表于 2017-5-26 08:57
“普通人用着,能解决很多问题。”……    你这样说就很好了,多接地气儿啊  ...

把它当白菜萝卜看,不要用来当大鱼大肉。

真正的高手,讲问题清楚明白,直中问题核心。

但是在中国,很多人只佩服把问题讲得很玄奥让人听不懂的所谓高手。而面向对象,就成了玄学。

玄学可能看起来很牛X,但是没有用。在用户决定的时代里,苹果牛X是因为用起来简单,而不是因为用起来复杂。

出0入0汤圆

发表于 2017-5-26 15:22:37 | 显示全部楼层
首先,你得有个对象

出0入8汤圆

 楼主| 发表于 2017-5-26 17:04:40 | 显示全部楼层
信天游 发表于 2017-5-26 15:22
首先,你得有个对象

唉,有了对象,你就没法愉快的用这个表情了

出0入0汤圆

发表于 2017-5-27 10:45:43 来自手机 | 显示全部楼层
TBG3 发表于 2017-5-25 14:34
面向对象吹得越来越玄乎了。

知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。

解耦合还是很重要的。
不然也不会出现linux系统下诸多优秀开源库和框架。

凡是吐槽模块化和解耦合的,只能说明做的东西太菜了或者规模太小,用不到团队开发;或者太具象了没有重复使用的价值。
自己闭门重复造轮子,当然不会有代码复用的需求。

出0入0汤圆

发表于 2017-5-27 12:24:51 来自手机 | 显示全部楼层
本帖最后由 fnems 于 2017-5-27 12:34 编辑
TBG3 发表于 2017-5-25 14:34
面向对象吹得越来越玄乎了。

知道了背景,你就会知道,为什么天才级别的程序员,对这些玩意嗤之以鼻。


形而上者谓之道,形而下者谓之器。
什么c,c++,都是形而下的“器”,其背后的思想才是“道”。如果把面向对象当成工具,就只是停留在器的层面。
面向对象就是说c++、类?笑话,去看看用c写的libjpeg里面输入输出接口结构体,那就是面向对象。
说面向对象没有经典成功案例?笑话,去看看linux arm源码,采用设备树抽象出设备树对象,降低了驱动与设备的耦合,这也是面向对象。
真正重要的是思想。架构错了,细节做的再好也要被扔进回收站。
别整天张口闭口天才程序员了。人家嗤之以鼻的是停留在工具层面争论c更好还是c++更好,只会码代码没有思想的人。

出0入8汤圆

 楼主| 发表于 2017-5-27 16:55:29 | 显示全部楼层
fnems 发表于 2017-5-27 12:24
形而上者谓之道,形而下者谓之器。
什么c,c++,都是形而下的“器”,其背后的思想才是“道”。如果把面 ...

哈哈,说的好,回答的太犀利了

原谅我隔了这么久才看到大哥的回帖

这感觉就像是当年看到  尼古拉斯·沃斯(Niklaus Wirth) 那个公式一样 :数据结构 + 算法 = 程序。

多纯粹啊,不需要管什么语言、编译器,当然,也不需要管天才程序员

出0入0汤圆

发表于 2017-5-27 18:29:52 | 显示全部楼层
只有把编程思想看得很透 才能写的出来。

出0入0汤圆

发表于 2017-5-27 18:46:24 | 显示全部楼层
mark 面向对象编程思想!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 18:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表