在開(kāi)發(fā)過(guò)程中,其實(shí)總是可以聽(tīng)到“抽象”這個(gè)詞。我想說(shuō)說(shuō)抽象是什么意思。其實(shí)人類處理的所有信息都是抽象的,在這個(gè)層面上的抽象指的就是提取事務(wù)的共性。抽象是一個(gè)動(dòng)作,抽象的結(jié)果往往就會(huì)產(chǎn)生一個(gè)概念。而一個(gè)概念往往有其內(nèi)涵和外延。這些是哲學(xué)方面的一些內(nèi)容。在人們的日常工作以及生活中,往往還有許多約定俗成的概念,這些概念構(gòu)成一個(gè)人日常生活的精神環(huán)境,如果這些概念發(fā)生變化,那么其中的人往往會(huì)感覺(jué)很難受。因此人們往往不愿接受改變,其實(shí)也就是因?yàn)檫@個(gè)原因。
軟件開(kāi)發(fā)領(lǐng)域中的抽象其實(shí)隨處可見(jiàn),但是人們往往聽(tīng)過(guò)的就是抽象類。抽象類是java語(yǔ)言中的一個(gè)概念,由于java語(yǔ)言十分的流行,所以大多數(shù)寫過(guò)程序的人,往往都聽(tīng)說(shuō)過(guò)這個(gè)概念。所以一說(shuō)“抽象”這個(gè)詞,很多人就會(huì)立刻想到抽象類上面去。但其實(shí)不然。
在我看來(lái),軟件開(kāi)發(fā)中的抽象指的是:用某種技術(shù)手段來(lái)區(qū)分和確立程序中不變的部分和可變的部分。因?yàn)槌绦蛞约败浖际墙鉀Q問(wèn)題的,有所不同的是,程序可能解決的是一個(gè)小問(wèn)題,而軟件往往解決都都是復(fù)雜一些的大問(wèn)題。所以軟件中抽象就很重要。
為什么需要區(qū)分程序中不變和可變的部分?我覺(jué)得主要有以下幾個(gè)原因:
- 事有輕重緩急;重要的主要的事情可以先固定下來(lái),次要的事情可以作為可變的部分留到后面解決。
- 人的技術(shù)水平也有差異;困難的事情可以作為不變的部分固定下來(lái),由水平高的程序員負(fù)責(zé),簡(jiǎn)單的事情可以作為能夠變化的部分分離出來(lái),由水平差一些的程序員負(fù)責(zé)。
- 代碼復(fù)用;復(fù)用程度高的代碼,往往可以作為不變的部分固定下來(lái),復(fù)用程度低得代碼,可以作為變化的部分隔離出來(lái)。
在我看來(lái),通過(guò)設(shè)計(jì)其實(shí)往往很難一次就得到一個(gè)非常好的抽象,因?yàn)槟阈枰瑫r(shí)非常了解業(yè)務(wù)和編程技術(shù),同時(shí)精通這兩者的人不多。所以好的抽象一般都需要通過(guò)不斷的重構(gòu)來(lái)獲得。因此軟件開(kāi)發(fā)不是一個(gè)一錘子買賣,一個(gè)好的軟件往往需要持續(xù)不斷的投入,才能越來(lái)越好。
綜上,我認(rèn)為,軟件開(kāi)發(fā)中所謂的抽象,其實(shí)就是分離主次。主要的東西需要固定不變,次要的東西缺往往需要變化多端。那么分離變化與不變,就是在做分離主次的工作。所謂主次分明,井井有條。這樣的系統(tǒng)才容易擴(kuò)展和維護(hù)。