還用不用OO了

看了一篇文章,就是參考中的那篇,大致總結(jié)一下用OO的問(wèn)題。

繼承的問(wèn)題

  1. 父類(lèi)太多,需要依賴(lài)的類(lèi)就比較多了,特別是依賴(lài)的jar包比較多。
    不過(guò)我覺(jué)得現(xiàn)在的IDE以及Maven這些已經(jīng)處理的挺好了,會(huì)自動(dòng)給提示讓你去選擇依賴(lài)的Jar包。當(dāng)然Maven這些還是有些麻煩,但畢竟比起純手工打造要強(qiáng)多了。
    尤其要小心的就是不同Jar包有相同名字類(lèi)的情況,一不留神引用錯(cuò)了,造成后面行為的錯(cuò)誤,可就比較麻煩了。
  2. 多繼承
    其實(shí)這個(gè)沒(méi)什么好說(shuō)的,既然大多數(shù)OO語(yǔ)言都不支持,而且都提供了用接口來(lái)便桶。我覺(jué)得也不是問(wèn)題。
    特別是經(jīng)常用Interface和Abstract類(lèi),還是蠻清晰的。
  3. 父類(lèi)行為的改變?cè)斐勺宇?lèi)的Bug。
    這個(gè)是個(gè)問(wèn)題,一般都比較默認(rèn)父類(lèi)行為是一致的。要是某次引用的Jar包升級(jí)造成行為變化,程序出錯(cuò)造成live issue,那真是心里一萬(wàn)個(gè)草泥馬飄過(guò)。。。
    參考文中給了個(gè)例子,拷貝過(guò)來(lái):
    父類(lèi)
import java.util.ArrayList;
 
public class Array
{
  private ArrayList<Object> a = new ArrayList<Object>();
  public void add(Object element)
  {
    a.add(element);
  }
  public void addAll(Object elements[])
  {
    for (int i = 0; i < elements.length; ++i)
      a.add(elements[i]); // this line is going to be changed
  }
}

子類(lèi)

public class ArrayCount extends Array
{
  private int count = 0;
 
  @Override
  public void add(Object element)
  {
    super.add(element);
    ++count;
  }
 
  @Override
  public void addAll(Object elements[])
  {
    super.addAll(elements);
    count += elements.length;
  }
}

修改的父類(lèi)

  public void addAll(Object elements[])
  {
    for (int i = 0; i < elements.length; ++i)
      add(elements[i]); // this line was changed
  }

計(jì)算了兩次。。。What The Hell!!!

用什么層次結(jié)構(gòu)呢?

參考文提出用Containment Hierarchies,比如襪子裝在抽屜里,抽屜裝在臥室了。。。
有一定道理,可真實(shí)世界確實(shí)有繼承這種層次結(jié)構(gòu)啊。
只是不唯一而已。

封裝的問(wèn)題

文中說(shuō)的封裝的問(wèn)題,主要說(shuō)的就是引用的問(wèn)題。
比如一般OO語(yǔ)言都是引用傳遞的,當(dāng)一個(gè)對(duì)象的引用傳到另一個(gè)類(lèi)的構(gòu)造函數(shù)中,這個(gè)對(duì)象就不安全了!?因?yàn)閯e的代碼有了這個(gè)對(duì)象的引用。
而他提出的解決辦法是用值傳遞對(duì)象。我覺(jué)得他這個(gè)方法弊大于利。而且很多問(wèn)題其實(shí)是語(yǔ)言實(shí)現(xiàn)的問(wèn)題。

封裝還是不錯(cuò)的,噴點(diǎn)不多。

多態(tài)的問(wèn)題

看到這里的時(shí)候,我先想了半天多態(tài)的缺點(diǎn)。發(fā)現(xiàn)也沒(méi)有太多,主要是要小心別弄錯(cuò)了之類(lèi)。
果然,作者最后說(shuō)不要用OO的多態(tài),要用基于接口的多態(tài)。

作者是Function Programming粉絲。

Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容