IoVC,一种新的编程思想
2008-02-21 由 Kevin 发表   评论(9条)   有1804人浏览

1. 概述

长久以来,在Web编程中,一直很难克服的一个问题就是:展现层与业务数据纠缠在一起,无法进行良好的解耦, 从而造成应用系统的扩展性差,维护成本高。于是,出现了所谓的MVC框架,试图以 Model-View-Control 这种非常流行的设计模式,将两者有效的隔离开来。但回顾目前主流的 Web MVC 架构,它们所做的绝大部分工作无非是:将页面中控件的值取出打包成 Java Bean;再无非就是在帮助你完成页面导航的过程中,辅助你进行页面参数的传递与分析。这样一种“简单 MVC”架构,是无法完全解决“展现层与业务数据完全解耦”这个问题的。 一旦你的需求超越了框架的能力,那么,你将面对的依然是:不得不在展现层中嵌入大量的 Script 代码,可能是Java代码片断,也可能是大量tag-lib及EL表达式的引入。

2. 什么是IoVC

IoVC——“Inversion of View-Control”,即“视图控制反转”,换言之:它能够把对“View(即 UI 视图)的控制力”注入到你的后台业务逻辑中。这样一来,你在编写业务逻辑的过程中,对 View 拥有足够的控制力,从而能够将展现层与业务逻辑完全的解耦。

举一个场景:页面中有一个文本输入框,它的值对应后台的一个JavaBean的属性。我们首先来看一下传统的编程模型:

页面:
<w:textField value="#{myBean.value}"/>

后台:
public class MyBean {
    private String value;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

此时,假设用户需要发生变化,我们需要设置文本输入框的tooltip,并且,它的值来自于后台 JavaBean 的另一个属性,那么,程序需要做如下调整:

页面:
<w:textField  value="#{myBean.value}" 1tooltip="#{myBean.tooltip}"/>

后台:
public class MyBean {
    private String value;

    2private String tooltip;

    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    3public String getTooltip() {
        return tooltip;
    }
    4public void setTooltip(String tooltip) {
        this.tooltip = tooltip;
    }
}

我们可以观察:在传统的编程模型下,如果页面逻辑发生变化,我们首先需要修改UI展现层,加上 tooltip="#{myBean.tooltip}" 的语句,然后,再在后台Bean中设置此属性值。

那么,在IoVC编程模型下,情况又是怎样的呢?

页面:
<w:textField 1id="txt"/>
后台:
public class MyBean {
    @Bind(id="txt")
    private String value;
}

如果需要扩展文本编辑框的tooltip属性,只需要:

页面:
<w:textField id="txt"/>
后台:
public class MyBean {
    @Bind(id="txt")
    private String value;
    
    1@Bind(id="txt" att="tooltip")
    private String tooltip;
}

在IoVC编程模型下,Web页面不需要发生任何变化,你只需要在后台 Java Bean 中写上这样一行属性声明即可@Bind(id="txt" att="tooltip") private String tooltip,甚至于你连传统的getter/setter都不需要。

换言之,在传统的编程模型下,页面美工通过网页设计工具“画”出来的页面,程序员看不懂; 而如果程序员对页面进行修改,则页面美工又无法理解; 并且,如果要更改业务逻辑,程序员需要不断的维护页面内容,最终造成页面美工与程序员无法协同工作。而在 IoVC 的编程思想下,页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。Web页面在美工完成之后,程序员再也无需因为需求的变更或者逻辑的变化,而再重新维护 Web页面内容。

简而言之,IoVC是一种更好的MVC,是对MVC的一种高层次抽象。

设想一下:日后美工人员画出来的页面(只要设置了正确的ID),程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界?

所有评论
star 2008-10-14 评论道:
我曾经在一家公司自己做的开发框架中看到类似的情况,比如说条件查询的时候,如果这个字段作为查询条件,那么在配置文件里将这个字段对应的可见属性设置true
scott.yuan 2008-08-27 评论道:
一个textInput有很多个属性,系统需要将每个属性本java bean的标注进行比对,看看是否有相应的设置,例如( 1@Bind(id="txt" att="tooltip")),这会不会影响页面展示的效率。我个人觉得在局域网内使用的系统比较适合使用这个架构。要是能看一下测试报告就好了!
torr 2008-07-04 评论道:
从这篇文章看, IoVC 是不是将本来简单的 Bean 变得复杂了呢?
suzon 2008-03-25 评论道:
其实类似这种基于元素ID绑定的开发模式已经存在,熟悉Wicket框架以及Xmlc开发的应该对此并不陌生。 Wicket与此类似都需要特定的标签,而Xmlc才是真正的将页面分离出来,不需要添加任何的非标准的Html.
Kevin 2008-02-28 评论道:
To 飞天不不: 成熟度是需要时间积累及市场证明的,感谢您的关注,我们一直在努力! To 小李: IoVC只是一种思想,就像 IoC 一样,其实 IoC 本身也并没有什么,Spring就是一个典型的IoC容器。但提出IoC这个思想的人,是很了不起的。 To bryan: 如果 AOM 再结合 facelets的jsfc技术,理论上是可以将美工和开发人员彻底解耦的,很快我们会有一篇文章介绍这方面的内容。 再次感谢大家的关注!
bryan 2008-02-28 评论道:
不错!网页编程一直觉得是比较麻烦的一件事,主要是由于做程序时对于美工方面没理解,所以有时即使功能做出来用户来不满意,更多的就是在做网页时不好调试,不好查错,所以在有好的想法也需要有好的开发工具支持才好!
alwens 2008-02-28 评论道:
方便了一点,但是还要学具体使用方法,向Webwork、Struts这些功能修改一点代码,这些功能都可以实现
飞天不不 2008-02-27 评论道:
但是真正商业性上不知是否有足够的成熟度来支撑
sungaoyong 2008-02-23 评论道:
确实方便了很多,便于分工
1   共1页
您还没有登录,请登录后发表评论