天天看點

面向對象:"一切皆對象”的困惑

一切皆對象,是非常好的哲學。而且,确實,面向對象會更加直覺,明了。例如

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是面向對象,但真正用起來的時候,并非一定很直接。

繼續閱讀