代碼重構~封裝(zhuang)成員(yuan)變量
封裝成員變量(Encapsulate Field) — 將僅限于本類使用的(de)(de)變量(liang)重寫成私有(private)成員變量(liang),并提供訪問(wen)方(fang)法(fa)(accessor method)。這種重構(gou)方(fang)式可以將與外(wai)(wai)部調(diao)用者(zhe)無關的(de)(de)變量(liang)隱(yin)藏起來,減少代碼的(de)(de)耦(ou)合性,并減少意外(wai)(wai)出錯的(de)(de)概率。
看圖所示:
1 /// <summary> 2 /// 驗證實(shi)體類 3 /// </summary> 4 public class RuleViolation 5 { 6 /// <summary> 7 /// 驗(yan)證指(zhi)向的錯誤信息 8 /// </summary> 9 public string ErrorMessage { get; private set; } 10 /// <summary> 11 /// 驗(yan)證指(zhi)向的屬性名 12 /// </summary> 13 public string PropertyName { get; private set; } 14 15 public RuleViolation(string errorMessage) 16 { 17 ErrorMessage = errorMessage; 18 } 19 20 public RuleViolation(string errorMessage, string propertyName) 21 { 22 ErrorMessage = errorMessage; 23 PropertyName = propertyName; 24 } 25 }
以上的代碼是一種特殊的封裝成員變量的方(fang)式,它使用(yong)了.net3.5的get;set;特性,不(bu)需要重新定義額外的變量,顯得程序代碼更簡潔,層次更清(qing)晰。
下面代碼是一種典型的封裝成員變量的方式
不規范的代碼:
public abstract class Singleton<TEntity> where TEntity : class { public TEntity Instance=...; }
使用封裝成員變量進行代碼重構之后:
public abstract class Singleton<TEntity> where TEntity : class { private Lazy<TEntity> _instance=...; public TEntity Instance { get { return _instance.Value; } }
}
其中代碼中的_instance對外是“隱藏”的,而外界可以通過Instance這個只讀的屬性去訪問這個_instance的值。