自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分析有關(guān)封裝和信息隱藏的誤區(qū)

開發(fā) 后端
本文主要介紹了封裝和信息隱藏的概念和使用方法,以及一些理解上的誤區(qū),一起來(lái)看。

封裝(Encapsulation)和信息隱藏,這兩個(gè)詞,我想大家都不會(huì)陌生。但是,有很多開發(fā)人員并沒有深入的了解,甚至存在一些誤區(qū)。今天就專門來(lái)說(shuō)一下。

一、封裝

1、什么是封裝?

從字面意思來(lái)看,封裝就是把一些相關(guān)的 東西打包成一坨(看到“坨”這個(gè)量詞,不要想歪了)。“封裝”最廣為人知的例子,就是在面向?qū)ο缶幊蹋ㄒ韵潞?jiǎn)稱OOP)里面,把數(shù)據(jù)和針對(duì)該數(shù)據(jù)的操作,統(tǒng)一到一個(gè)class里。

2、封裝有啥好處?

那封裝有啥好處捏?一個(gè)主要的好處,就是增加軟件代碼的內(nèi)聚性。通過(guò)增加內(nèi)聚性,進(jìn)而提高可復(fù)用性和可維護(hù)性。

3、封裝的手段

很多人把封裝的概念局限于類,認(rèn)為只有OO中的class才算是封裝。這實(shí)際上是片面滴!在很多不使用"類"的場(chǎng)合,一樣能采用封裝的手法。下面俺隨手舉幾個(gè)和OO無(wú)關(guān)的例子:

a、通過(guò)文件

比如C和C++支持對(duì)頭文件的包含(#include)。因此,可以把一些相關(guān)的常量定義、類型定義、函數(shù)聲明,統(tǒng)統(tǒng)封裝 到某個(gè)頭文件中。

b、通過(guò)namespace/package/module

C++的namespace、Java的package、Python的module,想必各自的開發(fā)人員都很熟悉。這些語(yǔ)法雖然稱呼各不相同,但具有相同的本質(zhì)。因此,也可以利用這些語(yǔ)法,來(lái)進(jìn)行封裝。

二、信息隱藏

1、什么是信息隱藏?

“信息隱藏”——顧名思義——就是把不該暴露的信息藏起來(lái)。說(shuō)到信息隱藏,很多人自然而然地,就聯(lián)想到某些OO語(yǔ)言(比如C++、Java)提供的,諸如private、protected之類的關(guān)鍵字。這些關(guān)鍵字可以通過(guò)訪問(wèn)控制,來(lái)達(dá)到信息隱藏的目的。

2、信息隱藏有啥好處?

信息隱藏的好處,正好和“封裝”的好處相呼應(yīng)。封裝是為了提高內(nèi)聚性;而信息隱藏是為了降低耦合性。通過(guò)降低耦合,一樣可以達(dá)到提高可復(fù)用性、可維護(hù)性這2個(gè)目的。

3、信息隱藏的手段

和封裝類似,很多程序員也把信息隱藏的概念片面化——認(rèn)為信息隱藏僅限于private和protected關(guān)鍵字。所以,俺再隨手舉幾個(gè)其它的信息隱藏手段。

a、通過(guò)接口類

可以通過(guò)定義接口類(Java中的interface、C++中的純虛類)來(lái)實(shí)現(xiàn)信息隱藏。具體實(shí)現(xiàn)如下:

定義一個(gè)接口類,僅包含一些公有的成員函數(shù)的聲明 (Java的abstract函數(shù),C++的純虛函數(shù)),沒有任何函數(shù)實(shí)現(xiàn),也沒有任何成員變量。然后把具體的實(shí)現(xiàn)代碼放到該接口類的一個(gè)派生子類中。

由于調(diào)用者只看到接口類,看不到實(shí)現(xiàn)類。所以,同樣可以達(dá)到信息隱藏。在某些情況下,使用這種手段達(dá)到的效果,會(huì)比基于訪問(wèn)控制(使用private關(guān)鍵字)的效果,更好。

不過(guò)這種手段依賴于語(yǔ)言的支持。使用該手法的編程語(yǔ)言,至少要支持繼承、虛函數(shù)等語(yǔ)法。

b、通過(guò)pimpl手法

pimpl手法也叫作“Opaque Pointer”手法。和接口類的手法不同,pimpl手法不需要靠繼承、虛函數(shù)等語(yǔ)法的支持,因此對(duì)諸如C語(yǔ)言來(lái)說(shuō),很有用。

三、一些理解上的誤區(qū)

介紹完一些基本概念,再來(lái)說(shuō)一下,關(guān)于封裝、信息隱藏的一些常見誤區(qū)。

1、把封裝等同于信息隱藏

這是混淆最嚴(yán)重的一個(gè)誤區(qū)——很多初學(xué)OOP的同學(xué)都把封裝和信息隱藏混為一談。希望經(jīng)過(guò)俺前面的一番解釋,有些人能搞明白其中的差異。順便提一下,有個(gè)老外寫了篇小有名氣的文章——“Encapsulation is not information hiding ”。洋文好的同學(xué),可以去瞅一瞅。

2、把封裝看得太狹隘

其實(shí)前面已經(jīng)通過(guò)舉例,駁斥了狹隘看待封裝的誤區(qū)。此處不再啰嗦。

3、把信息隱藏看得太狹隘

前面已經(jīng)通過(guò)舉例,駁斥了狹隘看待信息隱藏的誤區(qū)。此處不再啰嗦。

4、混淆可訪問(wèn)性和可見性

考慮到某些網(wǎng)友可能連這兩者的區(qū)別都不太清楚,先簡(jiǎn)單解釋一下。所謂可訪問(wèn)性,就是可以對(duì)某個(gè)東西進(jìn)行讀/寫操作;所謂可見性,就是能夠感覺到某個(gè)東西的存在。

前面談到信息隱藏時(shí),我們提及了通過(guò)訪問(wèn)控制的關(guān)鍵字(private、protected)來(lái)達(dá)到信息隱藏的目的。有很多同學(xué)認(rèn)為這幾個(gè)關(guān)鍵字不光禁止了可訪問(wèn)性(accessibility),還禁止了可見性(visibility)。其實(shí)也不盡然。不同的編程語(yǔ)言,對(duì)這兩者的處理是不同滴。比如在 C++語(yǔ)言中,類的私有成員雖然不可訪問(wèn),但還是可見的。此話怎講捏?請(qǐng)看下面的例子:

  1. int n = 0;  
  2. class Parent  
  3. {  
  4. public:  
  5. Parent()  
  6. {  
  7. n = 1;  
  8. }  
  9. private:  
  10. int n;  
  11. };  
  12. class Child : public Parent  
  13. {  
  14. public:  
  15. Child()  
  16. {  
  17. }  
  18. void Func()  
  19. {  
  20. ::printf("%d", n);  
  21. }  
  22. };  
  23. int main()  
  24. {  
  25. Child c;  
  26. c.Func();  
  27. return 0;  
  28. }  

如果俺問(wèn)列位看官,程序執(zhí)行后會(huì)打印出啥?相信一多半的同學(xué)會(huì)回答:“打印0”。

但是,真相是:該程序根本在編譯時(shí)就報(bào)錯(cuò)了。

問(wèn)題在于,父類的私有成員變量n雖然對(duì)子類是無(wú)法訪問(wèn)的,但依然是可見的(可感知的)。所以,對(duì)于那個(gè)printf語(yǔ)句,編譯器會(huì)認(rèn)為是企圖訪問(wèn)父類的私有成員,故而報(bào)錯(cuò)。

再悄悄跟大伙兒說(shuō)一下,這個(gè)例子是俺從C++它爹所寫的《The Design and Evolution of C++》里面剽竊滴。

四、結(jié)尾

今天的話題,基本上到此結(jié)束了。***,俺想提醒列位看官注意一下:象封裝和信息隱藏,都屬于編程的基本功,為啥很多開發(fā)人員都沒有想透徹捏?

如果大家有什么不明白的,可以參見原文,下面是原文地址。

本文出處:http://blog.csdn.net/program_think/archive/2010/08/29/5846881.aspx

【編輯推薦】

  1. Javascript面向?qū)ο缶幊蹋ㄒ唬?封裝
  2. 基本的封裝Ajax之一
  3. 淺談C++調(diào)用C#的DLL程序方法
  4. C++多態(tài)技術(shù)的實(shí)現(xiàn)和反思
  5. C++連接mysql數(shù)據(jù)庫(kù)的兩種方法
責(zé)任編輯:于鐵 來(lái)源: CSDN博客
相關(guān)推薦

2016-09-09 00:12:41

大數(shù)據(jù)大數(shù)據(jù)分析誤區(qū)

2021-10-21 10:04:37

零信任技術(shù)前線企業(yè)

2009-08-13 14:52:21

.NET性能誤區(qū)C#和VB.NET

2018-08-07 11:08:10

容器虛擬機(jī)鏡像

2011-06-09 13:00:47

2011-06-28 15:56:34

Qt

2022-06-15 15:34:12

數(shù)據(jù)分析分析模型誤區(qū)

2022-04-12 13:44:19

數(shù)據(jù)分析算法人工智能

2013-03-21 09:48:54

云存儲(chǔ)成本

2009-07-15 18:16:47

性能測(cè)試結(jié)果

2018-06-20 11:41:06

企業(yè)架構(gòu)

2010-02-07 11:13:04

Android設(shè)備間

2010-03-02 09:13:55

Android手機(jī)系統(tǒng)

2017-02-22 09:30:41

2012-10-15 09:47:06

BYODRSA大會(huì)

2020-11-30 10:41:25

CIO首席信息官IT文化

2020-11-30 12:57:27

IT文件數(shù)字化IT組織

2017-12-02 22:26:45

數(shù)據(jù)分析信息技術(shù)IT

2011-03-30 10:53:45

2021-07-06 14:27:34

Tokei編程語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)