【问题标题】:Designing a dynamic template设计动态模板
【发布时间】:2013-09-17 04:51:10
【问题描述】:

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

  • 范围值(最小值、最大值)
  • 单值(值)
  • 可选值(从值列表中选择一个或多个值)

(目前为止,未来可能会发现一些新的参数类型)。

此外,对于每个产品,我们应该为每个测试类型模板定义一些标称值(换句话说,每个测试类型模板的期望值),例如对于 productA,分析测试的标称值可能如下:

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

对于 ProductB,名义可能是:

  • 碳范围:(Min=0.43 Max=0.55)
  • Fe 范围:(Min=1.15 Max=1.65)
  • Cu 范围:(Min=0.57 Max= 1.12)
  • pb range: (value = 0.12) /* 单值类型参数*/

这是我针对这个问题的设计

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

【问题讨论】:

  • “实现测试模板的动态结构”究竟是什么意思?
  • @Sniffer:我的意思是高级用户可以定义一个新的测试模板,其中包含不同类型的参数,然后其他用户可以根据新创建的测试模板创建一些标称测试值。

标签: templates design-patterns dynamic data-modeling


【解决方案1】:

祝贺您的设计。这种设计对类和实例有非常明确的区分,一点也不差。

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

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

ITestParameterValue ITestParameter.createValue()

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

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

  1. TestParameterType:当类型在编译时可用时,为什么要设计类型类?您将如何确保您的 Code 参数包含有效的功能值?谁负责根据这些准则创建这些类型?
  2. PermitedValue:仅当 TestParameter 具有对 ParameterType Selectable 的(代码)引用时,TestParameter 是否具有 ParameterValues 列表?如果没有怎么办?谁来保证?谁知道如何以这种特殊方式解释 TestParameter?只有可选值?只有那些读过你的类图中的 if 语句的人?

如果您想向您的用户展示可能的参数列表,您可以创建一个 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();
    }
}

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

【讨论】:

  • 谢谢 mrhobo,首先,您说:“由 SelectableParameterValue 实现,它将返回一个 SelectableValue。该 SelectableValue 将通过其构造函数提供一组可选/允许的值。”不是很明白,能不能详细解释一下?其次,如果我不使用 TestParameterType 类,当高级用户想要定义一个新的测试模板时,我如何向他展示测试可接受的测试参数类型的类型?
  • 搞错了。我的意思是“由 SelectableParameter 实现”而不是“SelectableParameterValue”。我纠正了它。 SelectableParameter 是一种 TestParameter 类型,它可以构造一个新的 ITestParameterValue(与 NominalTestParameter 相同)对象。 SelectableParameter 上的工厂方法在构造时向 SelectableParameterValue 传递允许值的列表。
  • 回答您的第二个问题:使用保存有关类型信息的工厂。请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2010-12-10
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多