阅读更多

3顶
1踩

编程语言

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

2012-07-16 17:29 by 副主编 MnouW 评论(3) 有4557人浏览
在一个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调用

发表评论

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

相关推荐

  • struts1教程

    struts1教程,根据教程可以自己做一个简单的struts1项目

  • Struts2快速入门,超简单详细的快速入门教程,一文搞懂JVM架构和运行时数据区

    总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友[外链图片转存中…(img-Te6NGYKW-1712114481445)][外链图片转存中…(img-lLOCelRo-1712114481446)]

  • Struts2入门这一篇就够了

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

  • struts流程框架及简单使用

    Struts结构 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求。 2、这个请求经过一系列的过滤器(Filter),这些过滤器中有一个ActionContextCleanUp的可选过滤器,对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin。 3.FilterDispatcher被调用来...

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

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

  • 设计模式 之 —— MVC模式

    设计模式之 —— MVC模式 含java代码示例,一篇文章即可看懂

  • struts的初步使用

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

  • 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的实现原理和设计原理

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

  • 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...

  • jsp+struts2购物车

    jsp+struts2购物车全部源代码,并包含数据库完整代码。是学习jsp 与struts2的好材料。

  • Struts与jsp+javabean区别

    采用Struts框架技术和直接使用jsp+javabean技术开发各有什么优势?各自的缺点又是什么? 在java web开发领域存在2种开发模式, 模式一,jsp+javabean 模式二,jsp+javabean+servlet,即所谓的MVC设计,struts只不过是遵循MVC的一个开源框架. 在模式一中(jsp+javabean),这种设计模式适合,小规模web开发,体现

  • Struts2框架的基本使用

    前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性。从本篇开始我们学习Struts2的基本用法,本篇主要包括以下内容: Struts2的下载安装 理解整个框架的运行流程 自定义实现Action 自定义配置处理结果 一、下载和安装Struts2      登录Apache官网 http://struts.apache.org/downlo

  • struts使用

    1.struts配置 1.1在pom.xml导入struts与tomcat的jar依赖(在maven中默认没有tomcat) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma

  • Hp服务器iLO IML硬件日志收集与远程巡检

    项目地址:https://github.com/zhangrj/HP-iLO-Log-Collector 惠普服务器的iLO模块,可用于远程控制服务器电源、开启远程控制台、检查服务器健康状态等,其中IML( Integrated Management Log )是排查硬件故障的重要手段,这套小程序就是用来批量收集Hp服务器的IML日志,可写入本地文件并以邮件形式发送巡检报告。 python-...

  • 设计原则与设计模式

    MVC设计模式是一种混合设计模式,M指的是model,V指的是view,C指的是controller。 model:模型持有所有的数据、状态和程序逻辑 view:用来呈现模型 controller:取得用户的输入并解读其对模型的意识(controller并不负责处理逻辑,只是将用户的输入解读为对模型的操作,所有的逻辑和对数据的操作都交给model) 一、非web应用中的MVC设计模式 用户对view的操作交由controller,controller对用户的操作进行解析,并将解析后的操作交给model,

  • MVC设计模式应用实例-登录程序

    ----知道自己错在哪的猿是幸福的。 基本功: 要求会用自己的话讲解、MVC设计模式特点、画出MVC处理流程图:程序编写要靠思想!!! 登录程序流程图: 程序清单及作用:整体编程思想!!! -- 使用 zz 数据库 use zz; -- 删除 user 表 drop table user if exists user; -- 创建 us

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

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

  • 手把手教你快速搭建Struts2框架【详细教程,建议收藏】

    你好呀,我是灰小猿,一个超会写BUG的程序猿!今天在这里记录一下在eclipse环境下搭建Struts2框架的过程。 Struts框架简介 Struts2作为一个Web框架,是以Webwork的设计思想为核心,它吸收了Struts1的优点,可以认为Struts2是Struts1和Webwork结合的产物。Struts2是一个兼容Struts1和WebWork的轻量级MVC框架,也就是说使用它进行开发所使用的代码量和运行时所占用的并不会很多。因此今天在这里就和大家分享记录一下Struts2框架在e...

Global site tag (gtag.js) - Google Analytics