Abstraction is your power to software design
前幾天突然想起好多年前到泰國出差的時候,同事看到我在找垃圾桶要做垃圾分類,他突然冒出一句 「Everything’s general」。意思是你不知道怎麼分類就放進一般垃圾就對了,貌似玩笑的一句話其實隱含著軟體抽象設計的道理。
天天用的能力
不管你的物件導向程式設計是自學的還是從學校課程學會的,一定對 is a, has a 表示方式感到熟悉。書上最常見的範例就像是 trangle is a shape, cat is an animal 這類的範例來描述兩個物件的關係。這種表示方式不是什麼偉大發明,就算是不懂程式設計的人來看也會覺得自然,那是因為觀察、分類與定義物件之間關係本來就是人類擅長且天天會用的能力,也就是抽象化思考的能力。
分類與定義物件之間關係本來就是人類擅長且天天會用的能力
什麼是 Is a?
說到觀察、分類定義物件關係我覺得最經典的案例就是生物學的分類系統。我們就拿三個物種,智人、尼安德特人與黑猩猩來説,我們可以問為什麼智人與尼安德特人會被分在同一屬?為什麼 「長得很像」人類的黑猩猩被分到黑猩猩屬?因為在分類的過程中智人與尼安德特人所擁有的共同特徵數量上會比智人跟黑猩猩的共同特徵更多。一但某些特徵被識別出來作為分類後就能確定不同分類間的從屬關係,因此我們可以說智人 is a 人;也可以說尼安德特人 is a 人;就不能說黑猩猩 is a 人。假設未來有全新進化的人形物種,當他符合人屬的分類特徵條件,理論上我們就能說此新人形物種 is a 人。特徵被識別出來作為分類後就能確定不同分類間的從屬關係
當 Is a 少了 a 會發生什麼事?
不知道大家有沒有聽過白馬非馬論?它是戰國時期的公孫龍為了搞定守門人的馬不能過關口的規定而為它的白馬所提出的一個(詭)辯論。他的論點是這樣的,如果黑馬 is 馬,在白馬 is not 黑馬的前提下,就會得出白馬 is not 馬的結論。之所以白馬不是馬是因為白馬比馬特徵定義上多出一個顏色屬性,同理黑馬也不是馬,但我們都知道白馬與黑馬都是 is a 馬,這就是抽象化。
白馬與黑馬都是一種馬
結論
最後再回到程式設計上,我們在設計過程會經過識別出流程中不同物件的特徵進行分類找出彼此的關係的抽象化過程,不同的抽象方式會有不同的結果。當我們抽象化的目標是物件的共同的特徵時就會得到一組繼承關係;當把抽象化的是物件重點放在共同行為上就會得到一組介面設計;如果同時考慮的是特徵與介面抽象化的共存設計,你就得到一組抽象類別,或更抽象再抽象的設計模式。