pro mvvm 读书笔记
一、分離關(guān)注點
目的是確保每一個模塊值有單一的,明確的目的,不需要去負責其他的功能。單一的目的也稱為關(guān)注點。
1.1依賴
引用程序集對于依賴來說不是必須的。依賴關(guān)系可能也存在于一個代碼單元要知道另一個單元,如果是一個類需要使用另外一個類,那么前者就是依賴于后者,特別的依賴還存在于類的方法,屬性,以及構(gòu)造器。強烈建議把類的接口和實現(xiàn)分開。
上面兩端代碼是實現(xiàn)同樣的目的,實現(xiàn)畫出一個形狀
/*唯一能畫出來的是一個圓,每次圖形改變時,有可能需要畫矩形,DrawShape必須改變,這樣增加了維護成本*還有個不足是,畫圓形是,我可以根據(jù)圓心和半徑畫,可能不想這樣畫,我想根據(jù)一段弧來畫,那么必須改變*畫內(nèi)部的方法。 */public class ShapeRenderer{private IGraphicsContext _graphicsContext;public void DrawShape(Circle circleShape){_graphicsContext.DrawCircle(circleShape.Position, circleShape.Radius);}}//可以畫出多個形狀,只需要把形狀繼承Ishape接口,然后在畫的時候中傳入繪畫時的方法//就可以達到了控制反轉(zhuǎn)的效果了public class ShapeRenderer{private IGraphicsContext graphicsContext;public void DrawShape(IShape shape){shape.Draw(graphicsContext);}}下面的方法比上面的方法更抽象一下,沒有第一種直觀,但是可以符合多種情況的使用。減少了維護的成本。以上的例子說明如果讓用戶操作看做最高層,各個對象看做最底層時,不應(yīng)該讓高層依賴底層,應(yīng)該讓高層的依賴于低層的代碼。
ViewModel主要從Model獲取他需要的數(shù)據(jù),經(jīng)過加工數(shù)據(jù),然后實現(xiàn)View可以理解和使用的接口。View的改變完全和Model不相干的。因為Model的心里完全沒有View的概念。Model的改變對View影響也通過ViewModel變得很緩和了,因為ViewModel是直接為View所用的。
通常來講,Model是對立的,既不依賴與ViewModel,也不依賴與View
二、Model
Model不僅對于wpf或者silverlight程序是很有用的,對于其他應(yīng)用程序也是很有用的。
2.1封裝
封裝就是用來隱藏信息,其最佳實踐目標是保持封裝,避免信息被肉眼看到。在代碼中,信息是由類及其公共方法屬性,字段,和構(gòu)造器組成,這些數(shù)據(jù)有些事只讀的,有些是可寫的。如果在類中的數(shù)據(jù)可以直接的可以寫,這說明類存在潛在的問題。
封裝其實就是類內(nèi)部的信息被其他對象訪問,但是類內(nèi)部的實現(xiàn),只有自己知道。
2.2不要欺騙自己
復制代碼是一種罪過,當如果重復的賦值代碼時,就應(yīng)該改變代碼了。因為如果復制的代碼修改了,就要修改兩次或者多次。如果第二個沒有修改,就意味著bug的已經(jīng)進入你的應(yīng)用程序了。
三、ViewModel
public class SampleViewModel : INotifyPropertyChanged{/** 最常用的public元素放在最頂端和常用的字段放在最低端* 在此例子中ViewModel不負責計算的過程,而是通過Model來實現(xiàn)的* 屬性是View中要使用的* */#region Constructorspublic SampleViewModel(){_model = new SampleModel();}#endregion#region Properties//也是可讀寫的屬性,但是只有ViewModel可以Set//由于ViewModel變化時要通知View所以,會在值改變時//調(diào)用PropertyChanged事件public double Result{get { return _result; }private set{if(_result != value){_result = value;if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs("Result"));}}}}//可以讀寫的原因是我們要讓用戶來寫內(nèi)容,從而使員我們的ViewModel來讀取public double Number{get;set;}public ICommand CalculateSquareRootCommand{get{if (_calculateSquareRootCommand == null){_calculateSquareRootCommand = new RelayCommand(param =>this.CalculateSquareRoot());}return _calculateSquareRootCommand;}}#endregion#region Methodsprivate void CalculateSquareRoot(){Result = _model.CalculateSquareRoot(Number);}#endregion#region Fieldspublic event PropertyChangedEventHandler PropertyChanged;private double _result;private RelayCommand _calculateSquareRootCommand;private SampleModel _model;#endregion}總結(jié)
以上是生活随笔為你收集整理的pro mvvm 读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android adt 初步理解和分析(
- 下一篇: mysql-mha高可用