- 編程與類型系統(tǒng)
- (美)弗拉德·里斯庫(kù)迪亞
- 666字
- 2021-01-29 11:51:24
1.2.3 封裝
封裝指的是隱藏代碼內(nèi)部機(jī)制的能力,這里的代碼可以是函數(shù)、類或者模塊。你可能知道,我們希望利用封裝,是因?yàn)樗梢詭椭覀兲幚韽?fù)雜性:將代碼拆分為更小的組件,每個(gè)組件只向外界公開嚴(yán)格需要的項(xiàng),而其實(shí)現(xiàn)細(xì)節(jié)則被隱藏并隔離起來。
在程序清單1.6中,我們將安全除法的示例擴(kuò)展為一個(gè)類,讓該類確保不會(huì)出現(xiàn)除數(shù)為0的情況。
程序清單1.6 封裝程度不足

在本例中,我們不能讓除數(shù)不可變,因?yàn)槲覀兿胱屨{(diào)用這個(gè)API的人能夠更新除數(shù)。問題在于,因?yàn)?span id="xa8d7sq" class="code-span">divisor成員對(duì)調(diào)用者是可見的,所以它們可以直接將divisor設(shè)為任意值,繞過對(duì)0的檢查。要解決這個(gè)問題,可以將divisor標(biāo)記為private,使其只能在類中使用,如程序清單1.7所示。
程序清單1.7 封裝

public和private成員的內(nèi)存表示是一樣的,在第二個(gè)示例中,有問題的代碼之所以無法編譯,是因?yàn)槲覀兲峁┑念愋捅硎尽J聦?shí)上,public、private和其他可見性都是包含它們的類型的屬性。
封裝或信息隱藏使我們能夠?qū)⑦壿嫼蛿?shù)據(jù)拆分到一個(gè)公有接口和一個(gè)非公有實(shí)現(xiàn)中。在大型系統(tǒng)中,這種拆分非常有幫助,因?yàn)槭褂媒涌冢ɑ虺橄螅┦估斫庖欢翁囟ùa的作用變得更加簡(jiǎn)單。我們只需要理解組件的接口,而不必理解其全部實(shí)現(xiàn)細(xì)節(jié)。封裝也有助于將非公有信息限制在一個(gè)邊界內(nèi),并保證外部代碼不能修改這些信息—因?yàn)樗鼈兏揪驮L問不了這些信息。
封裝出現(xiàn)在多個(gè)層次,例如,服務(wù)將其API公開為接口,模塊導(dǎo)出其接口并隱藏實(shí)現(xiàn)細(xì)節(jié),類只公開公有成員,等等。與嵌套娃娃一樣,代碼兩部分之間的關(guān)系越弱,共享的信息就越少。這樣一來,組件對(duì)其內(nèi)部管理的數(shù)據(jù)能夠做出的保證就得到了強(qiáng)化,因?yàn)槿绻唤?jīng)過該組件的接口,外部代碼將無法修改這些數(shù)據(jù)。
- C語言程序設(shè)計(jì)實(shí)踐教程(第2版)
- 自己動(dòng)手寫搜索引擎
- 數(shù)字媒體應(yīng)用教程
- Dynamics 365 Application Development
- C# 從入門到項(xiàng)目實(shí)踐(超值版)
- R語言數(shù)據(jù)可視化實(shí)戰(zhàn)
- jQuery從入門到精通 (軟件開發(fā)視頻大講堂)
- Visual C++應(yīng)用開發(fā)
- Building Minecraft Server Modifications
- Unity 2017 Mobile Game Development
- Spring Boot+MVC實(shí)戰(zhàn)指南
- Go語言開發(fā)實(shí)戰(zhàn)(慕課版)
- Python預(yù)測(cè)分析與機(jī)器學(xué)習(xí)
- C++服務(wù)器開發(fā)精髓
- Python深度學(xué)習(xí)與項(xiàng)目實(shí)戰(zhàn)