一切皆对象,是非常好的哲学。而且,确实,面向对象会更加直观,明了。例如
length(str)和str.length比较起来,很明显,后者str.length更加直观,明了,可读写强多了。 但是,现实中存在很多困惑。下面也Java为例。
例如:
1. 控制台Console是否一个对象?
在Java中,打印一个字符串是,System.out.println("HelloWorld"); 这里面控制台是System.out。 但问题在于,控制台是不是一个对象呢?
假如换种写法:
"HelloWorld".sendToConsole(), 具有相同的功能和功效,含有是将字符串输出到控制台。
那么,那一种更加直观的表达了世界呢?
2. sendToConsole,将字符串写到控制台,这样看起来更合理。
但现实中,有很多数据,例如int,double,float等,每个类型都有sendToConsole,这样是不是显得这个方法很泛滥,那还不如
System.out.println(int),System.out.println(double),System.out.println(float)等更加统一。
自动判断输入的是int,还是double,还是float,然后将其转为string,然后再打印。
3. FileReader, ByteArrayInputStream等该不该是一个对象?
它们本身并不具有任何一个真正的实体,FileReader仅仅是File打开得到一个Reader,这只是封装方法集合而已。在Java中,什么都是Class情况,结果大量的XxxFactory,XXXReader,XxxxUtils,XXXHelper等大量的存在。但它们本质并不是一个对象。其实只是简单包装而已。这些东西都脱离了面向对象的意思,使得代码变得可读性差。
面向对象的目的是想将外部的东西表达得更自然,然而java中并非如此。大量非面向对象的class存在。大量的耦合代码在,加强了代码负担。
4. URL和url.openConnection
URL本身就是一种具有特殊格式字符串,这个封装为一种对象,无可厚非。但url居然有openConnection的方法,url打开了联接,显得很怪异?url跟连接什么关系。
在Java中,如果url中有http,则可以打开HttpConnecton,如果有ftp,则可以打开FtpConnection, 这样看起来封装很好。能够根据不同的协议打开不同类型的连接。非常完美。
但现实是URL和openConnection究竟什么关系? 结果是为了支持http,ftp,https进行过度封装,看起给用户封装起来的api很简单,但现实是里面的实现存在众多问题。用起来是简单的,但现实原理本质更加不清楚了。
5. java中有int,boolean, char, double, string, object 等类型,然后所有的操作是以这些类型。但现实中HttpConnection这样东西,究竟是什么样的东西呢?HttpConnection其实一个过程,具有时序的,并非静态对象。 这时候,面向对象,怎么表达一个过程呢?面向对象的过程呢?
6. async 是不是一个对象呢?Future,这个也是未来不可知的,虚假的东西,对吧。
7. Exception为何是一个对象?
在javascript中,我们看到一种更好的表示,例如HttpRequest中,如果失败了,则httpRequest.onFailed=function(){}。 如果失败了,则告诉你该做什么了。。。这样的表达,岂不是更正确。而在java中,如果出错了,throws IOException,抛出IOException,IOException是什么东西,其实什么东西都没有。你发现它只有message和stackException。
出错了,就抛出对象给你,但你也不知道这对象是谁抛的,抛给你干嘛。。。。。。
所以,java是面向对象,但真正用起来的时候,并非一定很直接。