0717-7821348
欢乐彩app官网

欢乐彩app官网

您现在的位置: 首页 > 欢乐彩app官网
欢乐彩票首页-为什么面向对象糟透了?
2019-11-26 22:10:58

编程言语“三巨子”Java, Lisp 和C言语在Hello World咖啡馆集会。

服务员送来咖啡的一同还带来了一张今日的报纸, 三人问寒问暖了几句, C言语翻开了报纸,忽然眼前一亮:“这篇文章的标题写得好啊, 《为什么面向目标糟透了!》”

Java 大吃一惊,竟然有人这么骂面向目标?!

他赶忙抢过来,看了一瞬间,提到:“尽管我对逝世的Joe Armstrong老先生十分敬重,可是我对他的观念却不敢苟同,你看他说'数据结构和函数不应该绑到一同!'”

C言语说:“他说得很有道理啊,函数是完成算法的,就像一个黑盒子,只需理解了它的输入和输出,就理解了它的功用,而数据结构呢便是单纯的‘声明’,为什么要把他们绑在一同呢?”

“不不不,仍是绑在一同好!我给你举个比方,一个栈,假设你把它当成一个完好的目标,那用起来就便当多了。”

Stack s = new Stack();
s.push(100);
s.push(200);
s.pop();

C言语不甘示弱:“把数据结构和函数分隔也挺好啊!比方我能够创立一个叫做Stack的数据结构,然后写几个对这个数据结构操作的函数。”

push(stack, 100);
push(stack, 200);
pop(stack);

Java嗤之以鼻地说:“你看看你这种办法多丑恶啊。”

C言语寸步不让:“实质都是相同的,你是o.f() ,我是f(o), 有啥差异?欢乐彩票首页-为什么面向对象糟透了?”

Lisp也插了一嘴:“还有我的(f o) ”

Java无语,心说这两个家伙便是胡搅蛮缠。忽然,他心中一动:我怎样忘掉多态了。

Java说:“实质是不相同的,你要知道,o.f()是能够发生多态行为的,这就带来了巨大的优点,我给你举个比方,你有一段事务逻辑,需要把核算的成果记载到文件中,将来还可能会记载其他当地,你的规划可能是这样的。”

C言语:“莫非不应该如此吗?一个函数调用别的一个函数?”

Java 提到:“这里有个依靠的问题,便是businessLogic()不光运行期依靠writeToFile(), 在源码级或许编译期也会依靠。”

C言语:“这不是很正常嘛!”

Java又说道:“不相同, 写入文件是底层的完成细节,不是高层战略,假设用户熊猫图片欢乐彩票首页-为什么面向对象糟透了?不想把核算的成果保存到文件中了,而是想经过邮件发送,那你的businessLogic也得修改了,对不对?”

C言语:“那必定啊!函数调用嘛,一个改了,别的一个也得改。”

“这便是问题了, 编译期/源代码的依靠导致咱们无法把体系划分红独立的组件,各自独立开发,独立布置,一个的改变就影响到了别欢乐彩票首页-为什么面向对象糟透了?的一个。”

C言语觉得有必定的道理,他说:“那怎样办?”

Java说:“你看看我运用多态今后的规划,我的事务逻辑在编译时只依靠那个接口Writer,而不依靠详细的完成FileWriter和MailWriter。”

“你的意思是只需接口Writer不改变,底层的详细完成如FileWriter ,MailWriter能够随意改变,随意替换,就像插件相同,对吧?” C言语提到。

“对啊,编译期/源代码不依靠,运行期依靠,这便是推迟绑定带来的优点,现在你理解o.f()和 f(o)的实质差异了吧。 ”

Lisp 不失时机又插了一嘴:“你那接口中只要欢乐彩票首页-为什么面向对象糟透了?一个函数,便是write(),用什么接口啊,脱裤子放屁,多此一举,在我这儿只需把不同的函数传递曩昔就能够了。”

Java笑道:“别抬杠,这便是个简略的比方,不管是用接口,仍是传递函数,都是推迟绑定嘛, 要害点都是要找到那个安稳的东西(Writer),便是笼统。你找不到这个安稳的东西,做不出笼统,你的体系就无法划分红能够独立开发,独立改变的组件了。”

C言语还想反击,但一向找不到突破口。

Lisp说道:“别听Java在哪里忽悠,C老弟,你也能完成运行期的推迟绑定,这不是Java的专利,你忘了虚函数表了?”

C言语一拍大腿:“是啊,我忘了那一年新年回家,Linus 大神从前告诉我,虚函数表和函数指针才是完成多态的要害,比方Unix/Linux把设备都当成了文件,有规范的open , read 等办法,关于不同的设备,都能调用对应的办法, 那是怎样完成的?也是经过虚函数表做推迟绑定嘛!”

(码农翻身老刘注:C言语完成面向目标的概况能够移步《

C言语快乐了:“哈哈,Java 老弟,看来咱们实质上仍是相同的,多态只不过是函数指针的一种运用!”

Java说:“所以编程的要害不在于是否运用了面向目标的言语,这一点你赞同吧?”

C言语允许,编程的要害点便是找到、笼统出安稳的接口,针对这个接口编程,这样就能够让各个模块能够独登时改变。

“说起来简单,做起来难,这儿有一个比方,你给我用面向目标规划一下?” Lisp 抛出了一道题。

动物能够分为肉食动物,草食动物,水生动物,陆生动物,用类怎样表明?

Java 说:这还不简略,看看这名词多显着啊,都能够变成类啊,让他们都承继动物就能够了。

Lisp看到Java 掉入了圈套,狡黠地一笑:“那有的动物就既是陆生动物,又是肉食动物,怎样表达?”

“那我就加一个陆生肉食动物类。” 尽管觉得不当,Java仍是说了出来。

“那要是再来一个水生肉食动物怎样办?或许来了一个新的概念‘哺乳动物’, 该怎样处理?”

“哈哈哈,我懂了,跟着需求的增多,不光类会呈现爆破, 还可能会呈现那种奇怪的类,这面向目标编程确实是有大问题啊!” C言语说。

Java 垂头深思不语,忽然,脑海中想起来了那句话:优先运用组合而不是承继。

怎样运用组合?必须得改变下看待问题的办法,对,应该这样:

Java满意地说:“看看这个图, 动物具有多个特性,如'进食', '移动',将来还能够加上'哺乳办法',每个特性都是一个接口,接口是安稳的, 动物这欢乐彩票首页-为什么面向对象糟透了?个概念是能够经过这些接口特性给组合起来的。”

Lisp 欣赏地允许, C言语向Java投去了敬佩的目光,这家伙常常做面向目标的规划,仍是有两把刷子的,他经过特性的办法把改变给阻隔了, 各个特性能够经过组合的办法,像插件相同随意替换, 嗯,这才是面向目标的真实精华啊。

夜已深, 最终Java做了个总结,大伙散去。

“编程嘛便是发现改变,而且把它给阻隔起来,运用各种言语都能够,面向目标的言语有着直接运用多态的便当,今后不要马马虎虎就diss它了。”