[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2009-12-20
大師寫到這一章節(jié)的時(shí)候文風(fēng)似有明顯轉(zhuǎn)變,原因未知,但我更喜歡這章的風(fēng)格。如題,Item22的主旨是應(yīng)該把所有類的數(shù)據(jù)成員聲明為私有(private)。因?yàn)?
-
如果數(shù)據(jù)成員都是私有的,那么訪問(wèn)這些成員就只能通過(guò)函數(shù)進(jìn)行。于是用戶就不需要費(fèi)心考慮到底要用什么方式去訪問(wèn)數(shù)據(jù)成員:因?yàn)橹挥卸x了的函數(shù)可以用。
-
通過(guò)定義數(shù)據(jù)成員為私有,可以實(shí)現(xiàn)函數(shù)來(lái)設(shè)計(jì)、約束或禁止對(duì)這些成員的各種訪問(wèn)(讀/寫等)。而如果將其設(shè)為公有(public),你將無(wú)法得知你的成員會(huì)被誰(shuí)改動(dòng),也不知道會(huì)是怎樣的改動(dòng)。
-
而更重要的好處是封裝(encapsulation):可以方便的通過(guò)修改函數(shù)來(lái)改變成員的訪問(wèn)方式;在成員被訪問(wèn)時(shí)通知其他對(duì)象;實(shí)現(xiàn)多線程中的同步等等。
封裝的好處究其本質(zhì),是通過(guò)對(duì)用戶隱藏?cái)?shù)據(jù)成員來(lái)保證類行為的一致性(class invariant)。因?yàn)榻涌诒怀蓡T訪問(wèn)函數(shù)限制了,類的作者也為自己日后修改類的實(shí)現(xiàn)留了后路:如果所有的成員都是公有的,對(duì)任何代碼的修改都有可能影響到外界的使用。(因此Scott說(shuō)“Public means unencapsulated, and practically speaking, unencapsulated means unchangeable, especially for classes that are widely used.”)
那么可不可以聲明為保護(hù)(protected)呢?其實(shí)道理和前面的公有是一樣的。公有的成員對(duì)類的外部完全開(kāi)放,而保護(hù)的成員對(duì)類的繼承者完全開(kāi)放。這個(gè)就像兩個(gè)區(qū)間:(-infinity, +infinity) 和 (0, +infinity),兩者的大小是一樣的。
接下來(lái)大師的一句話有擊中要害:從分裝的角度,只有兩種訪問(wèn)級(jí)別:私有,及其他。