Ruby七日谈.第二夜—面向对象

不觉春消散得这般快,下午出去扫个尾,临河樟树上一躺、跟着歌哼哼唧唧,旁边的鸟儿也是。还有许多松鼠穿来荡去。微风一来,似梦似醉。


心里念着,有酒的神仙也不过如此吧。作为一只JAVA猿,在不写程序的时光里,生活简简单单,虚度得如此美好。


但程序的世界杂念太多,以致背离了美的初衷。今夜我要谈—面—向—对—象!我不喜欢它,以Ruby之名。


乔布斯在90年代的一个电视节目里曾谈到面向对象,举了个咖啡的例子。从前的程序需要知道一杯摩卡的每个制作细节,亲自制作;而面向对象,仅需走进咖啡馆、冲着漂亮的女服务员、“嗨〜一杯摩卡”。


虽然乔布斯写程序没我厉害,但不可否认这个栗子很好。wikipedia关于OOP的首句画风却是这样:
**Object-oriented programming** (**OOP**) is a programming paradigm based on the concept of "objects", which may contain data, in the form of  fields, often known as attributes and code, in the form of procedures, often known as *methods.*


不明觉厉!下午我躺在树上一阵微风、沁人心脾。但在嘈杂的咖啡馆,经常旁边坐着一堆发际线明显的年青人,有的大叫、有的脸红,混乱之中好不容易才辨识了一句“面向对象就是封装、继承、多态”。


很多程序猿入行起就被强行灌入了很多高大尚的酒,醉了便再也不醒人事。也忘记了像乔布斯那样说人话,我宁愿记起前台那身材正点的妹纸。


面向对象,精髓更多是面向漂亮的女孩子,而不是像SOLID原则这样生硬的花招。Spring团队花了很多年才将“控制反转”换成了“依赖注入”,虽然技术实现都一样、但忽略了问题的本质。


很多程序猿爱分析xx的原理,但对xx所解决的问题、却理解不深。工作实践上做系统设计,解决方案从来都有N种,跟据所面临的问题来择其优劣。


OOP将复杂的世界解藕成对象和关系,关系更加重要点,就像人跟社会、社会更重要一样。OOP就像交易的契约、通行货币,是对服务的承诺。以物易物,我养牛的不需要种小麦,拿钱交易。


软件设计思想是没有边界,但语言从来都有。


作为Rubyer,我深知Java是有罪的,在面向对象方面,因为它很庸肿,继承、抽象、还有死版的接口。继承是很糟糕的一套,好在GO已经没有继承机制。Object-C曾经必有.h和.m来分别定义interface和实现,幸运的是Swift把它干掉了。


Ruby的迷人在于它有很多很多方式叫人爽,无论从哪偷来的。首先一种是“Duck Typing",英雄莫问出处,你只要叫的像只鸭子、走得像只鸭子,即便是个人、但在我心中永远都是只鸭子。


In Ruby, we rely less on the type (or class) of an object and more on its capabilities. Hence, Duck Typing means an object type is defined by what it can do, not by what it is. Duck Typing refers to the tendency of Ruby to be less concerned with the class of an object and more concerned with what methods can be called on it and what operations can be performed on it. In Ruby, we would use respond_to? or might simply pass an object to a method and know that an exception will be raised if it is used inappropriately.


代码不会思考,但人会。优秀的语言不关心咖啡小妹是长腿的还是胸大的,它关注的应该是能为我提供咖啡的服务。Ruby天然萌。


还有更酷的武器让很多程序语言哭晕在厕所。我曾做一个特别恶心的需求,那年还很年青,产品姐姐说就照着xx那样做,于是把那个业务线的代码copy过来,过程疼得就像连根拔起一棵大树,涉及10来个类,我需要的仅是那200行不到的功能。


这是个很悲伤的故事。因为它乱用了继承,像蜘蛛网一样牵一发而动全身。Ruby有include,带组合的味道。


module ModuleA 
def greet 
  puts 'hello world' 
end
end


module ModuleB 
  include ModuleA
end


ModuleB.new.greet


hello, world!非常美妙,就像下午那阵微风、浮动着静静的河水,令人怀念。我躺在树上酣睡了半天,树下路过个小女孩,就像发现新大陆一样冲着妈妈尖叫,“看,有大叔在树上睡觉。”


也许我老了,不再年青,却更懂时间。曾经在风景里瞎逛,今天在风景的树上一躺,也成了风景本身。我不是在嘲笑Java、也无意乱喷什么,而是真爱自由、开放、包容的Ruby。


2016/04/17
于上海

 


=>更多文章请参考:《中国互联网业务研发体系架构指南》

=>更多行业权威架构案例及领域标准、技术趋势请关注微信公众号 '软件真理与光':

公众号:关注更多实时动态 更多权威内容关注公众号:软件真理与光

你可能感兴趣的:(业务技术,ruby,面向对象,java)