日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【封装那些事】 缺失封装

發(fā)布時(shí)間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【封装那些事】 缺失封装 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

缺失封裝

沒有將實(shí)現(xiàn)變化封裝在抽象和層次結(jié)構(gòu)中時(shí),將導(dǎo)致這種壞味。

表現(xiàn)形式通常如下:

  • 客戶程序與其需要的服務(wù)變種緊密耦合,每當(dāng)需要支持新變種或修改既有變種時(shí),都將影響客戶程序。
  • 每當(dāng)需要在層次結(jié)構(gòu)中支持新變種時(shí),都添加了大量不必要的類,這增加了設(shè)計(jì)的復(fù)雜度。

為什么不能缺失封裝?

開閉原則(OCP)指出,類型應(yīng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。也就是說應(yīng)該通過擴(kuò)展(而不是修改)來改變類型的行為。沒有在類型或?qū)哟谓Y(jié)構(gòu)中封裝實(shí)現(xiàn)變化時(shí),便違反了OCP。

缺失封裝潛在的原因

未意識(shí)到關(guān)注點(diǎn)會(huì)不斷變化

沒有預(yù)測(cè)到關(guān)注點(diǎn)可能發(fā)生變化,進(jìn)而沒有在設(shè)計(jì)中正確封裝這些關(guān)注點(diǎn)。

混合關(guān)注點(diǎn)

將彼此獨(dú)立的各個(gè)關(guān)注點(diǎn)聚合在一個(gè)層次結(jié)構(gòu)中,而不是分開時(shí),如果關(guān)注點(diǎn)發(fā)生變化,可能導(dǎo)致類的數(shù)量呈爆炸式增長(zhǎng)。

幼稚的設(shè)計(jì)決策

采用過于簡(jiǎn)單的方法,如為每種變化組合創(chuàng)建一個(gè)類時(shí),可能導(dǎo)致設(shè)計(jì)無謂的復(fù)雜。

示例分析一

假設(shè)有一個(gè)Entryption類,它需要使用加密算法對(duì)數(shù)據(jù)進(jìn)行加密。可供選擇的加密算法有很多,包括DES(數(shù)據(jù)加密標(biāo)準(zhǔn))、AES(高級(jí)加密標(biāo)準(zhǔn))、TDES(三重?cái)?shù)據(jù)加密標(biāo)準(zhǔn))等。Entryption類使用DES算法對(duì)數(shù)據(jù)進(jìn)行加密。

public class Encryption {/// <summary>/// 使用DES算法進(jìn)行加密/// </summary>public void Encrypt(){// 使用DES算法進(jìn)行加密} }

假設(shè)出現(xiàn)了新需求,要求使用AES算法對(duì)數(shù)據(jù)進(jìn)行加密。

最差的方案出現(xiàn)了:

public class Encryption {/// <summary>/// 使用DES算法進(jìn)行加密/// </summary>public void EncryptUsingDES(){// 使用DES算法進(jìn)行加密}/// <summary>/// 使用AES算法進(jìn)行加密/// </summary>public void EncryptUsingAES(){// 使用AES算法進(jìn)行加密} }

這種方案有很多不盡如人意的地方:

  • Encryption類變得更大、更難以維護(hù),因?yàn)樗鼘?shí)現(xiàn)了多種加密算法,但是每次只使用一種。
  • 難以添加新算法以及修改既有算法,因?yàn)榧用芩惴ㄊ荅ncryption類不可分割的部分。
  • 加密算法向Encryption類提供服務(wù),但是與Encryption類緊緊耦合在一起,無法在其它地方重用。

不滿意就重構(gòu),首先使用繼承進(jìn)行重構(gòu),會(huì)有2種方案可以選擇:

選擇1:

讓Encryption類根據(jù)需求繼承AESEncryptionAlgorithm或DESEncryptionAlgorithm類,并提供方法Encrypt()。這種方案帶來的問題是Encryption類在編譯階段就將關(guān)聯(lián)到特定的加密算法,更嚴(yán)重的是類之間的關(guān)系并不是is-a關(guān)系。

/// <summary> /// AES算法加密類 /// </summary> public class AESEncryptionAlgorithm {/// <summary>/// 使用AES算法進(jìn)行加密/// </summary>public void EncryptUsingAES(){// 使用AES算法進(jìn)行加密} }/// <summary> /// DES算法加密類 /// </summary> public class DESEncryptionAlgorithm {/// <summary>/// 使用DES算法進(jìn)行加密/// </summary>public void EncryptUsingDES(){// 使用DES算法進(jìn)行加密} }public class Encryption: AESEncryptionAlgorithm {/// <summary>/// 使用算法進(jìn)行加密/// </summary>public void Encrypt(){EncryptUsingAES();} }

選擇2:

創(chuàng)建子類AESEncryption和DESEncryption,它們都擴(kuò)展了Encryption類,并分別包含加密算法AES和DES的實(shí)現(xiàn)。客戶程序可創(chuàng)建Encryption的引用,這些引用指向特定子類的對(duì)象。通過添加新的子類,很容易支持新的加密算法。但是這種方案的問題是AESEncryption和DESEncryption將繼承Encryption類的其它方法,降低了加密算法的可重用性。

public abstract class Encryption {/// <summary>/// 使用算法進(jìn)行加密/// </summary>public abstract void Encrypt(); }/// <summary> /// AES算法加密類 /// </summary> public class AESEncryption : Encryption {/// <summary>/// 使用 AES算法進(jìn)行加密/// </summary>public override void Encrypt(){// 使用 AES算法進(jìn)行加密} }/// <summary> /// DES算法加密類 /// </summary> public class DESEncryption : Encryption {/// <summary>/// 使用 DES算法進(jìn)行加密/// </summary>public override void Encrypt(){// 使用 DES算法進(jìn)行加密} }

最佳的選擇是使用策略模式:

  • 可在運(yùn)行階段給Encryption對(duì)象配置特定的加密算法
  • 可在其它地方重用層次結(jié)構(gòu)EncryptionAlgorithm中定義的算法
  • 很容易根據(jù)需要支持新的算法
/// <summary> /// 算法加密接口 /// </summary> public interface EncryptionAlgorithm {void Encrypt(); }/// <summary> /// DES算法加密類 /// </summary> public class DESEncryptionAlgorithm : EncryptionAlgorithm {public void Encrypt(){//使用 DES算法進(jìn)行加密} } /// <summary> /// AES算法加密類 /// </summary> public class AESEncryptionAlgorithm : EncryptionAlgorithm {public void Encrypt(){//使用 AES算法進(jìn)行加密} }public class Encryption {private EncryptionAlgorithm algo;public Encryption(EncryptionAlgorithm algo){this.algo = algo;}/// <summary>/// 使用算法進(jìn)行加密/// </summary>public void Encrypt(){algo.Encrypt();} }

示例分析二

支持使用不同算法(DES和AES)對(duì)各種內(nèi)容(Image和Text)進(jìn)行加密的設(shè)計(jì)。

最簡(jiǎn)單最直觀的的設(shè)計(jì):

在這個(gè)設(shè)計(jì)中,有兩個(gè)變化點(diǎn):支持的內(nèi)容類型和加密算法類型。對(duì)于這兩個(gè)變化點(diǎn)的每種可能組合,都使用了一個(gè)類來表示。這樣會(huì)有一個(gè)嚴(yán)重的問題:假設(shè)現(xiàn)在要求支持新加密算法TDES和新內(nèi)容類型Data,類的數(shù)量呈爆炸性增長(zhǎng)。因?yàn)樽兓c(diǎn)混在了一起,沒有分別進(jìn)行封裝。

使用橋接模式進(jìn)行封裝:

使用橋接模式,分別封裝這兩個(gè)關(guān)注點(diǎn)的變化。現(xiàn)在要引入新內(nèi)容類型Data和新加密算法TDES,只需要添加兩個(gè)新類。既解決了類數(shù)量呈爆炸增長(zhǎng)的問題,又增加了根為接口EncryptionAlgorithm層次結(jié)構(gòu)中的加密算法的可重用性。

總結(jié)

  • 不相關(guān)的關(guān)注點(diǎn)混在一起,抽象將變得難以重用。

  • 對(duì)業(yè)務(wù)中可能的變化點(diǎn),要給予擴(kuò)展點(diǎn),保證開閉原則(OCP),對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。

  • 參考:《軟件設(shè)計(jì)重構(gòu)》



    作者:擼碼那些事
    來源:http://songwenjie.cnblogs.com/
    聲明:本文為博主學(xué)習(xí)感悟總結(jié),水平有限,如果不當(dāng),歡迎指正。如果您認(rèn)為還不錯(cuò),不妨點(diǎn)擊一下下方的【推薦】按鈕,謝謝支持。轉(zhuǎn)載與引用請(qǐng)注明出處。
    微信公眾號(hào):


    轉(zhuǎn)載于:https://www.cnblogs.com/songwenjie/p/8975365.html

    總結(jié)

    以上是生活随笔為你收集整理的【封装那些事】 缺失封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。