聊一下移动开发时MVC中的控制器

控制器,是MVC中的一环,也是手机软件开发中最需要注意的地方,对它的认识不清晰会导致业务层代码的结构混乱,耦合性高。经常见一些进行了几年的老项目代码,如果不是经常的迭代重构,维护起来会非常痛苦。今天重点说一下怎么化解这个问题。

其实,每个平台都对Controller有很清晰的描述和定义,只不过我们在使用中容易自己乱了阵脚,而最终导致自己难受罢了。像Android中的Activity、Fragment,IOS中的ViewController,都定义了明确的生命周期自管理方法,供开发者使用。我们只需要把这些生命周期方法当入口,驱动自己的代码就好了。在使用过程中下面几个注意事项多多注意,你的代码会很纯洁的。

1、Controller绝对不要对外暴露方法,不要让其它C可以通过函数调用的方式操作自己。

这个是严重破坏Controller生命周期自管理的行为,必须禁止。对一个C来说,接受外部C的启动参数并启动,加入到系统的C管理器之后,就不能接受任何其它C的驱动了。如果确实需要通信,请使用消息。

2、消息通信。

这个应该必须被当作是C之间进行通信的唯一手段,因为只有它是不干涉C的运行的,由目标C自己决定是否接收消息,接收了消息之后如何处理。一个Ca启动另一个Cb,或者在Cb运行期间,Ca向Cb发送消息。Activity、Fragment中的Intent,ViewController中的Notification,这些都是多少天然的组合。

3、当Controller之间有共性的时候,我们肿么办?

这其实是个Has-a,还是Is-a的问题。我用近10年的编码经验告诉大家,一定要选择Has-a,这个基于几点,一个是业务多变化,今天的共性明天可能就不存在了,今天有3个,明天就可能变成2个,选择Is-a这种强关联,会很痛苦的。另外,业务层的开发往往是几个人几杆枪,任务分开各干各的,Has-a是最合适的,把关键的公共小模块做好,其它的自由发挥去吧。不要把眼睛紧盯在那几行重复的代码上面。

4、页面太多,Controller之间跳转混乱,怎么破?

这个其实是表象。首先,我们做好上面3点之后,C之间的耦合性问题已经不存在,接下来我们再规范一下C之间进行跳转时的传参规则,参数由目标C来定义自己需要接收的数据格式。想跳到哪个页面时,找到它的源码,看下它定义的参数规则,按它的要求传过去,然后把生成的新C交给系统的C管理器就好了。在Android中是startActivity,commitFragment,IOS中是presentViewController。

5、关于页面开放。是否使用PageLink?

这个要避免走向极端。如果你的页面需要开放给第三方应用,毫无疑问,PageLink是最好的选择。因为这些页面一般都是核心页面,稳定性高,数量少,参数少,一个URI可以很清晰表达出来。像电端类的宝贝详情,SNS类的个人主页、日志详情等。那对于内部页面之间的跳转呢?这个要慎用。内部页面数量多,参数多变,数据结构复杂多样,随着业务的变化还会不断更新。每次跳转前把数据结构压成URI,通过分发中心传递给目标C之后再反序列化,校验参数合法性。每次参数有变化再调整,你累不累?

好了,今天先聊这么多,各位有什么更好的想法或者不同意见欢迎交流,一起提高。

时间: 2024-08-08 21:54:04

聊一下移动开发时MVC中的控制器的相关文章

ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)

ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构.HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件.在应用程序中的管道设计结构下实际上是由一系列的事件组合在一起的.这些事件可以有HttpModule来订阅,订阅的时机是在应用程序加载配置文件的时候,订阅web.config中httomodules配置的相关事件.而HttpHandler的作用就是最终的真正执行. 激活前准备首先要说的是路由系统一个Web应用程

IntelliJ IDEA15开发时设置中java complier 的问题

Error:java: Compilation failed: internal java compiler error set中java complier 设置的问题  ,项目中有人用jdk1.6  有人用jdk1.7  版本不一样  会一起这个错误 进行如下操作:

MVC中通过控制器将数据库文件绑定到前台页面

控制器代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Data; using System.Configuration; using System.Data.SqlClient; namespace 显示Demo.Controllers { public class HomeController :

spring mvc中的控制器方法中的参数从哪里传进来?

编写控制器方法的时候很奇怪,spring是怎么知道你控制器方法的参数类型,并且注入正确的对象呢? 比如下面这样 @RequestMapping(value="/register", method=GET) public String showRegistrationForm(Model model) { model.addAttribute(new Spitter()); return "registerForm"; } 他怎么知道Model对应啥呢? 其实,spr

MVC中的筛选器

在 ASP.NET MVC 中,控制器将定义一些操作方法,这些操作方法与可能的用户交互(如单击链接或提交窗体)之间通常具有一一对应关系.例如,当用户单击链接时,会将请求路由到指定的控制器,然后调用对应的操作方法. 例如操作完成后你要产生日志.语言筛选.等其他动态操作. 筛选器的由来及用途 有时,您需要在调用操作方法之前或运行操作方法之后执行逻辑. 为了对此提供支持,ASP.NET MVC 提供了筛选器.筛选器是自定义类,可提供用于向控制器操作方法添加操作前行为和操作后行为的声明性和编程性手段.

关于在ASP.NET MVC 中使用EF的Code First的方式来读取数据库时的Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

今天在做一个小网站的时候遇到很多问题唉,我还是个菜鸟,懂的也不多,今天一个表单的提交按钮用不了,都弄了几个小时唉.不过最后还是搞定了,还有浏览器有开发人员选项,不然我都不知道我还要继续排查多久哦,今天晚上在把数据存入数据库的又出现了问题.我使用的是Entity Framework的Code First模式来访问数据库的.对于数据的验证我在数据模型上加了数据注解.当然在前台也引入了一些JS这样就可以再不把数据提交到服务器时完成验证功能.在后台保存用户提交的数据的时候,我们要用到ModelStatu

Unity3d中UI开发的MVC模式

原文:http://engineering.socialpoint.es/MVC-pattern-unity3d-ui.html 动机 和游戏开发的其他模块类似,UI一般需要通过多次迭代开发,直到用户体验近似OK.另外至关重要的是, 我们想尽快加速迭代的过程.使用MVC模式来进行设计,已经被业界证明了是可以解耦屏幕上的显示,如何控制用户的输入对显示的改变,以及如何根据应用的状态进行改变.MVC模式提供了以下好处: (1) 可以修改UI的外观,而不用修改一行代码 (2) 在不同的组件里面可以共享同

JAVAEE企业级应用开发浅谈之MVC 中的V-VIEW视图

Step1.情景概要 Hello,小伙伴们,好久不见,之前跟大家分享了三层架构与MVC思想,相信大家对于这两块内容有了相对清晰的个人认识了,既然我们讲到了MVC,这里我们接着这块内容继续往下深入,今天我们来看看MVC 中的V-VIEW 即我们所说的视图层. Step2.视图技术 对于我们WEB开发人员来说,视图的概念应该都不会很陌生了,我们在浏览网页时见到的各种形式的页面内容,背后都离不开我们所用的视图技术,对于JAVA Web 开发人员来讲,页面展示实际上就是模板+数据=页面内容,所有的web

ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器

ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!!  2.关于任务跟踪管理系统项目中遇到的Windows服务以及Webservice的综合应用的问题. 大家好这是我第二次写博客 ,写的不好请大家多多谅解, 希望大家可以多多指正. 二:我稍微的整理了一下关于这个分布式定时器需求:1.根据任务跟踪管理系统中的数据库的AnswerSheet 表格中找到客户编