<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 面向對象設計原則之接口隔離原則 接口隔離原則定義如下: > 接口隔離原則(Interface Segregation Principle, ISP):使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。 根據接口隔離原則,當一個接口太大時,我們需要將它分割成一些更細小的接口,使用該接口的客戶端僅需知道與之相關的方法即可。每一個接口應該承擔一種相對獨立的角色,不干不該干的事,該干的事都要干。這里的“接口”往往有兩種不同的含義:一種是指一個類型所具有的方法特征的集合,僅僅是一種邏輯上的抽象;另外一種是指某種語言具體的“接口”定義,有嚴格的定義和結構,比如Java語言中的interface。對于這兩種不同的含義,ISP的表達方式以及含義都有所不同: (1) 當把“接口”理解成一個類型所提供的所有方法特征的集合的時候,這就是一種邏輯上的概念,接口的劃分將直接帶來類型的劃分。可以把接口理解成角色,一個接口只能代表一個角色,每個角色都有它特定的一個接口,此時,這個原則可以叫做“角色隔離原則”。 (2) 如果把“接口”理解成狹義的特定語言的接口,那么ISP表達的意思是指接口僅僅提供客戶端需要的行為,客戶端不需要的行為則隱藏起來,應當為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口。在面向對象編程語言中,實現一個接口就需要實現該接口中定義的所有方法,因此大的總接口使用起來不一定很方便,為了使接口的職責單一,需要將大接口中的方法根據其職責不同分別放在不同的小接口中,以確保每個接口使用起來都較為方便,并都承擔某一單一角色。接口應該盡量細化,同時接口中的方法應該盡量少,每個接口中只包含一個客戶端(如子模塊或業務邏輯類)所需的方法即可,這種機制也稱為“定制服務”,即為不同的客戶端提供寬窄不同的接口。 下面通過一個簡單實例來加深對接口隔離原則的理解: Sunny軟件公司開發人員針對某CRM系統的客戶數據顯示模塊設計了如圖1所示接口,其中方法dataRead()用于從文件中讀取數據,方法transformToXML()用于將數據轉換成XML格式,方法createChart()用于創建圖表,方法displayChart()用于顯示圖表,方法createReport()用于創建文字報表,方法displayReport()用于顯示文字報表。 ![](http://my.csdn.net/uploads/201205/13/1336910243_3390.jpg) 圖1 初始設計方案結構圖 在實際使用過程中發現該接口很不靈活,例如如果一個具體的數據顯示類無須進行數據轉換(源文件本身就是XML格式),但由于實現了該接口,將不得不實現其中聲明的transformToXML()方法(至少需要提供一個空實現);如果需要創建和顯示圖表,除了需實現與圖表相關的方法外,還需要實現創建和顯示文字報表的方法,否則程序編譯時將報錯。 現使用接口隔離原則對其進行重構。 在圖1中,由于在接口CustomerDataDisplay中定義了太多方法,即該接口承擔了太多職責,一方面導致該接口的實現類很龐大,在不同的實現類中都不得不實現接口中定義的所有方法,靈活性較差,如果出現大量的空方法,將導致系統中產生大量的無用代碼,影響代碼質量;另一方面由于客戶端針對大接口編程,將在一定程序上破壞程序的封裝性,客戶端看到了不應該看到的方法,沒有為客戶端定制接口。因此需要將該接口按照接口隔離原則和單一職責原則進行重構,將其中的一些方法封裝在不同的小接口中,確保每一個接口使用起來都較為方便,并都承擔某一單一角色,每個接口中只包含一個客戶端(如模塊或類)所需的方法即可。 通過使用接口隔離原則,本實例重構后的結構如圖2所示: ![](http://my.csdn.net/uploads/201205/13/1336910247_6209.jpg) 圖2 重構后的結構圖 在使用接口隔離原則時,我們需要注意控制接口的粒度,接口不能太小,如果太小會導致系統中接口泛濫,不利于維護;接口也不能太大,太大的接口將違背接口隔離原則,靈活性較差,使用起來很不方便。一般而言,接口中僅包含為某一類用戶定制的方法即可,不應該強迫客戶依賴于那些它們不用的方法。 擴展 在《敏捷軟件開發——原則、模式與實踐》一書中,RobertC. Martin從解決“接口污染”的角度對接口隔離原則進行了詳細的介紹,大家可以參閱該書第12章——接口隔離原則(ISP)進行深入的學習。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看