zoukankan      html  css  js  c++  java
  • pro mvvm 读书笔记

    一、分离关注点

    目的是确保每一个模块值有单一的,明确的目的,不需要去负责其他的功能。单一的目的也称为关注点。

    1.1依赖

    引用程序集对于依赖来说不是必须的。依赖关系可能也存在于一个代码单元要知道另一个单元,如果是一个类需要使用另外一个类,那么前者就是依赖于后者,特别的依赖还存在于类的方法,属性,以及构造器。强烈建议把类的接口和实现分开。

    上面两端代码是实现同样的目的,实现画出一个形状

    /*唯一能画出来的是一个圆,每次图形改变时,有可能需要画矩形,DrawShape必须改变,这样增加了维护成本
         *还有个不足是,画圆形是,我可以根据圆心和半径画,可能不想这样画,我想根据一段弧来画,那么必须改变
         *画内部的方法。 
         */
        public class ShapeRenderer
        {
    
            private IGraphicsContext _graphicsContext;
            public void DrawShape(Circle circleShape)
            {
                _graphicsContext.DrawCircle(circleShape.Position, circleShape.Radius);
            }
        }
    
        //可以画出多个形状,只需要把形状继承Ishape接口,然后在画的时候中传入绘画时的方法
        //就可以达到了控制反转的效果了
        public class ShapeRenderer
        {
            private IGraphicsContext graphicsContext;
            public void DrawShape(IShape shape)
            {
                shape.Draw(graphicsContext);
            }
        }

    下面的方法比上面的方法更抽象一下,没有第一种直观,但是可以符合多种情况的使用。减少了维护的成本。以上的例子说明如果让用户操作看做最高层,各个对象看做最底层时,不应该让高层依赖底层,应该让高层的依赖于低层的代码。

    image

    ViewModel主要从Model获取他需要的数据,经过加工数据,然后实现View可以理解和使用的接口。View的改变完全和Model不相干的。因为Model的心里完全没有View的概念。Model的改变对View影响也通过ViewModel变得很缓和了,因为ViewModel是直接为View所用的。

    通常来讲,Model是对立的,既不依赖与ViewModel,也不依赖与View

    二、Model

    Model不仅对于wpf或者silverlight程序是很有用的,对于其他应用程序也是很有用的。

    2.1封装

    封装就是用来隐藏信息,其最佳实践目标是保持封装,避免信息被肉眼看到。在代码中,信息是由类及其公共方法属性,字段,和构造器组成,这些数据有些事只读的,有些是可写的。如果在类中的数据可以直接的可以写,这说明类存在潜在的问题。

    封装其实就是类内部的信息被其他对象访问,但是类内部的实现,只有自己知道。

    2.2不要欺骗自己

    复制代码是一种罪过,当如果重复的赋值代码时,就应该改变代码了。因为如果复制的代码修改了,就要修改两次或者多次。如果第二个没有修改,就意味着bug的已经进入你的应用程序了。

    三、ViewModel

    public class SampleViewModel : INotifyPropertyChanged
        {
    
            /** 最常用的public元素放在最顶端和常用的字段放在最低端
             * 在此例子中ViewModel不负责计算的过程,而是通过Model来实现的
             * 属性是View中要使用的
             * 
             */
            #region Constructors
                public SampleViewModel()
                {
                _model = new SampleModel();
                }
            #endregion
            #region Properties
                //也是可读写的属性,但是只有ViewModel可以Set
                //由于ViewModel变化时要通知View所以,会在值改变时
                //调用PropertyChanged事件
                public double Result
                {
                    get { return _result; }
                    private set
                    {
                        if(_result != value)
                        {
                            _result = value;
                            if (PropertyChanged != null)
                            {
                                PropertyChanged(this, new PropertyChangedEventArgs("Result"));
                            }
                        }
                    }
                }
                //可以读写的原因是我们要让用户来写内容,从而使员我们的ViewModel来读取
                public double Number
                {
                    get;
    
                    set;
                }
                public ICommand CalculateSquareRootCommand
                {
                    get
                    {
                        if (_calculateSquareRootCommand == null)
                        {
                        _calculateSquareRootCommand = new RelayCommand(param =>
                        this.CalculateSquareRoot());
                        }
                        return _calculateSquareRootCommand;
                    }
                }
            #endregion
            #region Methods
                private void CalculateSquareRoot()
                {
                    Result = _model.CalculateSquareRoot(Number);
                }
            #endregion
            #region Fields
                public event PropertyChangedEventHandler PropertyChanged;
                private double _result;
                private RelayCommand _calculateSquareRootCommand;
                private SampleModel _model;
            #endregion
        }
  • 相关阅读:
    西瓜书第三章-线性回归模型
    西瓜书第三章-线性模型【Logistic回归】(对数几率回归)
    Matlab绘图(二)低频率命令总结
    LaTex 资源总结
    plsql developer安装和使用遇到的问题解决
    【maven依赖包版本号是unknown导致无法下载】问题解决
    解决TortoiseGit报错:git did not exit cleanly (exit code 128)
    os模块的常用方法使用
    pycharm总是没有输出结果只是Process finished with exit code 0
    Jmeter发送post请求,报错:Content type 'text/plain;charset=UTF-8' not supported
  • 原文地址:https://www.cnblogs.com/lzhp/p/3294538.html
Copyright © 2011-2022 走看看