近来写了些和函数式编程的文章,有读者和我商议函数式编程和面向目标编程的是非。两者都是很好的编程思维,都在出力管理代码重用的题目,也互相吸取对方的益处,是以大可无须去分个高低。但是,
我口试过很多号称通晓面向目标编程(比方:Python/Ruby/C++)的工程师,敷衍问几个题目,就能够看出这单方当面向目标的明白:
你感到在面向目标编程中,最紧急的思维是甚么?
假若有人说起「接管」,我会让她写个她在办事中利用接管的例子。
假若有人说起「多态」,我会让她声明一下多态,并让她写个她在办事中利用多态的例子。
假若有人说起「代码重用」,我会让她谈谈她对代码重用的明白,并附上一个办事中重用的例子。
对第一个题目,良多人回复接管,有些人会添上接口,多态等观念,很少人会说起代码重用。
对第二个题目,险些80%的人都邑写出目标接管的代码,而这边面有一泰半的人写出的「办事中」利用接管的例子居然是某闻名废料书中的典范误人后辈的例子:Duck接管于Bird,Bird接管于Animal。
对第三个题目,险些全数人都是写出目标接管中的多态,而后个别的人给出的仍然那本闻名废料书里的闻名例子:鸟能飞,也会叫,鸭子呱呱呱但不会飞。你能够把鸭子目标赋给鸟,让它发出呱呱呱的啼声。
关于第四个题目,嗯,假若有人回复到第四个题目,并能信手拈来Itrabl,Comparabl,这单方假若没看『程序人生』的文章(嘿嘿),那即是基本学问和编程思维曾经八九不离十,能够聊目标除外的东西了。
面向目标编程和函数式编程中最根基,也是最紧急的因素是代码重用,也许更严酷地说代码被重用。这边为甚么要严酷辨别代码重用和代码被重用呢?代码重用底子不是个事儿,除非利用汇编谈话,不然你写十行代码,九行都是在重用他人的代码——连往consol输出如斯的浅显语句,你是不是都用了谈话自身的库函数?就算谈话将其纳入中央语法,这个谈话的完成也必然在底层挪用了libC的某个函数,来猎取职掌系统对此的支撑。是以说,干编程这一行,重用他人的代码,咱们最熟稔不过;而让本人的代码被他人重用,咱们偶尔底气不够。
写过半年以上Python的,该当都晓得所谓的magicfunction,假若你的类界说完成了某个magicfunction,那末类就会占有一些巧妙的本事,比方:
上述的类并没有接管任何已知的类(隐式接管objct不算),但是它能够很浅显被其它代码用一种大家的方法挪用:
这即是代码的被重用的本事。这类编程的方法,与其说是面向目标编程,不如说是面向接口编程。目标在这边可是一个幌子,其存在的意义更多地是餍足某种接口。在面向接口编程中,接口接管要远紧急于类接管。
为甚么面向接口编程如斯紧急?由于它是一种管束回转——经过笼统出一系列接口,并在这些接口长实行职掌,使得管束逻辑不依赖于详细的完成;同时,详细的完成能够并不关怀管束逻辑怎么利用本人,它们会在须要的时辰被挪用。由此,利用目标的逻辑和目标自身充足解耦,由接口这座桥梁将两者接洽起来。如斯,代码获得了最大水平的被重用。
谈到接口接管,不得不提Liskovsubstitutionprincipl(里氏变幻规则),wikipdia如斯先容它:
Itstatsthat,ina