WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)
原文:WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

     我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。

     现在,感觉和事实是完全不同的两个东西。当你看到三层架构的框图的时候,你会觉得每层的职责被分配的很好。但是当你你真的去写代码的时候你会发现其实一些层被迫去做本不应该他们做的额外的事情(违反了SOLID原则的S)。

QQ图片20151105223111

 

     这个额外的工作就是在UI-Model和Model-Data access之间的代码。让我们就把这些代码称为“GLUE”代码。有两种主要的逻辑会造成“GLUE”代码(也许我知道的并不够多,其他的可以自己发现):

1.映射逻辑(绑定逻辑):每一层通过属性,方法,集合来和其他层进行通信。举个例子,一个在UI层的叫做“txtCustomerName”的textbox和customer类的“CustomerName”属性进行关联。

txtCustomerName.text=custobj.CustomerName;//mapping code

现在谁拥有上面的绑定逻辑代码,是UI还是Model层?开发者一般把这个代码推到UI层。

2.转换逻辑:数据格式在不同的层是不一样的。比如,一个“Person”类有一个叫”Gender“的属性又包含“F”和“M”,但是在UI层,我们希望看到一个checkbox,“checked”(true)代表male,“unchecked”(false)代表female。下面是一个转换的示例代码。

if(obj.Gender==”M”)//transformation code
chkMale.IsChecked=true;
else
chkMale.Ischecked=false;

     大多数的开发者会在UI层写这样的“GLUE”代码。为了把这些代码分的详细一般可以在背后的代码找到答案,比如.cs文件等。因此如果先”xaml”然后”xaml.cs”会有粘合代码,先”aspx”再“aspx.cs”也会有粘合代码等等。

     现在有一个问题:粘合代码是UI的职责么?让我们来看一个WPF程序的例子和粘合的代码的细节。

下面是一个简单的”Customer”模型类,有3个属性“CustomerName”,”Amount”和”Married”字段。

QQ图片20151105225957

     但是这个模型在UI层展示的时候,它和下面展示的一样。因此,你能看到它包含模型的所有字段同时也加上了一些额外的东西,看color label 和 married check box。

     下面是一个简单的图表,左边是模型的字段,右边是UI的字段。中间是关于映射和转换的逻辑的描述。

     你可以看到前2个字段我们没有任何的转换逻辑,他们只有映射的逻辑。其他2个字段映射和转换的逻辑都有。

QQ图片20151105230544

     转换和映射的逻辑通常都在后台代码中,就如“XAML.CS”。下面就是上面customer screen的后台代码,你可以看到映射代码,颜色的判断代码和性别格式转换代码。我给代码添加了注释方便你可以看到哪是映射代码,哪是转换代码。

QQ图片20151105230909

 

 

 

 

 

 

 

 

 

 

 

 现在围绕GLUE代码有几个问题:

1.违反SRP:这样的GLUE代码是UI的职责么?如果你知道了当时的情况,在amout的值改变的时候,UI的代码也要做出改变。那为什么当数据改变的时候我需要去改变我的UI代码。似乎可以嗅到不良代码的味道。UI应该是只有在我改变styles,colors,positoning等的时候才会要改变。

2.重用性:如果我想把同样的颜色逻辑和性别转换用在下图这样的一个编辑的界面上,我怎么去做呢?我去复制粘贴去创建重复的代码?

QQ图片20151106000256

假如我想去领先一步把粘合代码用在不同的UI技术上,像MVC,Windows form 或者mobile。

QQ图片20151106000545

但是由于UI背后的规范和UI技术关系很紧密,这样跨不同UI技术的重用事实上是不可能的。

例如,下面的代码是继承自“Window”类。”Window”类和WPF UI 技术关系很紧密。因此,如果我们想把这个逻辑用在Web应用或者MVC上时,我们怎样去创建一个这个类的对象并且去消耗它。

public partial class MainWindow:Window
{
//behind code is here
}

我们怎么去重用后台代码?我们怎么去遵守SRP?

posted on 2018-06-04 00:03 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9131382.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YARN集群构建运行PySpark Application

文章转载:https://www.tuicool.com/articles/eaYVN3v Spark Application可以直接运行在YARN集群上,这种运行模式,会将资源的管理与协调统一交给YARN集群去处理,这样能够实现构建于YARN集群之上Application的多样性,比…

[luogu4133 BJOI2012] 最多的方案 (计数dp)

题目描述 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F11, F22, Fi Fi-1 Fi-2,每一项都可以称为斐波那契数。现在给一个正整数N,它可以写成一些斐波那契数的和的形式。如果我们要求不同的方案中不能有相同的斐波那契…

Apache nifi 集群安装

原文地址:https://pierrevillard.com/2016/08/13/apache-nifi-1-0-0-cluster-setup/ 文章写的很好了,步骤性的英文写得也比较易懂,原样搬过来了,没有再翻译 As you may know a version 1.0.0-BETA of Apache NiFi has been rele…

stixel提升思路总结

1.用psmnet获得更好的disparity 2.用edgebox获得整个rgb图片的边缘,然后通过原本的stixel的上下边缘去寻找最优,用两个的边缘去重新得到一个新的边缘,但获得的轮廓不仅仅是外轮廓还有内部的轮廓,得出的结果比之前没有太多提升. 目前可以尝试在disparity图求边缘这种方式 3.使用…

Hive分区表count(*)不起mapreduce的真相

问题背景: 在对Hive求count(*)时,发现有些表会启mapreduce计算、返回 结果,比较耗时,有的表1秒之内返回结果 刚开始以为刚刚执行过一次count()后会对结果进行缓存,不用再去跑mapreduce,但经进一步实验发现…

进阶攻略|前端完整的学习路线

最近写了一篇关于前端一些常见轻便耐用的UI框架的小总结,很多小伙伴私信问我,要怎么学习前端,没有明确的方向,为了感谢大家的关注点赞打赏和喜欢,决定把前端的学习进阶之路稍微整理一下,也为了自己能在工作…

Kylin下构建Cube第一步出错:shell-init: error retrieving current directory

问题背景: 生产环境部署的Kylin-2.1,官方发布的最新安装包并不支持更改hbase存储的namespace,修改源码后重新打包部署过程中,build cube第一步出错 大概错误信息是: OS command error exit with 5 – hive -e "…

python 字典练习 记录学生是否交作业的小程序

#记录学生是否交作业的小程序 #包括:学生名字、日期、状态 1 data{2 taotao:{3 2018-6-3:已交,4 2018-6-4:未交,5 2018-6-5:已交6 } 7 mingming:{8 2018-6-3:未交,9 2018-6-4:已交 10 } 11 } #1、判断名字和日期是否…

boost::timer库使用

boost::timer boost库定时器使用,需要在编译时加相关链接库 -lboost_timer -lboost_system boost::timer::cpu_timer 和boost::timer::auto_cpu_timer用于精确定时,有start(),elapsed(),is_stopped()等方法,elapsed()方法返回的时结构体boost…

Kylin 2.0升级总结

文章转载,原文地址:https://blog.bcmeng.com/post/kylin-upgrade.html #6-给kylin社区的建议 引用于个人自查、学习 Kylin 2.0的升级节奏 升级的大原则 升级的目标 1 Kylin 2.0 升级流程 1.1 Kylin 2.0 代码合入 1.2 配置更新和梳理 1.3 兼容性测…

Html5 学习笔记 --》html基础 css 基础

HTML5 功能 HTML5特点 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8"><title>基本格式</title> </head> <body><a href"http://www.baidu.com">百度</a> </b…

Kylin修改默认hbase namespace命名空间default的解决方案

问题及背景&#xff1a;同一用户的三家公司的物理集群合并&#xff0c;合并后用dataspacekerberos控制不同公司对集群资料的访问权限&#xff0c;三家公司分别使用独立的kerberos票据访问&#xff0c;特定的namespace,而生产环境部署的kylin-2.0/2.1只能保存cuboid到hbase 的 d…

pip download timeout 下载慢,超时解决方法

更换国内的pypi源&#xff1a; 如&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple –upgrade tensorflow-gpu

test'

message.info(Click on left button.);直接弹出提示信息console.log(click left button, e); 后台输出区别 import { Pagination } from antd;function onShowSizeChange(current, pageSize) {console.log(current, pageSize); }ReactDOM.render(<Pagination showSizeChang…

Error:-81024 LR_VUG:The 'QTWeb' type is not supported on win32 platforms

在LR的bin目录下&#xff0c;选择Wlrun.exe文件&#xff0c;右键单击&#xff0c;选择属性&#xff1b;在兼容性里面把兼容性模式改为Windows XP (Service Pack 3),应用保存&#xff1b;然后再关闭controller&#xff0c;重新打开运行就可以了&#xff1b;

VMware仅主机模式访问外网

原文转载至&#xff1a;https://blog.csdn.net/eussi/article/details/79054622 保证VMware Network Adapter VMnet1是启用状态 将可以连接外网的连接共享属性设置成如下图所示 将VMware Network Adapter VMnet1的IP地址设置成与本机IP不同的网段即可 VMware虚拟网络编辑器VMne…

Spark学习之RDD的概念

RDD又叫弹性分布式数据集&#xff0c;是Spark数据的基础单元&#xff0c;Spark编程是围绕着在RDD上创建和执行操作来进行的。它们是跨集群进行分区的不可变集合&#xff08;immutable collection&#xff09;&#xff0c;如果某个分区丢失&#xff0c;这些分区可以重建&#xf…

我的ELK搭建笔记(阿里云上部署)

文章转载&#xff1a;http://www.jianshu.com/p/797073c1913f 仅用作个人学习&#xff0c;收藏 我的 ELK 搭建笔记&#xff08;基于阿里云&#xff09; “不是最好的&#xff0c;但一定是有良心的操作记录。”目录一览 0 重不重要都得有的开头 1 安装配置 1.1 CentOS 7…

HBase regions分布不均匀的解决

1、先确定master页面是否还有region in transition,如果有并且长时间未变化&#xff0c;可以考虑重启master&#xff0c;重新触发容灾。 2、region都加载后进入hbase shell balance_swith ture 开启balancer balancer 手动触发balance 即可。

莫队分块

今天兔哥讲了一波莫队&#xff0c;比较有趣&#xff0c;先加一个链接,这是她的教程 rabbithu.cnblogs.com 这里就不详细说了&#xff0c;其实就是两个指针来优化的暴力。一开始排序函数有问题&#xff0c;没用上莫队的核心思想&#xff1a;把查询区间先排序&#xff0c;第一关键…