title author date CreateTime categories
win10 uwp MVVM 语义耦合
lindexi
2018-08-10 19:16:53 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

最近在我写的框架,小伙伴告诉我,可能有语义耦合,那么本文就来告诉大家,为什么会出现语言耦合

之前我写了一个轻量的框架,参见win10 uwp MVVM 轻量框架。在使用的过程,发现了这个框架可以让开发者写出语义耦合的代码。

在开始讲框架之前,先让我告诉大家,什么是语义耦合。

例如有一个框架,在框架的代码都没有任何的耦合,如 View 的界面和 ViewModel 是分开在两个工程,而且只有 View 引用 ViewModel ,这样从静态的代码分析可以说,ViewModel 没有耦合 View 。但这是不是真的就没有耦合?实际上可能还是有语义的耦合。

在小伙伴使用框架,但是对 MVVM 的理解不是很深的时候,就容易写出下面的代码

ViewModel:

发送 刷新 列表消息

View 

处理 刷新列表消息

这时,因为 ViewModel 写出了刷新列表的消息,所以刷新列表这个界面相关的消息就耦合了界面。也就是在 ViewModel 是处理了部分的界面的逻辑。

在很多的代码,包括继龙大神的、于大神的代码,发现了在 ViewModel 使用了 Visibility 的属性,需要知道 Visibility 是界面的属性,如果界面绑定了 Visibility 那么 ViewModel 就需要对 Visibility 处理。这时的界面是需要写 ViewModel 的开发者知道的。这时界面修改的话,例如原来在条件下需要 Visibility 隐藏的代码就需要修改为不隐藏。这时修改界面就需要修改 ViewModel 。

如果在 ViewModel 耦合了界面的控制,那么为什么需要 ViewModel ? 实际上的 ViewModel 是抽象页面,所以不能对 ViewModel 添加对界面控制的代码。在太子的博客语义耦合已经有说到关于 Message 耦合的问题。同样也给出一些解决方法。

下面我来告诉大家一些比较好的处理方法。

在几乎所有主流的 MVVM 框架,都提供了 Message 给 ViewModel 和 View 通信。而且在我的框架用了 Message,所以对 Message 是比较难写的一点。如果限制很多,那么很多开发者就不会使用,解决这个框架不好用。如果给的功能太多,那么容易出现语义耦合,而且使用这个功能做框架设计没有提供的功能。

需要和大家分享一个故事,为什么 微软 把Action 的参数提供了 16 个?因为他需要考虑全世界所有的开发者。但是一般的开发者建议使用的参数只有两个,但是在一个足够通用的框架,是需要做到对少数的开发者也可以使用。所以不要认为只要框架提供了,就可以使用。一个好的开发者会去阅读框架的文档,然后使用框架开发者希望使用的方式开发。但是一个好的框架是开发者不需要去读文档,看到了框架就会使用。这是矛盾的,但是和框架开发者的能力有关。微软框架大部分都是很好的,但是也有一些代码写的很差。最近我在写高性能笔的时候就发现了他的代码的问题,已经帮他修复了,但是现在微软几乎不做 .net Framework 了,把他的很多代码都放在 .net core ,然后就经常看到有大神修改了算法,提高了性能。

回到问题,如何在开发中解决 MVVM 的语言耦合,实际上这不是一个技术问题。建议的方法是让开发者的代码经过审查,现在在开发的时候,所有的代码都需要提MR,在来源的开发中,也是需要提MR,这样就可以容易发现在代码中存在的语义耦合。现在通过工具是难以发现的。

如果发现了存在语义耦合,那么如何解决?

这个需要分析一下,一般做法是让具体的命名写为抽象。如上面的代码,从ViewModel 告诉 View 刷新列表,为什么需要 ViewModel 知道 View 需要刷新列表,他可以使用一个抽象的命名,例如告诉 View 现在更新了数据。于是 View 根据ViewModel 的消息进行刷新列表,这样就不会出现 ViewModel 的语言耦合。

但是很多的代码都可以使用状态来获得刷新和修改,所以这时就不需要使用消息。

另一个建议是最好不要在 ViewModel 定义界面的控制的方法,例如 Visibility ,不可以让ViewModel 去控制 View 。在微软提出的就说到,ViewModel 是驱动数据,所以 ViewModel 只是转发数据,这样才可以减少耦合。

一个项目使用了框架会比不使用框架的可维护要好很多,即使使用的时候存在一些问题,但是也比不使用好。

参见:语义耦合(Semantic Coupling) - walterlv

2018-8-10-win10-uwp-MVVM-语义耦合的更多相关文章

  1. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  2. win10 uwp MVVM入门

    MVVM 是一个强大的架构,基本从 WPF 开始,wr(我说的就是微软)就提倡使用 MVVM.它可以将界面和后台分离,让开发人员可以不关心界面是怎样,全心投入到后台代码编写中. 然后在编写完后台代码后 ...

  3. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  4. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  5. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  6. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  7. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  8. Win10 UWP应用发布流程

    简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变. 这篇博文记录了我们发布一款Win10 UWP应用的基本流程,希望为 ...

  9. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  10. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

随机推荐

  1. Function相关的小知识

      重载 相同函数名,不同参数列表的多个函数,在调用时可自动根据传入参数的不同,选择对应的函数执行.为什么使用重载:                   减轻API的名字,减轻调用者的负担.何时使用重 ...

  2. 大数据技术之HBase

    第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...

  3. MAC+VS Code+C/C++调试配置

    目录 VS Code C/C++ 环境配置 添加工作区文件夹 Say Hello world 关于三个配置文件--Debug 原地址 VS Code C/C++ 环境配置 添加工作区文件夹 虽然代码能 ...

  4. 【数论】不定方程&逆元&中国剩余定理

    一.不定方程 要求逆元,首先要知道什么是不定方程. 已知a,b,c,求解x,y,形如ax + by = c 的方程就是不定方程. 不定方程有两种解的情况: 1.无解 2.存在且有无限的解 那么,如何判 ...

  5. @bzoj - 4951@ [Wf2017]Money for Nothing

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在这道题种你需要解决一个全世界人类从存在起就在面临的最深刻的问题 ...

  6. hackerrank---List Comprehensions

    题目链接 刷刷Python基本功...列表解析 附上代码: x = int(input()) y = int(input()) z = int(input()) n = int(input()) pr ...

  7. day18 jQuery,JavaScript高级&Django

    回顾: 整体: - HTML - CSS - JavaScript:基本数据类型:流程控制语句 - DOM - BOM:setInterval() - jQuery - 选择器 - 筛选器 - 内容和 ...

  8. Java练习 SDUT-4303_简单的复数运算(类和对象)

    简单的复数运算(类和对象) Time Limit: 2000 ms Memory Limit: 65536 KiB Problem Description 设计一个类Complex,用于封装对复数的下 ...

  9. vue插件大全

    一.UI组件及框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI ...

  10. HDU-6290_奢侈的旅行(Dijstra+堆优化)

    奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...