變異子佮訪問子
佇電腦科學當中,變異子方法(mutator 抑是 setter)是一種用佇咧控制變數閣較改的方法。通常,變異子伴隨著儉取子(accessor 抑是 getter)倒轉來私有成員的變數的值。
變異子方法上捷用佇咧物件導向的編程封裝,佮封裝原則保持一致。根據這个原則,類的成員變數被設為私有以隱藏佮保護𪜶無受其他代碼的影響,並且干焦會當由公共成員函式(變異子方法)修改,該函式將所需要的新值作為參數來修改私有成員變數。會當共變化子方法佮有價值算子加載進行較。
變異子方法嘛會當佇非物件導向的環境來使用。佇這个情形下,對欲修改的變數的參照佮新值做伙傳達予變異子。編譯器無法度限制代碼踅過變化子的方法並直接更改變數。開發人員有責任確保干焦通過變化子的方法修改變數,毋是直接修改變數。
咧支援𪜶的程式語言內底,屬性提供一種方便的替代方案,毋放棄封裝的效用。
佇下跤的範例中,完全實現的變異子方法猶閣會當驗證輸入資料抑是採取進一步的操作,譬如講去觸發事件。
影響
定義變異子佮存取子方法抑是屬性地的另外一種方法是為實例變數提供一寡可見性,毋是私有化伊抑是直接對物件外部存取伊。會使使用修改器佮存取器定義閣較幼路的控制存取權限。比如講,將一个參數設為唯讀,會當通過定義一个存取器毋提供修改器。兩種方法的可見性可能無仝款:存取器通常是公開的;變化化是保護的啦、包私有的抑是內部的。
定義了變異子的塊有機會驗證抑是預處理傳入的資料。若保證所有的外部存取攏總過變化化,無法度踅過遮的步數。比如講,若日期由單獨的私有 ` year `、` month ` 和 ` day ` 變數表示,則傳入日期由變異子 ` setDate ` 拆分,同時為著一致性,仝款的私有實例變數由 ` setYear ` 和 ` setMonth ` 存取。佇所有狀況下,一-十二以外的月份值攏相仝的代碼拒絕。
相反,存取器允准對內部變數合成有路用的資料表示,同時共保持𪜶的結構封裝佮對外部模組袂當看著。貨幣 ` getAmount ` 存取子會當由一个內部私有的數值變數構建一字串,其小數位數是由參數 ` currency ` 定義。
現代的程式語言定定提供佇咧一行中修改器佮存取器的生成樣板—比如講 C # 的 ` public string Name { get ; set ; } ` 和 Ruby 的 ` attr _ accessor : name `。佇咧遮的情況下,袂為驗證、預處理抑是合成等操作建立代碼角。遮的簡化的存取器猶原保留著簡單公共實例變數進行封裝的優勢,猶毋過是看會著,隨著敏捷軟體開發、軟體維護佮需求的變化,對資料的需求變甲閣較複雜。誠濟自動修改器佮存取器最終會被單獨的代碼塊取代。實現的早期自動建立𪜶的好處是,無論是毋是添閣較複雜的類,類的公共介面攏保持仝款,若添加,是無需要進行大量的重構。
因為牽涉著另外的流程,存取器函式的效率可能低於直接取得抑是儲存資料欄位,毋過,遮的函式通常是行內的,自按呢消除了函式呼叫的開銷。
例
組合語言
C
檔案 student . h :
檔案 student . c :
檔案 main . c :
檔案 Makefile :
C + +
檔案 Student . h :
檔案 Student . cpp :
C #
C # 支援屬性編程。
對 ( . NET Framework 三孵五開始,會當縮寫做自動屬性:
會當限制干焦本類會當私有存取:
Python
後例使用的類,佮一个變數、一个存取子,一个變異子。
Visual Basic . NET
類似 C # , 明確使用 ` Get ` 佮 ` Set ` methods .
VB . NET 二千空一十 , 利用 Auto Implemented 建立一个屬性毋免使用 Get 佮 Set 語法。編譯器自動建立一个隱變數,如 ` _ name ` 對應於屬性的名 ` name ` .