java - 干净的代码,如何改进一个类

标签 java code-cleanup

我有我的 CommandFormatValidator 类,它检查输入的字符串是否符合任何预定义的模式。随着时间的推移,类实现了越来越多的新模式,导致了类的以下形式:

import java.util.StringTokenizer;
import java.util.regex.Pattern;

public class CommandFormatValidator {

    private Pattern adlPatternAll = Pattern
            .compile("^ACTV/(READ|ADD|DEL|RPL)/ADL.*");

    private Pattern adlPatternAddDefault = Pattern
            .compile("^ACTV/ADD/ADL/(DFLTTY((/([A-Z0-9]{7})){1,5})|DFLMIN(/[0-9]{1,4}))");

    private Pattern adlPatternDeleteTtymailGeneral = Pattern
            .compile("^ACTV/(DEL|READ)/ADL/TTYMAIL(/[A-Z0-9]{7})?");

//around 20 more pattern declarations...

public void validate(Object payload){

        String command = (String)payload;

        if (adlPatternAll.matcher(command).matches()) {
            if (!adlPatternAddDefault.matcher(command).matches()) {
                if (!adlPatternAddCityTty.matcher(command).matches()) {
                    if (!adlPatternAddCityFltTty.matcher(command).matches()) {
                        if (!adlPatternAdd.matcher(command).matches()) {
                            if (!adlPatternDelDefault.matcher(command).matches()) {
                                if (!adlPatternDel.matcher(command).matches()) {
                                    if (!adlPatternDelCityFltTty.matcher(command).matches()) {
                                        if (!adlPatternRpl.matcher(command).matches()) {
                                            if (!adlPatternRead.matcher(command).matches()) {
                                                if (!adlPatternReadCityFlt.matcher(command).matches()) {
                                                    if(!adlPatternAddTtymail.matcher(command).matches()) {
                                                        if( !adlPatternDeleteTtymailGeneral.matcher(command).matches()) {
                                                            if (!adlPatternDeleteTtymail.matcher(command).matches()) {
                                                                throw new ServiceException(CommandErrors.INVALID_FORMAT);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

现在我想清理这个类。有谁知道我怎样才能实现这一目标?我将特别感谢任何可以应用于我的案例的设计模式。

最佳答案

您可以将它们全部列出在一个数组中,然后迭代该数组。

顺便说一句:使用 matches() 时不需要 ^ anchor 。

不知道您是否在第一次测试中错过了!,但这里没有:

public class CommandFormatValidator {

    private Pattern adlPatternAll = Pattern
            .compile("^ACTV/(READ|ADD|DEL|RPL)/ADL.*");

    private Pattern adlPatternAddDefault = Pattern
            .compile("^ACTV/ADD/ADL/(DFLTTY((/([A-Z0-9]{7})){1,5})|DFLMIN(/[0-9]{1,4}))");

    private Pattern adlPatternDeleteTtymailGeneral = Pattern
            .compile("^ACTV/(DEL|READ)/ADL/TTYMAIL(/[A-Z0-9]{7})?");

    //around 20 more pattern declarations...

    private Pattern[] adlAll = { adlPatternAddDefault
                               , adlPatternDeleteTtymailGeneral
                               //more
                               };

    public void validate(Object payload){
        String command = (String)payload;
        if (! adlPatternAll.matcher(command).matches())
            return;
        for (Pattern p : adlAll)
            if (p.matcher(command).matches())
                return;
        throw new ServiceException(CommandErrors.INVALID_FORMAT);
    }
}

关于java - 干净的代码,如何改进一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36797100/

相关文章:

whitespace - Sublime Text 2 : Trim trailing white space on demand

c# - Resharper 提示/技巧...这可能吗?

java - 为什么我刚刚实现的 H2 数据库会出现 "Database may be already in use: null"错误?

java - JAVA中如何将以空格分隔的整数字符串转换为数组

ruby-on-rails - 如何干燥重复的 Ruby 代码?

html - 同时从多个页面中删除未使用的 css(整个网站)

java - JdbcTemplate如何自动生成主键

java - eclipse : XML document structures must start and end within the same entity 中的 SaxParseException

java - JAX-RS 在 GET 中公开 OneToMany 实体

c# - 使用 resharper 清理/重新格式化删除注释中的多余空格