看了一篇文章器罐,就是參考中的那篇,大致總結(jié)一下用OO的問題渐行。
繼承的問題
- 父類太多轰坊,需要依賴的類就比較多了,特別是依賴的jar包比較多祟印。
不過我覺得現(xiàn)在的IDE以及Maven這些已經(jīng)處理的挺好了肴沫,會自動給提示讓你去選擇依賴的Jar包。當(dāng)然Maven這些還是有些麻煩蕴忆,但畢竟比起純手工打造要強(qiáng)多了颤芬。
尤其要小心的就是不同Jar包有相同名字類的情況,一不留神引用錯了套鹅,造成后面行為的錯誤站蝠,可就比較麻煩了。 - 多繼承
其實這個沒什么好說的卓鹿,既然大多數(shù)OO語言都不支持菱魔,而且都提供了用接口來便桶。我覺得也不是問題吟孙。
特別是經(jīng)常用Interface和Abstract類澜倦,還是蠻清晰的。 - 父類行為的改變造成子類的Bug杰妓。
這個是個問題藻治,一般都比較默認(rèn)父類行為是一致的。要是某次引用的Jar包升級造成行為變化巷挥,程序出錯造成live issue桩卵,那真是心里一萬個草泥馬飄過。。吸占。
參考文中給了個例子晴叨,拷貝過來:
父類
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
}
}
子類
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;
}
}
修改的父類
public void addAll(Object elements[])
{
for (int i = 0; i < elements.length; ++i)
add(elements[i]); // this line was changed
}
計算了兩次凿宾。矾屯。。What The Hell!!!
用什么層次結(jié)構(gòu)呢初厚?
參考文提出用Containment Hierarchies件蚕,比如襪子裝在抽屜里,抽屜裝在臥室了产禾。排作。。
有一定道理亚情,可真實世界確實有繼承這種層次結(jié)構(gòu)啊妄痪。
只是不唯一而已。
封裝的問題
文中說的封裝的問題楞件,主要說的就是引用的問題衫生。
比如一般OO語言都是引用傳遞的,當(dāng)一個對象的引用傳到另一個類的構(gòu)造函數(shù)中土浸,這個對象就不安全了W镎搿?因為別的代碼有了這個對象的引用黄伊。
而他提出的解決辦法是用值傳遞對象泪酱。我覺得他這個方法弊大于利。而且很多問題其實是語言實現(xiàn)的問題还最。
封裝還是不錯的墓阀,噴點不多。
多態(tài)的問題
看到這里的時候拓轻,我先想了半天多態(tài)的缺點岂津。發(fā)現(xiàn)也沒有太多,主要是要小心別弄錯了之類悦即。
果然吮成,作者最后說不要用OO的多態(tài),要用基于接口的多態(tài)辜梳。
作者是Function Programming粉絲粱甫。
Reference
- Goodbye, Object Oriented Programming https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53#.uv6ruqb8l