• 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
        }
  • 相关阅读:
    图像检索(image retrieval)- 11
    图像检索(image retrieval)- 10相关
    Mock.js简易教程,脱离后端独立开发,实现增删改查功能
    Azure Monitor (3) 对虚拟机磁盘设置自定义监控
    Azure Monitor (1) 概述
    Azure SQL Managed Instance (2) 备份SQL MI
    Azure Virtual Network (17) Private Link演示
    Azure Virtual Network (16) Private Link
    Azure Virtual Network (15) Service Endpoint演示
    Azure Virtual Network (14) Service Endpoint服务终结点
  • 原文地址:https://www.cnblogs.com/lzhp/p/3294538.html
Copyright © 2020-2023  润新知