MVVM(微软的WPF基础)-MVC(常用模型/设计)-WPF(微软.NETFramework3.0

2023-05-16

为什么80%的码农都做不了架构师?>>>   hot3.png

最近看 好多人说IOS MVC 过时了 要用MVVM 什么什么的,感觉 很新奇,就去搜了一下,发现原来所谓的MVVM就是 之前微软在10年左右就推出的WPF ,鄙人不才,搞过两年多的C#开发,因此 做了下比较:

首先来看一下 WPF

WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

那么 模式MVVM就是:

130546_rLs4_2429434.png

再来看下经典的MVC:

130547_XEJP_2429434.png

其实这就是 把VIEW层 再次分一下 分成view和view controller层 这让我想起了 之前的三层架构和MVC

三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式。首先你要明白MVC分别代表的是什么意思.
M 即Model(模型层),主要负责出来业务逻辑以及数据库的交互
V 即View(视图层),主要用于显示数据和提交数据
C 即Controller(控制器),主要是用作捕获请求并控制请求转发

三层:UI 界面层 BLL 业务逻辑层,DAL数据访问层,Model 实体层
MVC中的的M 不是三层中的Model(实体层),他其实包括三层中的 BLL,DAL,Model,这是非常要注意的,这也是他们之间的区别的关键所在

其有点有如下:
低耦合性
高重用性和可适用性
较低的生命周期成本
快速的部署
可维护性
有利于软件工程化管理

当然优点也有缺点,那就是内部结构复杂,不容易理解,文件数量大,管理难度自然也就大

其实 本来是没有区别的 或者说 是相互关联的 具体就是131105_SU50_2429434.png

可以看出,三层架构就是把不同的层次打乱 然后拆分出新的层次,这就是区别,额,感觉 现在的模式都是这样 ,可能对易老程序员来说,原来的用的顺手了,但是 对于初学者,这些感念简直就是噩梦,MVC是一种万金油一样的存在,你说他是设计模式也好,框架也好,总之我认为 好用就行,所有的这些拆分或者重新组装都是为了更好地分离视图和逻辑代码以及数据库交互,只要你的逻辑清晰,分清楚之间的关系,我觉得很容易理解,当然这也有牵扯到内聚耦合什么的,但这不是我们讨论的重点。

关于三层架构有一个很经典的例子用于区分各个层次之间的关系,很好理解,和诸位分享一下:

一个客户 也就是用户  走进了一家餐馆 点餐  叫服务员点菜 然后服务员去把单子给厨师  炒完菜 服务员将菜端给你 这儿过程中产生数据  也就是制造菜的是厨师  类似于数据层 他只负责炒菜  他不知道客户是谁  只通过服务员 来告诉他
服务员沟通客户和厨师 业务逻辑层  客户可能有多个需求  厨师也可能同时炒多个菜  由业务逻辑层也就是服务员负责调度 安排   装菜的盘子  也就是 显示层  他决定了 如何呈现菜  是大盘 还是小盘 不同样式 服务员点菜的单子  使我们所说的实体层  它类似于一个模子 一个传输数据 需求 的模板

MVC缺点有哪些呢?我们来看看那些大神的吐槽的MVC四大“缺点”:

1、厚重的View Controller

由于大量的代码被放进view controller,导致他们变的相当臃肿。在iOS中有的view controller里绵延成千上万行代码的事并不是前所未见的。这些超重app的突出情况包括:厚重的View Controller很难维护(由于其庞大的规模);包含几十个属性,使他们的状态难以管理;遵循许多协议(protocol),导致协议的响应代码和 controller的逻辑代码混淆在一起。厚重的view controller很难测试,不管是手动测试或是使用单元测试,因为有太多可能的状态。将代码分解成更小的多个模块通常是件好事。

2、遗失的网络逻辑

苹果使用的MVC的定义是这么说的:所有的对象都可以被归类为一个model,一个view,或是一个controller。就这些。那么把网络代码放哪里?和一个API通信的代码应该放在哪儿?

你可能试着把它放在model对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的model生命周期更长,事情将 变的复杂。显然也不应该把网络代码放在view里,因此只剩下controller了。这同样是个坏主意,因为这加剧了厚重View Controller的问题。那么应该放在那里呢?显然MVC的3大组件根本没有适合放这些代码的地方。

3、较差的可测试性

MVC的另一个大问题是,它不鼓励开发人员编写单元测试。由于view controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。大多数人选择忽略这个任务,那就是不做任何测试。

4、定义模糊的“Manage”

之前我提到了view controller可以管理试图的层次结构;view controller有一个“view”属性,并且可以通过IBOutlet访问视图的任何子视图。当有很多outlet时这样做不易于扩展,在某种意义 上,最好不要使用子视图控制器(child view controller)来帮助管理子视图(subview)。

要点在哪?验证用户输入的业务逻辑应归入controller还是model呢?

在这里有多个模糊的标准,似乎没有人能完全达成一致。貌似无论如何,view和对应的controller都紧紧的耦合在一起,总之,还是会把它们当成一个组件来对待。

总结一下MVVM

在MVVM里,view和view controller正式联系在一起,我们把它们视为一个组件。视图view仍然不能直接引用模型model,当然controller也不能。相反,他们引用视图模型view model。

view model是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。有一件事情不应归入view model,那就是任何视图本身的引用。view model的概念同时适用于于iOS和OS X。(换句话说,不要在view model中使用 #import UIKit.h)

由于展示逻辑(presentation logic)放在了view model中(比如model的值映射到一个格式化的字符串),视图控制器本身就会不再臃肿。当你开始使用MVVM的最好方式是,可以先将一小部分逻辑放 入视图模型,然后当你逐渐习惯于使用这个范式的时候再迁移更多的逻辑到视图模型中。

使用MVVM的iOS app是高度可测试的;因为view model包含了所有的展示逻辑并且不会引用view,所以它可以通过编程方式充分测试。虽然有众多的hack技术参与到测试Core Data模型,但使用MVVM写的app可以进行充分的单元测试。

以我的经验,使用MVVM会轻微的增加代码量,但总体上减少了代码的复杂性。这是一个划算的交易。

再看一下MVVM那张图:175409_Vtb1_2429434.png

回过头再来看MVVM的图示,你会注意到我使用了模糊的动词“notify”和“update”,而没有详细说明该怎么做。你可以使用KVO,就像MVC那样,但这很快就会变得难以管理。事实上,使用ReactiveCocoa会是更好的方式来组织各个部分。

用现在流行的那个词说就是 用人话讲MVVM就是:

Model层是少不了的了,我们得有东西充当DTO(数据传输对象),当然,用字典也是可以的,编程么,要灵活一些。Model层是比较薄的一层,如果学过Java的小伙伴的话,对JavaBean(陌生的自觉参考上边的图片)应该不陌生吧。

ViewModel层,就是View和Model层的粘合剂,他是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。说白了,就是把原来ViewController层的业务逻辑和页面逻辑等剥离出来放到ViewModel层。

View层,就是ViewController层,他的任务就是从ViewModel层获取数据,然后显示。


最后

放几张 我从网上找的别人设计的MVVM的 框架 目前我也正在研究 具体是MVC好还是MVVM好 仁者见仁智者见智,,,

132146_XppW_2429434.png

132148_egCI_2429434.png

132149_WQVP_2429434.png

132150_77Wq_2429434.png













转载于:https://my.oschina.net/rainwz/blog/493460

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM(微软的WPF基础)-MVC(常用模型/设计)-WPF(微软.NETFramework3.0 的相关文章

  • 用delphi比较两张图片的相似度

    procedure TFrm test initList var idx i k x y l integer p fn string bmp TBitmap BColor NowColor TColor begin p 61 Extract
  • Visual Studio Code 使用Git进行版本控制

    Visual Studio Code 使用Git进行版本控制 本来认为此类教程 xff0c 肯定是满网飞了 今天首次使用VS Code的Git功能 xff0c 翻遍了 所有中文教程 xff0c 竟没有一个靠谱的 遂动笔写一篇 请确保你安装了
  • OLDX-FC开源飞控

    1 OLDX 开源多旋翼开发平台项目 OLDX多旋翼开发平台 xff08 OLDX FC xff09 是由北京理工大学自动化学院所属 北理云逸科技 团队开发的一个目前国内最完整的免费开源飞控项目 xff0c 随着国内开源飞控的逐步发展如匿名
  • 2017.04.21 麦克纳姆轮简介

    这个是德国库卡KMP omniMove移动负载平台上使用的轮子 xff0c 这个轮子的名字叫麦克纳姆轮 麦克纳姆轮是基于一个有许多位于机轮周边的轮轴的中心轮的原理上 xff0c 这些成角度的周边轮轴把一部分的机轮转向力转化到一个机轮法向力上
  • xyz三维坐标系怎么画?

    坐标系统是描述物质存在的空间位置 xff08 坐标 xff09 的参照系 xff0c 通过定义特定基准及其参数形式来实现 通过课本上的介绍 xff0c 我们知道坐标系分为平面坐标系和三维坐标系 xff0c 平面坐标系是很好画的 xff0c
  • caffe添加python数据层

    caffe添加python数据层 xff08 ImageData xff09 在caffe中添加自定义层时 xff0c 必须要实现这四个函数 xff0c 在C 43 43 中是 xff08 LayerSetUp xff0c Reshape
  • 【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?

    开头导语由Chatgpt完成 当今互联网行业中 xff0c Java后端开发岗位的竞争异常激烈 xff0c 对于面试者来说 xff0c 掌握一些技巧和知识点将有助于脱颖而出 而对于SpringBoot框架的使用和运行机制 xff0c 更是J
  • node 爬虫,使用 Google puppeteer 抓取 One一个 的网页数据

    puppeteer 就不多介绍了 xff0c 就是一个无界面化的谷歌浏览器 作者本人是前端 xff0c 后端方面的知识不太擅长 xff0c 感觉漏洞还是蛮多的 本教程是作者见猎心喜然后把玩了一下写的 xff0c 有不合理的地方还请包涵 爬虫
  • 微信指纹支付原理浅析

    微信指纹支付从设备出厂到完成支付大致可以分成4个步骤 3对公私钥 xff1a 1 设备出厂公私钥及tee适配 手机厂商在手机tee的RPMB区域内置私钥A priv及微信支付的特定ta和SoterKeyStore xff0c 然后厂商统一将
  • 三极管打造树莓派温控风扇

    为了防止树莓派长时间开机运转温度过高导致触发过热关机 xff0c 很多人都给装了散热风扇 xff0c 但某宝买的风扇插上之后是随着开机一直运转的 xff0c 不能随温度变化而自动开闭 xff0c 很多时候做无用功浪费电且产生噪音 本文将以一
  • PostgreSQL 辟谣存在任意代码执行漏洞:消息不实

    开发四年只会写业务代码 xff0c 分布式高并发都不会还做程序员 xff1f gt gt gt 近期在互联网媒体上流传 PostgreSQL 存在任意代码执行的漏洞 xff1a 拥有 pg read server files 权限的攻击者可
  • vue slot撸一撸

    为什么80 的码农都做不了架构师 xff1f gt gt gt vue使用过程中接触到slot xff0c 一番操作下有以下记录 xff1a 单个 xff1a 父组件引用子组件的时候 xff0c 写在子组件中的内容插入到了子组件中的slot
  • Nmap扫描结果的保存和输出

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 选项解释 oN标准保存 oXXML保存 oGGrep保存 oA保存到所有格式 append output补充保存文件 选项 oG 将结果Grep保存 nmap F oG t
  • SQL岗位30个面试题,SQL面试问题及答案

    SQL岗位30个面试题 xff0c SQL面试问题及答案 xff1a 什么是SQL xff1f SQL xff08 结构化查询语言 xff09 是一种设计用于检索和操作数据的数据库 它属于美国国家标准协会 xff08 ANSI xff09
  • nginx搭建点播视频(Mp4播放)

    首先 xff0c 环境中必然要有gcc c 43 43 环境 yum y install gcc c 43 43 1 使用openresty 这里使用的是1 11 2 1版本的openresty和1 0 2版本的openssl root 6
  • ajax提交 的编码小结

    今天用ajax的post方法提交数据给webservice 由于有email的缘故发现 注册方法调用总是报错 打开报文一看提交的 发现 64 符号被变成了 40 abc 64 126 com 即abc 40126 com 开始我还以为他没有
  • [JavaScript]Cookie详解(转)

    cookie概述 假如利用一个不变的框架来存储购物栏数据 xff0c 而商品显示页面是不断变化的 xff0c 尽管这样能达到一个模拟全局变量的功能 xff0c 但并不严谨 例如在导航框架页面内右击 xff0c 单击快捷菜单中的 刷新 命令
  • 面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?

    x1f484 x1f484 x1f484 今年的铜三铁四到了 xff0c 给大家写几篇面试题解析 文章目录 x1f460 什么是Spring中的循环依赖 xff1f x1f462 Spring怎么解决循环依赖 xff1f x1f455 流程
  • matlab练习程序(矩阵生成有向网络图)

    早知道有向图和无向图差别没有想象中的大我就写到一起了 函数中使用的arrow画箭头函数是在这个网站下的 函数名netplot 使用方法输入请help netplot 无返回值 函数只能处理有向图 作者 xff1a tiandsp 最后修改
  • 字符串处理memchr和memrchr

    memchr extern void memchr const void buf int ch size t count 功能 xff1a 从buf所指内存区域的前count个字节查找字符ch 说明 xff1a 当第一次遇到字符ch时停止查

随机推荐

  • 计算多轴飞行器最大悬停时间

    以结果为导向 xff1a 先看下面截图 为了方便看清楚 xff0c 下面截图承接上面截图的 悬停时间公式 xff1a 电池容量 每个电机总电流之和 61 悬停时间 以上面第一个为例 电池容量为22000maH 每个电机总电流之和是什么意思呢
  • linux应用之make命令详解

    从源代码安装过软件的朋友一定对 configure amp amp make amp amp make install 安装三步曲非常熟悉了 然而究竟这个过程中的每一步幕后都发生了些什么呢 xff1f 今天小编将带你一探究竟 深入理解这个过
  • github 之 下载历史版本

    1 打开github中要下载的项目 2 点击commits 点击上图中标记的地方 xff0c 进入下图所示 xff1a 3 选择列表中的某个版本 4 Browse Files 5 下载 点击上图中的 Download ZIP 下载 转载于
  • Linux环境C程序设计(第2版)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Linux 环境 C 程序设计 xff08 第 2 版 xff09 共分 6 篇 第 1 篇 介绍了 Linux 系统的安装及 LinuxC 开发环境的搭建等 xff1b
  • 如何准备校招技术面试

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如何准备校招技术面试 标签 xff1a 面试 TOC 2017 年互联网校招已近尾声 xff0c 作为一个非 CS 专业的应届生 xff0c 零 ACM 经验 零期刊论文发
  • vscode添加prettier格式化自动加分号问题

    在vscode的settings json中添加 xff1a 34 prettier singleQuote 34 true 34 prettier semi 34 false 不管别人有没有用 xff0c lz没用 切实有效 xff1a
  • 一个蚂蚁前端曾经的辛酸面试历程 | 掘金技术征文

    正好处在秋招 xff0c 我也来分享我自学校到现在的一些面试经历 本文就不分享具体的面试题了 xff0c 主要讲我这几年的面试经历 xff0c 以及我个人觉得可以从中吸取的经验教训 xff0c 希望能给在上大学以及毕业3年以内的同学提供一点
  • Nodejs 使用log4js日志

    一 创建log4 js文件 xff0c 保存日志到log文件 xff0c 并在控制台输出 xff0c 如果不控制台输出 xff0c 把删除红色的代码 const log4js 61 require 39 log4js 39 path 61
  • 【Spring Cloud Alibaba】Nacos config的使用和高阶用法

    文章目录 x1f40d 第一步 xff0c 创建配置文件到nacos中 x1f40d 第二步 xff0c 在项目中配置nacos的地址和指定文件 x1f40d 第三步 xff0c 读取配置文件 x1f426 高阶用法 x1f426 高阶用法
  • WEBPACK + JSP 构建多页应用

    概述 传统的JSP页面应用无法有效的使用ES6语法特性 xff0c 项目打包压缩困难 xff0c 无法热更新 传统的单页应用在Tomcat等容器下无法进行服务端渲染到达SEO的效果 本项目工程很好融合的传统JSP页面服务端渲染的特点和单页应
  • 0-c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网 xff0c 个人学习笔记 加上了mtianyan标签标记知识点 C语言入门 gt Linux C语言编程基本原理与实践 gt Linux C语言指针与内存 gt Linux C语言结构体 mark https www imo
  • c语言编程求两个整数的最大公约数(两种方法)

    第一种 xff08 for循环 xff09 include lt stdio h gt include lt stdlib h gt int main int i min k a b printf 34 请输入两个整数 n 34 scanf
  • 手机内存LPDDR4X、LPDDR4、LPDDR3的区别 ICMAX告诉你

    现在的智能手机基本人手一部了 xff0c 手机与生活的参与度越来越紧密 xff0c 像学习工作 商务娱乐 支付等 xff0c 基本都能在手机端实现 现在我们买手机时也会更加关注这个手机处理器是什么 xff1f 运行速度快不快这类问题 xff
  • kali安装火狐浏览器

    第一步 xff1a apt get remove iceweasel 第二步 xff1a echo e 34 ndeb http downloads sourceforge net project ubuntuzilla mozilla a
  • 【Kubernetes】The connection to the server <master>:6443 was refused - did you specify the right host ...

    不知道怎么用着用着 xff0c 使用kubectl 时报错 xff0c 错误如下 xff1a root 64 R740 2 2 kubectl get pod The connection to the server 107 105 136
  • 自己动手不求人 - 手工Ghost安装xp、win7系统教程

    由于初级阶段的基本国情 xff0c 很多朋友第一次安装系统大多是用的ghost光盘 xff0c 设置好启动项 xff0c 放进光驱 xff0c 重启后选择安装XX到C盘 xff0c 整个系统就完成了 xff0c 方便快捷 在U盘启动越来越流
  • Security Definitions

    PeopleSoft security is designed around three definition types Permission Lists A set of access rights to application obj
  • 【转】成为Java顶尖程序员 ,看这10本书就够了

    学习的最好途径就是看书 xff0c 这是我自己学习并且小有了一定的积累之后的第一体会 个人认为看书有两点好处 xff1a 1 能出版出来的书一定是经过反复的思考 雕琢和审核的 xff0c 因此从专业性的角度来说 xff0c 一本好书的价值远
  • 【设计模式】我终于读懂了访问者模式。。。

    x1f330 测评系统的需求 将观众分为男人和女人 xff0c 对歌手进行测评 xff0c 当看完某个歌手表演后 xff0c 得到他们对该歌手不同的评价 评价 有不同的种类 xff0c 比如 成功 失败 等 传统方案 x1f331 传统方式
  • MVVM(微软的WPF基础)-MVC(常用模型/设计)-WPF(微软.NETFramework3.0

    为什么80 的码农都做不了架构师 xff1f gt gt gt 最近看 好多人说IOS MVC 过时了 要用MVVM 什么什么的 xff0c 感觉 很新奇 xff0c 就去搜了一下 xff0c 发现原来所谓的MVVM就是 之前微软在10年左