作者xtxml (赤木巧☠)
看板Soft_Job
標題Re: [閒聊] OOP小評
時間Tue Mar 3 10:08:14 2015
※ 引述《csfgsj (Lazy bone)》之銘言:
: ※ 引述《xtxml (赤木巧☠)》之銘言:
: : 大哥,你到底懂不懂『繼承』這兩個字的意思啊?
: 我對「繼承」的了解是:
: 對既有源代碼的再利用
: 它很像API,卻不是API
: 主其事又把它宣傳的像是API
: 說穿了,就是將既有的源代碼,以所謂Class為單位
: 作全部的Copy & Paste
: 這個動作你不用作,Compiling的時候Compiler會自動幫你作
我先不評論你的比喻了,直接用你的邏輯來跟你解釋就好了。
: 跟傳統Copy & Paste比起來,它的特性是:
: 1, 只能Copy & Paste整個Class,不可分拆,不可減少
你該想的是,為什麼你會需要分拆或減少?
而既然有virtual function的存在,你又為什麼不能做到減少的效果呢?
: 2, Copy & Paste 使用者不會知道,到底Copy 到了什麼
通常,一個好用的IDE,只要在繼承的名稱上面輕輕點下右鍵,
便可以從類似叫做Go To Definition的選項過去看看你到底複製了什麼。
再不行,總有全專案搜尋的功能了吧?
這也是我通篇最大的疑問,這個動作到底對你有多少難度?
你總是說base/father class不明確,令你痛苦萬分,
但怎麼看開發過OOP專案的普通人,都是一兩個按鈕可以找出來。
不就跟你trace function是同一回事?
: 3, 只能對Class作業,單獨的Struct、Function等不接受「繼承」
多花20秒想想,你可以不用問『為什麼Function不接受「繼承」』這句話
struct這個各語言不同,甚至有些OOP語言根本沒有的字就不討論了,
附帶一提的就是C++的struct可以繼承,因為他就是預設public版的class
你如果要再C++中保有C struct的特性,你只要遵循POD的寫法即可。
: 4, 有一堆GGYY的規則要遵守,什麼覆蓋不覆蓋之類的..etc.
這種『不清楚』『不定性定量』的問法相當「隱晦」,不是嗎?
有沒有強制override就是看你是不是繼承abstract class而已
其他就是有需要你就override,沒需要就擺著,我怎麼覺得超直觀的?
: 所以它比起傳統Copy & Paste死板、麻煩多了
當你傳統的Copy & Paste忽然需要小改的時候,卻已經成千上萬人copy走的時候,
你就會知道是誰麻煩多了不是嗎?
: 也比較「隱晦」
: 傳統Copy & Paste強迫你去了解Copy & Paste的對象
強迫有好處嗎?如果那是一個你本來就不需要理解的事。
剛好拿前面輪子了例子,你買車會需要把輪子的結構圖翻過一次你才敢開嗎?
不要說軟體工程了,這根本常識上就很明顯的事情。
: 「繼承」刻意要你去當瞎子
當你call API的時候,你也是一個瞎子了不是嗎?
繼承也只不過移駕過去看,瞎子是完全看不到,
我相信你一直瞎子瞎子的肯定不是一個好的類比。
: 如果你不想當瞎子,想自己會往下挖
: 「OOP」會有很多地方等著來折磨你,讓你知難而退
我不是不喜歡人家批OOP,我自己其實也不是完全的OOP派。
然而你的文章就是這樣的感覺,你總是批評OOP,卻沒有想過是不是就算不OOP也有問題。
你說OOP很多地方折磨你,說來說去其實沒多嚴重,只是"比較隱晦"而已,
卻省了你很多被malloc free真正折磨個半死的部分。
不管是不是OOP,你要挖底層的code你就勢必很辛苦,
就算在寫C,call一個後面又錯綜複雜的function,你終究也是知難而退,不是嗎?
OO的觀念我至少可以很快區隔出來我想看的部分,
你要說折磨我真的很難看出OO到底有多麼折磨。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.131.77
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1425348497.A.4D7.html
※ 編輯: xtxml (125.227.131.77), 03/03/2015 10:22:13
→ bibo9901: 同意啊. C 的繼承更為隱晦, 舉個常見的例子, 誰看得出 03/03 12:23
→ bibo9901: sockaddr最後附加的幾個byte是為了讓sockaddr_in繼承的? 03/03 12:24