一、分离关注点

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

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);
}
}

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

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
}

pro mvvm 读书笔记的更多相关文章

  1. Pro mvvm读书笔记mvvm中的VM

    一.构建ViewModels 设计模式的其中一个目标就是抽象构造一个给出指定类型的对象或者实现指定类型的接口的过程.需要把类给客户端,让客户端去使用,但是要隐藏类是具体的实现细节. 1.1The Ap ...

  2. Pro Git 读书笔记

    一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...

  3. Pro Git读书笔记 - 分支

    Git 分支介绍. 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创 ...

  4. Pro Git读书笔记 - Git 常用命令

    在工作目录中初始化新仓库 要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行git init 检查当前文件状态 要查看哪些文件处于什么状态,可以用git status命令 将工作文件 ...

  5. pro git 读书笔记 3 Git 分支

    分支 新建分支:git branch 分支名 切换到该分支:git checkout 分支名 补充:以上两条语句等价于一句:git checkout -b 分支名 转换分支的时候最好保持一个清洁的工作 ...

  6. pro git 读书笔记 1

    Git 1 - Getting Started Git 的特点 Git 存储每个版本的快照:其他 VCS(版本控制系统) 存储两个版本的变化之处 好处参考 Git 分支章节 Git 几乎所有操作都是本 ...

  7. pro git 读书笔记 2

    Git 2 - Git Basics 1 add github 上建立新的 repository,命名 demo git clone 到本地 github 目录 将自己之前的项目 copy 到该 de ...

  8. 【Tools】Pro Git 一二章读书笔记

    记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧.   Pro Git (Scott Chacon) 读书笔记:   ...

  9. Git Pro读书笔记

    本文为Git Pro读书笔记,所有内容均来自Git Pro 1 Git基础 1.1 记录每次更新到仓库 在Git里,文件有4种状态,modified, staged, commited, 还有一种状态 ...

随机推荐

  1. java Socket Tcp 浏览器和服务器(一)

    自定义服务端,使用已有的客户端IE,了解一下客户端给服务端发了什么请求? 发送的请求是: GET / HTTP/1.1  请求行  请求方式  /myweb/1.html  请求的资源路径   htt ...

  2. 搭建Weblogic服务器

    安妮,我的小熊熊在ne....... 01.安全设置 service iptables stop chkconfig iptables off    #关闭防火墙,只是建议,为了简便操作 setenf ...

  3. BroadcastReceiver之实现锁屏、解锁样例

    好久没有写android的小样例了,因为前几天写了一篇关于Intent.Action的文章(http://blog.csdn.net/ljphhj/article/details/38796739). ...

  4. php新特性:trait 关键字使用

    1.trait关键字:含义[特性] 1.1 和require include 区别: 后两者需要 实例化一个类或者静态调用,而trait相当于继承,但又不是extends关键字,它解决了单继承. 2. ...

  5. 让 linux centos 文件夹地址栏 位置栏显示出来的方法

    今天又拿起心爱的 linux ,发现多日不用又忘记了不少知识了    , 发现忘记的速度真是惊人的! 设置方法: 编辑-> 首选项-> 勾选 总是在浏览器窗口中打开,  如图:

  6. Windows下面安装和配置MySQL(5.6.20)

    1.首先到http://dev.mysql.com/ 上下载windows版mysql5.6免安装zip包.然后将zip包解压到D:\mysql-5.6.20-winx64下. 2.复制mysql下的 ...

  7. 区块链的java实现

    原文地址:http://blog.csdn.net/xiangzhihong8/article/details/53931213 本文90%来着于翻译,原文地址:http://java-lang-pr ...

  8. Windows驱动 INF文件

    参考一:百度百科 参考二:INF文件的节 参考三:wikipedia 参考四:MSDN: INF File INF文件的节 INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名 ...

  9. c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL

    c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...

  10. python学习笔记——爬虫的抓取策略

    1 深度优先算法 2 广度/宽度优先策略 3 完全二叉树遍历结果 深度优先遍历的结果:[1, 3, 5, 7, 9, 4, 12, 11, 2, 6, 14, 13, 8, 10] 广度优先遍历的结果 ...