设计动态模板

时间:2013-09-17 04:51:11

标签: templates design-patterns dynamic data-modeling

我正在为这家合金钢公司设计一个实验室系统 某些类型的测试(例如分析测试,冲击测试......)必须适用于生产线中的每个产品,我使用TestTemplate类来定义每个测试类型模板(例如分析测试模板)。 每种测试类型都有一些参数,每个参数可以采用以下形式:

  • 远程值(最小值,最大值)
  • 单值(值)
  • 可选值(从值列表中选择的一个或多个值)

(到现在为止,将来可能会找到一些新的参数类型)。

对于每个生产,我们应该为每个测试类型模板定义一些标称值(换句话说,每个测试类型模板的所需值),例如对于productA,分析测试的标称值可以如下:

  • 碳范围:(最小值= 0.23最大值= 0.65)
  • Fe范围:(最小值= 1.25 Max = 1.75)
  • Cu范围:( Min = 0.87 Max = 1.02)

而对于ProductB,名义可以是:

  • 碳范围:(最小值= 0.43最大值= 0.55)
  • Fe范围:(最小值= 1.15 Max = 1.65)
  • Cu范围:( Min = 0.57 Max = 1.12)
  • Pb范围:(值= 0.12)/ *单值类型参数* /

这是我对这个问题的设计 enter image description here

我的设计的主要目标是为测试模板实现动态结构,这种情况下是否有任何设计模式或一些最佳实践,或者这种设计是否足够好?

1 个答案:

答案 0 :(得分:3)

我祝贺你的设计。这种设计在类和实例之间有非常明显的区别,并且一点也不差。

你的问题不清楚。您认为您的设计或需求改进有什么问题?有时问正确的问题是什么能给你正确的答案。

我要改进的一件事是TestParameter类。我可能已经概括了这一点。换句话说,我会创建一个RangeTestParameter,SingleValueTestParameter和一个SelectableTestParameter。我会让广义的TestParameter包含一个工厂方法:

ITestParameterValue ITestParameter.createValue()

由SelectableParameter实现,它将返回一个SelectableValue。 SelectableValue将通过其构造函数提供一组可选/允许的值。

通过这种方式,您可以解决设计中的两个问题,如果这是我的设计,我会问自己:

  1. TestParameterType:为什么在编译时类型可用时设计一个类型类?您如何确保您的Code参数包含有效和有效的值?谁负责根据这些代码创建这些类型?
  2. PermitedValue:仅当TestParameter具有对ParameterType Selectable的(代码)引用时,TestParameter才有一个ParameterValues列表吗?如果它没有怎么办?谁确保它呢?谁知道如何以这种特殊方式解释TestParameter?只有SelectableValue?只有那些在你的类图中读过if语句的人?
  3. 如果您想向用户展示可能的参数列表,可以创建一个TestParameterFactory,将您的参数类型链接到一些其他信息。这是一个简单的Java版本的工厂:

    public class TestParameterFactory {
        private final Map<String, ITestParameter.class> parameterTypes;
    
        public TestParameterFactory() {
            parameterTypes = new HashMap<String, ITestParameter.class>();
            parameterTypes.put("Range", RangeTestParameter.class);
            parameterTypes.put("Selectable", SelectableTestParameter.class);
            parameterTypes.put("Single value", SingleValueTestParameter.class);
        }
    
        public getParameterTypes() {
            return parameterTypes;
        }
    
        public ITestParameter createParameter(String name) {
            ITestParameter parameterType = parameterTypes.get(name);
            if (parameterType == null) 
                throw new IllegalArgumentException(name+ " is not a valid parameter type name");
            return parameterType.newInstance();
        }
    }
    

    我希望这会有所帮助。祝你好运!