官术网_书友最值得收藏!

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 封裝

publicprivate成員的內(nèi)存表示是一樣的,在第二個(gè)示例中,有問題的代碼之所以無法編譯,是因?yàn)槲覀兲峁┑念愋捅硎尽J聦?shí)上,publicprivate和其他可見性都是包含它們的類型的屬性。

封裝或信息隱藏使我們能夠?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ù)。

主站蜘蛛池模板: 屏山县| 舞钢市| 新巴尔虎左旗| 区。| 博罗县| 满城县| 乡宁县| 沂南县| 鄂伦春自治旗| 乐亭县| 浏阳市| 阳朔县| 宁阳县| 万源市| 绥棱县| 卓尼县| 彩票| 安阳县| 麟游县| 资兴市| 沧州市| 怀安县| 华坪县| 大埔县| 灵璧县| 司法| 靖江市| 镇赉县| 三台县| 勐海县| 秦安县| 循化| 长岛县| 会宁县| 中卫市| 章丘市| 五河县| 邯郸县| 股票| 临沭县| 吴忠市|