【Unity】UI的MVP框架理解,浅谈框架

2023-11-17

【Unity】UI的MVP框架理解,浅谈框架

引入框架

什么是框架?
很多课程都会提到所谓的框架。进入实习前,总觉得那是很大的,可能需要有某些组件或者其他不一样的东西来作为基础进行搭建的环境。
实际接触过后,其实所谓框架,主要是作为一种开发规范存在的,它的实现并不一定要依赖于什么。

为什么存在框架?
在实际的大型项目进行开发时,通常有几十号人共同对项目动手动脚。尤其是到了修复bug的日子里,一天可能提交上百条修改记录,日常也会有几十条,这都是很正常的。而很明显,大家的习惯不同,语言经历不同,对于代码的思考方式也不同,自然会写成千奇百怪的样子。这样的系统往往是弱读的。对于在项目中的人来讲,甚至有的时候会无法辨认自己的代码,因为别人通过奇怪的方式引入或者剔除了什么东西。更不用说没有那么多人会写注释,对吧。

这个时候一个框架的重要性就会体现出来。它会把代码按照一定的功能进行划分,这样一来,某些复杂结构就会按照固定的方式组织,而终端无论如何也仅仅是实现某些特定功能,整个项目的可读性会有质的提升。

接下来是例子
我们都知道unity存在委托,事件,action等组成的观察者模式。然而每个人的习惯不同,有人会在特定的地方组织事件,而有的人会想到一出是一出。然后不同的功能阶段会对不同的事件或代码进行复用,项目会逐渐打成死结,最后一定会出现所谓的屎山代码。
好,我们现在进行规定,每一个大的功能会有多个组成部分,而其中如果需要用到事件,则为其新建一个固定事件脚本。最后虽然会出现数量庞大的脚本量,但可读性上升了很多。
如果我们为每个大功能下进行不同功能分类,将事件与部分有相同特点的代码整合起来,就会将脚本的数量减少,同时我们规定一定结构,而每个脚本按照固定功能与结构划分,代码会有极强可读性的同时,将脚本数量降低。

简单谈谈MVP框架

框架结构

所谓MVP框架,是Model-View-Presenter。
即模型-视图-逻辑层(并不标准的叫法)。
1.Model层
这一层主要负责数据,比如外部二进制文件,json文件,文本文件等。其中根据项目的具体需求,可以划分为Defination以固定格式与数据连接,Model层作为数据模型,然后可以为其创建一个数据类用于初始化模型。
2.View层
这一层自然是负责视图部分,MVP框架主要是UI框架,所以这部分主要是UI,包括图片,文本,以及其他页面的部分。根据需求,往往会划分为Page外部调用的初始化UI,Window作为单个页面存在,Param多个连续窗口。
3.Presenter层
这一层说简单也简单,说复杂也复杂。简单在于一般只存在Presenter,而复杂在于,这一层将处理所有的逻辑。比如来讲,View层的Button事件注册需要连续调用,直到Presenter层进行事件逻辑实现及注册。
4.其他可能用到的
我知道的是仓库Regestroy,当数据量较大,或者其他适合建立数据存储时,进行初始化一个仓库,有利于数据存取。

框架流程

一般而言,通过外部调用打开Page,Page中主要存在一个对应功能的Presenter。Presenter负责进行目标功能的窗口初始化,包括生成目标预制体,根据数据生成对应模型,如果有需要,存入仓库。然后对不同组件进行事件的注册(如果有的话)。创建dispose方法,并在其中调用所属组件的dispose方法。制作UpdateView方法,以实现组件复用而无需重复生成。在UpdateView方法中调用每个子窗口的UpdateView。
当View层的组件被触发,例如button或者Scroll等事件,将会传递到Presenter层,Prensenter层将对该次事件进行逻辑处理,如果需要用到数据,则会从仓库或者已持有的数据列表进行获取。如果此次事件将会打开新的页面,则会调用生成新页面的Page,该Page将会生成下一个Presenter,然后将当前Page作为上一个Page。(这里的Page有点像链表,总会打开最后一个,如果Page执行的是关闭,则会打开上一个Page,这个过程是不同功能间的切换,如果是同属一个大功能子功能,那要考虑好是以Page形式,还是以Param方式实现)

最后的碎碎念

这个MVP框架其实并不是特别完整,因为有的时候需要多层的处理,一层的Prensenter有的时候确实显得力不从心。不过在绝大部分时,这个结构时很好的处理方式。还有就是View层,其实理论上是要将所有逻辑归到Prensenter层,但有的时候可能有人会偷懒,说一点点的小功能还是没必要这样大动干戈,也有这样的情况,但最好还是将功能还到Presenter层,虽然会复杂点,但是各司其职的结构更加整洁吧。

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

【Unity】UI的MVP框架理解,浅谈框架 的相关文章

  • 如何使用带有进度条的 HttpClient 下载文件?

    我创建了一个名为SiteDownload并添加了一些下载图像的链接 using System Collections Generic using System Linq using System Net using System Threa
  • 有没有办法将所有内容都包含在 dbcontext 中?

    当查询一个DbContext急切加载时 需要Include Navigation 为了填充导航属性 然而 在某些情况下 我想简单地Include all实体的导航属性 有没有办法做到这一点 或者有办法做到这一点 我假设你可以反思 但我宁愿避
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • 如何在 C# 中启动文件

    编辑 我觉得自己像个白痴 我有一种感觉 像下面的答案会起作用 但没有看到任何与下面的答案类似的谷歌结果 所以当我看到这段复杂的代码时 我想它一定是这样的 我搜索并找到了这个Windows 列出并启动与扩展关联的应用程序 https stac
  • 如何在C中将2个4位无符号数组合成1个8位数

    我有 2 个 4 位数字 X0X1X2X3 和 Y0Y1Y2Y3 我想将它们组合起来 这样我就可以创建一个像这样的 8 位数字 X0X1X2X3 Y0Y1Y2Y3 gt X0Y0X1Y1X2Y2X3Y3 我知道如何连接它们以创建X0X1X1
  • 如何通过C#在SQLite数据库中写入变量DateTime值?

    我很新C and SQLite数据库并有一些变量存储在 SQLite 数据库中TimeStamp 这是我的代码 DateTime now DateTime Now m dbConnection new SQLiteConnection Da
  • 有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录?

    有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录 我们正在使用我们自己的抽象 我不希望在使用 Serilog 时来自 Hangfire 记录器的所有额外噪音 INIT call under web project na
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • C++ 为非虚方法指定初始化

    我有 a h 如下所示 class A public void doSomething 0 然后我有 b h 如下所示 include a h class b public A public void doSomething 我只是想通过尝
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • C++20 views::join 在生成的嵌套范围::single_view 上进入无限循环

    我正在使用 GCC 实现 v10 2 和 v11 来处理 C 20 范围 测试的行为std views join https en cppreference com w cpp ranges join view 我尝试使用生成嵌套视图sin
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • 具有两个表的谓词构建器

    A Party可以有一个或多个Contact对象 我想选择全部Parties谁的街道名称包含特定关键字 如果我只想搜索Party我可以使用下面的代码 但我如何扩展它来搜索Contact public IQueryable
  • InvalidOperationException:没有为方案“CookieSettings”注册身份验证处理程序

    我正在使用 ASP Net MVC core 2 1 开发一个应用程序 其中不断出现以下异常 InvalidOperationException 没有为方案 CookieSettings 注册身份验证处理程序 注册的方案有 Identity

随机推荐

  • uart协议_UART协议帧格式

    参考文章 地址1 地址2 地址3
  • 安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制&文件管理模块&包含&上传&遍历&写入&删除&下载&安全

    文章目录 文件管理模块 上传 过滤机制 文件管理模块 显示 过滤机制 PHP文件操作安全 文件包含 文件上传 文件删除 文件下载 文件编辑 文件管理模块 上传 过滤机制 FILES PHP中一个预定义的超全局变量 用于在上传文件时从客户端接
  • JS逆向之基础定位技巧

    篇幅有限 完整内容及源码关注公众号 ReverseCode 发送 冲 当我们拿到一个网站时 首先就是抓包定位加密参数的实现 本文将通过常用的定位方案结合实际案例完成对加密参数的分析 搜索关键参数 这是最常见也是最简单的定位方案 F12打开网
  • 详解在vue项目当中绑定键盘事件

    在vue项目当中 有时会遇到为文本输入框或者button按钮绑定键盘事件 最常见的就是enter回车事件 按照vue官网给出的方法是 v on keyup enter 简写 keyup enter 如果是绑定在组件上的话 需要加native
  • Spring Boot + Vue的网上商城之订单商品评价实现

    Spring Boot Vue的网上商城之订单商品评价实现 在网上商城中 用户下单购买商品后 通常会有一个订单评价的功能 用户可以对购买的商品进行评价和打分 本篇博客将介绍如何使用Spring Boot和Vue js实现订单商品评价功能 包
  • hp打印机怎么连接电脑_小白使用手册

    工作中 总是离不开文印 文印难题也是在所难免 而对于文印小白来说 只有在打印机一切正常的情况下才能顺利使用打印机 当打印机出现一点 异常 时 就变得不知所措 比如 电脑如何通过无线网络设置打印机 手机如何连接打印机等 问题 遇到这些问题不用
  • 华为od机考真题-跳跃比赛

    def dfs nums i 0 if len nums lt i 1 return 0 return min dfs nums i j 1
  • 视频瞳孔跟踪之星团模型

    视频瞳孔跟踪之星团模型 http www cnblogs com ren19930504 p 4319156 html 视频瞳孔跟踪之星团模型 1 预处理 1 1去除图像噪声 使用5 5的高斯平滑处理散粒噪声 使用 模型处理线路噪声 是第
  • 【华为OD机试真题2023B卷 JAVA&JS】分积木

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 分积木 知识点位运算线性表 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 Solo和koko是两兄弟 妈妈给了他们一大堆积木 每块积木上都有自己的重量 现在他们想要将这
  • 003:打印ASCII码

    003 打印ASCII码 描述 输入一个除空格以外的可见字符 保证在函数scanf中可使用格式说明符 c读入 输出其ASCII码 输入 一个除空格以外的可见字符 输出 一个十进制整数 即该字符的ASCII码 样例输入 A 样例输出 65 这
  • 毕设教学 多分类与数据预测分析算法 - python

    文章目录 0 前言 机器学习 基于逻辑回归 LightGBM XGBoost额的分类预测 一 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1 1 逻辑回归的介绍 1 2逻辑回归的应用 2 Demo实践 Step1 库函数导入 Step
  • 加快edge网页的下载速度

    1 edge flags enable parallel downloading 2 点击enabled
  • tomcat8.5之后版本,远程无法登录管理页面

    1 修改 webapps magager META INF context xml文件 注意是webapp下manager发布包里的 不是conf下的context xml 隐藏其中的内容
  • python参数之间用什么分割_如何根据python的两个参数在美丽的汤中分割

    我使用beutifulsoup来提取文档中图像的地址 但是文档中的链接需要清理 特别是大多数图像都有类似的链接 image jpg amp 随机文本和我想要的信息https www webaddress com image jpg file
  • SpringIOC

    一 Sping理解 Spring 是个java企业级应用的开源开发框架 Spring主要用来开发Java应用 但是有些扩展是针对构建J2EE平台的web应用 Spring 框架目标是简化Java企业级应用开发 并通过POJO为基础的编程模型
  • hmcl启动器怎么联机_HMCL 启动器教程 #1 安装启动器

    HMCL 和其他第三方 Minecraft 启动器的安装流程比别的软件都难多了 它们不提供核善的安装程序 所以格外麻 quan 烦 tui 下面是 HMCL 详细安装教程 安装 Java 运行时环境 JRE 注意选择正确的版本 创建一个空的
  • Java架构直通车——RabbitMQ集群架构模式

    文章目录 RabbitMQ四种架构模式 主备模式 远程模式 镜像模式 多活模式 RabbitMQ四种架构模式 主备模式 主备模式也被称为warren 兔子窝 一个主 备方案 主节点挂掉后 从节点提供服务 和ActiveMQ利用Zookeep
  • Ubuntu使用Disks图形化工具挂载新磁盘

    步骤一 Disks工具 搜索Ubuntu系统自带的Disks软件 步骤二 格式化 打开图形界面 点击齿轮按钮 格式化磁盘 给磁盘取名 比如 satadisk 点击next 下一步按钮 点击Format 开始格式化 步骤三 挂载 挂载磁盘 我
  • 这些选品神器,跨境卖家都在用

    相信许多跨境电商商家至今不懂得如何选品 不会选 选什么类目 在哪选 今天给大家整理一波实用选品工具 赶紧来码住 1 TikTok 在国外流行着这么一句话 TikTok mademe buyit TikTok有超过 20亿的流量 有各种红人博
  • 【Unity】UI的MVP框架理解,浅谈框架

    Unity UI的MVP框架理解 浅谈框架 引入框架 简单谈谈MVP框架 框架结构 框架流程 最后的碎碎念 引入框架 什么是框架 很多课程都会提到所谓的框架 进入实习前 总觉得那是很大的 可能需要有某些组件或者其他不一样的东西来作为基础进行