`
魔力猫咪
  • 浏览: 106639 次
  • 来自: 北京
社区版块
存档分类
最新评论

使用模板模式处理获取参数判断

阅读更多
今天在写一个Servlet,需要从获取很多web.xml中定义的参数。一般我们都这么取:
String param = getInitParameter("参数名");
//然后必须判断一下是否Null
if (param != null && param.length() >= 0) {
//处理参数
......
}

但是一个两个还好,参数太多的话就看到一大堆这种代码。感觉特别别扭。所以就想到了模板的方式,反正都是先取出来,然后判断,最后处理。处理这部分抽象出来,其他部分作为模板。
一个内部的模板类如下:
    /**
     * 模板参数处理内部抽象类
     * @author Miao
     * @version 0.2
     * @since 0.2
     */
    private abstract class ParameterTemplate {

        /**
         * 判断参数是否为Null
         * @param param 参数
         * @return 参数非Null返回true,参数为Null返回false
         * @since 0.2
         */
        private boolean isNotNullParam(String param) {
            if (param == null || param.length() == 0) {
                return false;
            } else {
                return true;
            }
        }

        /**
         * 处理参数
         * @param name 参数名
         * @since 0.2
         */
        public void executeParameter(String name) {
            String param = getInitParameter(name);
            if (isNotNullParam(param)) {
                setParameter(param);
            }
        }

        /**
         * 设置参数
         * @param param 参数
         * @since 0.2
         */
        public abstract void setParameter(String param);
    }

setParameter方法是抽象方法,用于在判断完成后处理参数。
然后读取参数就可以像下面这样:
new ParameterTemplate() {

            @Override
            public void setParameter(String param) {
                //处理参数
                ......
            }
        }.executeParameter("参数名");



我现在正在考虑是否应该把获取参数部分也抽象出来,这样这个类就可以用在其他地方了,而不是局限于Servlet中。正在继续重构中。
不知道自己改得是简化了处理还是复杂了处理,大家也讨论讨论。
分享到:
评论
7 楼 魔力猫咪 2010-03-15  
实际上我这部分代码已经被我删除了。使用了apache的BeanUtil进行参数拷贝,代码简单了好多,但是代价是增加了jar包。
6 楼 H_eaven 2010-03-15  
做法非常好.
但还不至于上升到模式的高度吧.  -_-!

这个仅仅是编写代码的良好习惯. 借用<<Refactoring>>中的名词,这是Extract Method手法.

相对上文的例子中.executeParameter()方法它的外在功能,表达我要设置一个参数值,实现过程我首先需要获取一个参数,然后检查这个参数是否非空,如果不为空,将值设置,如果为空则不做处理. 

这个实现需要三步完成,第一步略过,第二步,我关心的是这个参数是否非空,但对于executeParameter这个方法来说,没必要知道检查非空性的实现过程,对于第三步,也是同样的道理,我只关心参数非空的话,就将值设置,而不在乎你是怎么设置的详细过程. 
经过Extract Method之后带来的好处多多.1.清晰性,当读到executeParameter这个方法,我看方法头大概知道它做什么,看方法体也很快能清楚它是执行步骤,如果对每一步的实现方法更兴趣,我可以再去看其它两个方法isNotNullParam,setParameter的具体实现,注意:这里的阅读都是主动的,而不是被动的,我对你的实现过程感兴趣就去看,不感兴趣就可以不看,如果没有这种分离,不管你感不感觉兴趣你都得看,因为你不看你就不知道方法的完整执行过程. 当读到其它两个方法, 阅读流程开始重复.
2.重用性, isNotNullParam这个方法有很强的通用性.判断一个对象是否为null,基本和业务这种高层次的抽象无关,相反它是一个很低级的概念,而且程序当中的其它地方也会有对参数,变量的非空性检查操作.
3.同一抽象层次. 细化2里的讨论,"判断一个对象是否为null,基本和业务这种高层次的抽象无关,相反它是一个很低级的概念",也就是说isNotNullParam方法的实现不应该出现在这个类里,现再你已经使用Extract Method做了第一步,那么从重用的角度和一个类里的方法都应该在同一抽象水平上的角度,应该再使用Move Method将isNotNullParam移动一个工具类中,(说到同一抽象,它也符合单一职责的语义,不在同一抽象水平,引起它们变化的因素必然不同,而一个类的变化只应有一个原因所引起.)

过度设计,首先这是一个无法量化的概念.只能和其它相比之后才能得出它是否过度设计了.我们只能参照着一些目标去做,当然实现过程会增加一些复杂性,比如方法数量比重构之前多了,类的数量比重构之前多了,但是数量是问题吗?如果是过度设计了就是问题,如果还没有,那就是正常的. PS:好像现再还没有一些硬性规定说一个类里你最多只能写5个10方法的吧(呵呵!).
  楼主的例子的确简单些,相对也有些过度了,但简单对于学习很好.
我也曾经见过极端的人.4000多行的代码写到一个方法里,实现了一个独立的功能.
   这也是个人习惯吧,有人习惯把所有东西写到一起,也有人喜欢将它们整理整理,归归类, 这在现实生活中,你身边也应该都有这两种性格的人吧,或者是一个人在不同方面所表现的这两种特质(扯远了-_-!).
注:方法头标示着做什么,而方法体则是怎么做的具体实现过程.
5 楼 mercyblitz 2010-03-14  
简单的问题复杂化了,为什么不用javax.servlet.ServletConfig#getInitParameterNames(),解释成一个Map<String,String>,过度的面向对象会带来复杂度~
4 楼 myyate 2010-01-29  
funcreal 写道
如果param != null 是不是 param.length() >= 0一定成立呢?

难道还有param.length() < 0的情况?
最方便的应该是类似Spring的HttpServletBean的实现。
3 楼 funcreal 2010-01-29  
如果param != null 是不是 param.length() >= 0一定成立呢?
2 楼 hanny.yi 2010-01-29  
在楼主的基础上改的,多指教

/**
 * 模板参数处理内部抽象类
 * 
 * 实现三个方法:	getParameter()----对单个参数的处理,并返回处理结果
 * 				isTrueOrFalse()---对处理结果进行过虑,判断是否调用处理结果方法setParameter()
 * 				setParameter()----对getParameter()方法得到的结果进行处理
 * 实现所以方法后,调用executeParameter()方法,对多个参数进行统一处理
 * 
 * @author HANNY.YI
 *
 * @param <I>	传入的参数类型
 * @param <O>	处理后结果的类型
 */
public abstract class ParameterTemplate<I,O> {

	/**
	 * 处理参数
	 * 
	 * @param name	传入的参数
	 */
	public void executeParameter(I...name) {
		for (I n : name) {
			O param = this.getParameter(n);
			if (isTrueOrFalse(param)) {
				setParameter(n,param);
			}
		}
	}
	
	/**
	 * 对参数的处理方法
	 * 
	 * @param name	传入的参数
	 * @return	返回处理结果
	 */
	public abstract O getParameter(I name);

	/**
	 * 过虑处理结果
	 * 
	 * @param param	处理结果
	 * @return 返回true或返回false
	 */
	public abstract boolean isTrueOrFalse(O param);
	
	/**
	 * 对结果的处理方法
	 * 
	 * @param name	传入的参数
	 * @param param	处理结果
	 */
	public abstract void setParameter(I name,O param);
}
1 楼 xiaoyi3317 2010-01-19  
嗯。。是可以这样的。。写的不错

相关推荐

    应用MATLAB提取纳米模板特征几何参数.pdf

    标题和描述中提到的知识点主要围绕了使用MATLAB软件对纳米模板进行图像处理,并提取其几何特征参数的过程。以下是对这部分内容的详细解释: 首先,文章明确了高质量纳米模板的重要性,这是制备高性能纳米功能材料的...

    Beetl 模板语言使用指南

    Beetl模板语言是一种...在模板中,可以方便地获取请求参数。 总之,Beetl模板语言凭借其易学、全面、高效的特点,为开发者提供了强大的视图层解决方案,无论是在Web开发还是代码生成等方面,都能发挥出显著的优势。

    Java设计模式面试题汇总

    包括责任链模式、命名模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式等。 常见设计模式: 工厂模式:工厂模式指由一个工厂对象来创建实例,客户端...

    Joomla模板开发-模版是如何执行的

    组件生成的内容会被缓存起来,以便在后续的模板处理中使用。接下来,进入模板的执行过程: 1. **加载模板参数**:如果模板定义了特定的参数,这些参数会在模板执行之初被加载,允许开发者通过模板配置来改变网站的...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    简单工厂模式适用于当一个系统需要根据某些条件(如输入参数)动态决定创建哪个类的对象,而客户端又不希望直接处理这些复杂的判断逻辑时。 通过“创建模式-1.单例模式”和“创建模式-2.简单工厂模式”这两个文件...

    动软分享社区模板

    - **页面元素逻辑判断**:可以使用条件语句如`@if (condition) { ... } else { ... }`来控制页面元素的显示与否。 - **循环输出元素**:可以使用`@foreach (var item in Model) { ... }`来遍历集合并输出每个元素。 ...

    jsp购物车模板

    JSP页面可以包含HTML元素,用于用户输入,然后使用`request.getParameter()`获取表单数据,进行验证和处理。 4. **MVC模式**:购物车系统常采用Model-View-Controller(MVC)设计模式。模型(Model)处理业务逻辑和...

    Velocity模板使用指南中文版

    ### Velocity模板使用指南中文版知识点总结 #### 一、Velocity简介 Velocity是一种基于Java的模板引擎,用于在Web页面中引用Java代码中定义的数据对象和命令。它支持将业务逻辑和展示逻辑分离,有助于实现MVC...

    设计模式 GOF 23

    实际上,当我评估一个面向对象系统的质量时,所使用的方法之一就是要判断系统的设计者是否强调了对象之间的公共协同关系。在系统开发阶段强调这种机制的优势在于,它能使所生成的系统体系结构更加精巧、简洁和易于...

    c++模板元编程.ex.zip

    模板元编程中常见的模式包括:类型枚举(type enumeration),通过模板递归实现类型列表;类型算术,对类型进行加减操作,如`std::integral_constant`系列;以及类型条件判断,如`std::enable_if`,它可以基于某个...

    Delphi判断文件是否正在被使用

    在判断文件是否被使用时,通常我们会尝试以独占模式(即不允许共享)打开文件。如果CreateFile函数返回一个有效的句柄,那么文件当前没有被其他进程使用;如果返回INVALID_HANDLE_VALUE,那么文件很可能正被其他进程...

    PHP实例开发源码-红鸟PHP模板引擎 v1.0.zip

    开发者可以通过开启调试模式,获取详细的错误信息以便快速定位问题。 总结来说,红鸟PHP模板引擎通过简洁的语法和高效的执行,为PHP项目提供了一种优秀的模板解决方案。它使得前后端职责分明,提高了代码的可读性...

    java 设计模式之工厂模式

    在软件开发中,设计模式是一种解决常见问题的模板或最佳实践,它们是经过验证的、在特定场景下高效且可重用的解决方案。本篇文章将深入探讨Java中的一个基础设计模式——工厂模式,以及它的一些变体,如简单工厂模式...

    php模板说明.doc

    根据提供的文档信息,本文将详细解析PHP模板的相关知识点,包括如何在PHP中使用模板系统进行页面渲染、控制层如何调用数据以及与数据库交互的基本流程等。 ### PHP模板概述 PHP模板是一种用于分离业务逻辑与表示层...

    设计模式:可复用面向对象软件的基础--详细书签版

    实际上,当我评估一个面向对象系统的质量时,所使用的方法之一就是要判断系统的设计者是否强调了对象之间的公共协同关系。在系统开发阶段强调这种机制的优势在于,它能使所生成的系统体系结构更加精巧、简洁和易于...

    设计模式特点

    命令模式将请求封装为一个对象,从而让你使用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **好处:** 1. **类间解耦**:命令模式有助于降低类间的耦合度。 2. **高内聚**:每个...

    OpenCV-python轮廓提取与模板匹配(csdn)————程序.pdf

    在Python中使用OpenCV时,我们可以利用其强大的图像分析和处理能力,比如轮廓提取和模板匹配。 轮廓提取是识别图像中特定形状或物体边界的过程。在OpenCV中,`cv.findContours()`函数用于找到图像中的轮廓。这个...

    System.Drawing.Image.FromStream 出现参数无效的解决方法及图片类型判断

    然而,有时在尝试使用此方法时可能会遇到“参数无效”的异常,这通常是由于流中的数据不正确或格式不受支持所导致。本文将深入探讨这个问题,提供解决方法,并讲解如何判断图片类型。 ### 问题原因 1. **流数据不...

    JSP模板~~~内部资料

    5. **MVC(Model-View-Controller)**:JSP常与MVC设计模式结合使用,其中模型(Model)处理业务逻辑,视图(View)负责显示,控制器(Controller)处理用户请求并协调模型和视图。 6. **Servlet**:JSP的本质是...

    基于PHP的TMDPHP 国产优秀PHP模板引擎.zip

    1. **简洁的语法**:TMDPHP提供了简洁明了的模板语法,如`{$变量名}`用于输出变量,`{foreach}`用于循环,`{if...else}`进行条件判断,大大减少了模板中的PHP代码量。 2. **高效的执行**:TMDPHP在编译阶段将模板...

Global site tag (gtag.js) - Google Analytics