阅读更多

3顶
1踩

编程语言

转载新闻 一段 Ruby 代码的思考

2012-07-16 17:29 by 副主编 MnouW 评论(3) 有4507人浏览
在一个Rails项目中,我们遇到了这样一个问题:

这是一个新闻(News)权限的处理。如果是一个新建的新闻,缺省的情况下,管理员和普通用户都是可见的,创建者可以根据需要设置权限;如果是一个已创建的新闻,则权限是创建时设定的。我们要在页面上显示一个form,供人编辑,按照通常的处理方法,页面上应该有所有角色,根据这个新闻当前的权限设置选择框。

从代码上讲,我们可能希望这样判断:

  news.checked_for? role

问题来了,这样的代码写着很漂亮。但是,现实的问题是,这是一段与View相关的逻辑,我们要把它放到Model里吗?如果把这些代码都放到Model里,可想而知,我们就会得到一个非常庞大的Model,事实上,很多项目里就是有这样一个庞大的Model。

对于庞大的东西,第一直觉是拆。感谢Ruby,它给了我们强大的mixin,只要把不同方面的东西写入到不同的module里面,似乎问题就迎刃而解了。

moudle NewsForNewOrEdit
  def checked_for? role
    ...
  end
end

class News ...
  include NewsForNewOrEdit
  ...
end

稍微仔细想一下,似乎还有继续优化的空间。我们的checked_for?其实只在这种情况下才起作用,而按照上面的做法,所有使用News的地方都可以使用这个方法,貌似它的作用域增大了。

一般来说,我们是希望代码的作用域越小越好,这样,才不会牵一发而动全身。

有了想法,便不难产生做法。在Ruby里面,我们可以给对象extend一个module,这样,只有在需要的时候,才这么做,避免了方法作用域的扩大:

@news = News.new.extend(NewsForNewOrEdit)
或是
@news = News.find(param[:id]).extend(NewsForNewOrEdit)

从功能实现和设计的角度,这样的代码是没有什么问题的。从Clean Code的角度看,这样的代码略显啰嗦,表达性有所欠缺,不能很好地反映我们的意图,这对于Ruby代码来说,有些暴殄天物。稍加封装,这段代码就会不一样。下面给出一种实现:

def with_new_or_edit_context
  yield.extend(NewsForNewOrEdit)
end

基于这个实现,上面的代码可以实现成这样:

@news = with_new_or_edit_news_context { News.new }
或是
@news = with_new_or_edit_news_context { News.find(param[:id]) }

当然,这样的代码写多了也是一种负担,所以,我们可以将其进一步泛化,这是后话了。

其实,这种问题已经有人做了很多的探索,从架构设计的层面上进行新的思考,引入一种新的架构模式:DCI(Data、Context and Interation),这里给出的是在Ruby上的初步探索。更多的讨论参见《The DCI Architecture: A New Vision of Object-Oriented Programming》。

本文转载自dreamhead的博客
来自: 梦想风暴
3
1
评论 共 3 条 请登录后发表评论
3 楼 wenke 2012-08-05 11:10
为什么
2 楼 elysion 2012-07-17 09:58
DCI框架就是这种思想,Data Context Role分开,个人很喜欢!
这也是MVC发明者在MVC之后发明的另一个东东~
1 楼 零++ 2012-07-16 20:31
和view有关的根本就不该从Model调用

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JSP_Struts入门教程+例子.ppt.zip

    JSP_Struts入门教程+例子.ppt.zip

  • 一口一口吃掉Struts(一)——用JSP+Servlet演示Struts的基本原理

    struts是开源项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。 MVC即Model-View-Controller的缩写,是一种常用的设计模式(具体自己百度吧) 我们用JSP+Servlet实现“一个应用的增改信息”,先来看一下,如果...

  • Struts1开发步骤

    以创建登入界面为例: 步骤1:在Myeclipse或者eclipse中新建一个web工程; 步骤2:将Struts开发包导入工程中,导入WebRoot-->WEB-INF-->lib文件夹中;(paste) 步骤3:创建login.jsp,放在WebRoot-->WEB-INF目录下,并建立一个 表单,如下: <body> <form act...

  • MVC设计模式

    对于开发人员来说,学习和掌握MVC模式是非常重要的,它可以提高开发效率和质量,使得构建复杂的应用程序变得更加容易。它为应用程序提供了一种结构化的方法,将数据、用户界面和业务逻辑分开,从而使得应用程序更易于维护、扩展和重用。解耦:MVC模式将应用程序的不同部分(数据、用户界面和业务逻辑)分离,降低了它们之间的耦合度。视图(View):视图是应用程序的用户界面。可扩展性:由于MVC模式将应用程序的不同部分分离,因此当应用程序需要扩展时,可以更容易地添加新的功能或模块,而不会对现有的代码造成太大的影响。

  • C++ModelViewController:MVC设计模式详解

    作者:禅与计算机程序设计艺术 C++ Model-View-Controller:MVC 设计模式详解 C++ Model-View-Controller:MVC 设计模式详解

  • Struts2详细使用教程

    1:创建动态web工程Struts2Demo 2:导包,下面这个连接地址保存所需jar包 https://download.csdn.net/download/weixin_41477980/10879619 3:在动态web工程的src下创建Struts.xml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE st...

  • MVC 编程模式详解

    没有好理想的程序员不是好美术。 最精细的MVC编程模式详解!!!

  • struts的初步使用

    目标: 一:struts的配置 二:struts的动态方法调用 三:struts的传参 四:struts与tomcat的集成 一:struts的配置 第一步:导依赖(pom.xml) 首先在左侧菜单栏右键 然后点击Maven Project,再点击Next 继续Next 然后Catalog选择Internal,Filter选择最后一个,然后继续Next 然后Group Id为包名,Artifact Id为项目名,然后Finish 然后这一步还需要将...

  • MVC与设计模式的关系及MVC的实现原理和设计原理

    1 MVC介绍 众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式)。所以说MVC模式又称复合模式。MVC(Model-View-Controller) 模式的基本思想是数据,显示和处理相分离...

  • Struts2入门这一篇就够了

    前言 这是Strtus的开山篇,主要是引入struts框架…为什么要引入struts,引入struts的好处是什么,以及对Struts2一个简单的入门…. 为什么要引入struts? 既然Servlet能够完成的事,我们为啥要用框架呢?? 框架帮我们封装了很多常用的功能 把Web带过来的参数自动封装到JavaBean中[以前,我们刚开始学的时候是单个单个来获取参数的,后来我们又使用...

  • Struts2入门教程(全新完整版)

    一、准备工作及实例 3 1.解压struts-2.1.6-all.zip 3 2.六个基本包 3 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何使用alt+/提示 4 6.实例 4 7.开启struts2自带的开发模式常量 6 8.vo传参模式 7 9.ModerDriven传参模式(不建议采用) 7 10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置相关 8 4.分工合作include:指定多个配置文件 10 5.tomcat认证访问 10 6.初识拦截器 11 7.Action中的method属性 12 8.使用ForwardAction实现页面屏蔽。 13 8.使用default-Action配置统一访问 14 小结Action 14 9.使用通配符 14 10.使用0配置:ZERO Annotation 15 11.Result配置详解 15 探讨type类型: 16 Type类型值 16 作用说明 16 对应类 16 chain 16 用来处理Action链 16 com.opensymphony.xwork2.ActionChainResult 16 dispatcher 16 用来转向页面,通常处理JSP 16 org.apache.struts2.dispatcher.ServletDispatcherResult 16 redirect 16 重定向到一个URL 16 org.apache.struts2.dispatcher.ServletRedirectResult 16 redirectAction 16 重定向到一个Action 16 org.apache.struts2.dispatcher.ServletActionRedirectResult 16 plainText 16 显示源文件内容,如文件源码 16 org.apache.struts2.dispatcher.PlainTextResult 16 freemarker 16 处理FreeMarker模板 16 org.apache.struts2.views.freemarker.FreemarkerResult 16 httpheader 16 控制特殊http行为的结果类型 16 org.apache.struts2.dispatcher.HttpHeaderResult 16 stream 16 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。 16 org.apache.struts2.dispatcher.StreamResult 16 velocity 16 处理Velocity模板 16 org.apache.struts2.dispatcher.VelocityResult 16 xslt 16 处理XML/XLST模板 16 org.apache.struts2.views.xslt.XSLTResult 16 全局result: 17 动态Result:了解 18 12.异常处理 18 三、在Action获取Scope对象 19 方式一、与Servlet解耦合的非IOC方式 20 方式二、与Servlet解耦合的IOC方式 21 方式三、与Servlet耦合的非IOC方式 21 方式四、与Servlet耦合的IOC方式 22 四、OGNL与ValueStack(VS) 22 1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10.获取Stack Context中的信息 26 11.总结$ # %的区别 27 12.总结OGNL[重点] 27 五、拦截器 28 1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait拦截器 33 5.

  • struts2入门教程一(环境搭建,基本案例实现)

    Struts2入门初步需掌握 1.struts2概述 2.struts2环境搭建(第一个struts2的应用程序) 3.struts.xml文件配置详解 4.struts2请求的URL的搜索路径的顺序概述 5.struts2工作原理概述 6.struts2指定多个配置文件 7.struts2动态方法调用 8.使用通配符定义action     一:简介   Struts

  • java之struts框架入门教程

    本教程主要讲述struts的简单入门操作 使用的是myeclipse工具 1.创建web项目 2.复制struts必要的jar包到 WebRoot/WEB-INF/lib 下 jar包列表如下: asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar commons-fileupload-1.2.2.ja...

  • 【Struts2(一)】Strust2入门XML配置-action编写

    1.1 案例需求 1.1.1 需求概述 CRM系统中有客户的显示的功能,效果如图: 我们实际的开发中会使用Struts2作为Web的架构  1.2 Struts2的概述 1.2.1 Struts2的概述 Struts是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts框架几乎成为Web开发者的必...

  • Struts快速入门

    Struts快速入门     一、Struts快速入门案例 为什么要学习Struts呢?因为Web层jsp页面调用servlet过于繁琐,Apache组织开发了一套针对web层简化操作的框架,可以简化Web层的操作。 首先,我们了解了为什么要学习Struts后,我们先来用上Struts框架实现用户注册页面。 1、编写一个注册页面 2、把表单的注册请求交给struts处理 3、导入str

  • MVC模式的一个简单实例

    1.MVC模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View(视图) - 视图代表模型包含的数据的可视化。 Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。 2.实现步骤 我们将创建一个作为模型的Stud.

  • 简单的MVC框架例子

    一个简单的MVC例子:以javabean为基础(一个学生类)通过servlet控制页面跳转(处理业务逻辑、数据库连接等操作),jsp实现动态网页。

  • Struts2入门学习(一)- 最简单的Struts案例

    工具: 1.Intellij Idea 2.struts-2.3.24-all 一、首先知道什么是Struts2?它有什么用? Struts2是java中web层的一个非常出名的开源框架,在Struts1和webwork基础之上发展而来,对原生的Servlet进行了封装。使用Struts2可以帮助开发者提高开发效率,实现快速的开发。 二、使用过程 1.导入jar 解压资源包之后,发现lib目录中包...

  • Struts2 入门学习总结一

    一、Struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是Struts的下一代产品,这个框架充分发挥了Struts1和WebWork这两种技术的优势,抛弃原来Struts1的缺点,使得Web开发更加容易。 struts2还有以下...

Global site tag (gtag.js) - Google Analytics