在前面的例子中,我们可以看到对String的to_alphanumeric的方法扩展。
那么对于一个对象而言,例如ArrayList,只要具有了add/remove/get/update/iterator等,具有添加/删除/修改/读取/遍历等等,我们就认为该对象具有“完备性”。 也就是说这个类的对象,该有的就有了。
在此基础上添加的,例如forEach/map等,其实并非属于ArrayList的必需品,forEach完全可以用Iterator等来代替。 但是,这个方法添加到ArrayList具有极大的便利性。这样我们就不用写ArrayListHelper或者ArrayListUtils类。 因此通常我们又需要“扩展性”。
很多地方都具有类似情况,例如Ruby中的3.times{} ,times这个本身不属于int的范畴,其实仅仅是一个便利方法而已。
例如String,在Java中length/charAt/subString/startWith/indexOf等,已经提供了对string操作的完备性。 但现实中,通常需要对string进行改写,例如to_alphanumeric, "Hi".md5等, 这些都属于扩展性。
在Java中,扩展一个类的方法,是没有提供的,只能重写static方法,例如XxxUtils,XxxxHelper,这样看起来更加不面向对象。
而C#中,扩展一个类的方法,是可以的,通常是static void Xxxx(String a){} , 通过Extend的方式来扩展。但依然不面向对象。
在JavaScript中,扩展一个类的方法,超级简单,String.prototype.md5=function(){}即可。
-----------------------------------------
其实,完备性和扩展性是一个矛盾,但扩展性很显然的解决了XxxUtils/XxxHelper等冗余的问题。从这个角度而言,扩展性很重要。