我应该如何划分测试值?

时间:2019-05-02 23:20:38

标签: c++ qt

我目前正在研究Qt / C ++中的程序,该程序将分析和测试从称为“ Phabrix SxE”的设备接收到的差异值。根据我们要测试的产品,这些值会有不同的限制。

我的第一个想法是创建一个名为“ TestLimits”的类,并为我们将测试的所有值使用私有变量。然后,该类将在名为“ TestConfiguration”的类中使用(除“ TestLimits”类外,还将包含有关Phabrix设备具有的IP地址,端口和名称的信息。)

TestConfiguration (name, ip, port, limits);

如果使用此策略,则需要为TestLimits类中的每个私有成员值使用getter和setter。我不是真正的吸气剂/吸气剂爱好者,只是因为它们破坏了封装。如果我只使用“ TestConfiguration”类,并在构造函数参数中声明所有限制,那么...

TestConfiguration (name, ip, port, limit1, limit2, limit3, ..., ...);

...很快就会变得混乱。

在创建类似这样的内容时,如何避免使用getter,setter和冗长且混乱的构造函数?即使我使用“ TestLimit”,也需要这样声明它们...

TestLimit(limit1, limit2, limit3, ..., ..., ...);

...仍然很混乱。如果我需要为测试之一添加新值怎么办?在那种情况下,我需要编辑使用TestLimit构造函数的每一行。

有人做过类似的事情,可以给我一些提示吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

针对您的情况的最佳答案取决于其余软件的设计目标。我将用来指导设计选择的一些示例问题:

  • 有多少个限制,它们都是相同的数据类型还是不同的?
  • 如何称呼它们?也就是说,它们的字面意思是“极限1,极限2 ...”还是“最大电压,最大电流……?”
  • 限制的数量或布局是否经常更改?这是现在很小的东西,但是随着程序的发展可能会扩展吗?
  • 软件如何了解限制?它们来自配置文件,用户对话框,硬编码还是其他?

以下是一些可能会或可能最不适合您的特定情况的可能性。


选项1:普通旧结构

如果问题是样板吸气器和装定器的错误封装,也许最好摆脱它们:

struct TestLimits {
    voltage max_voltage;
    current max_current;
    limit limit3;
};

这允许您在源代码中通过有意义的名称引用每个限制,并且消除了任何繁琐的构造函数,getter和setter代码。以后使限制变得更复杂可能会更困难。例如,如果稍后在软件中添加了新测试,因此max_voltage现在是test_time的功能,那么涉及TestLimits的一切都必须更改。

选择2:只有吸气剂才能保持封装状态

假设通过一些密集的操作(例如读取配置文件或查询测试设备)一次计算出所有测试极限。我经常以这样的模式结束:

class TestLimitsFinder {
public:
    TestLimitsFinder();

    void find_all_the_limits();

    const voltage& max_voltage() const;
    const current& max_current() const;
    limit limit3() const;

private:
    voltage max_voltage_;
    current max_current_;
    limit limit3_;
};

此系统提供了一些封装。设置限制的唯一方法是通过find_all_the_limits()方法。它消除了样板构造函数和setter,但没有getter。如果有许多消耗限制的对象,但只有一个或几个产生限制,则可以将getter方法作为抽象的ITestLimits接口提供。然后,所有限制的使用者都不知道软件如何找到它们。该实施的一部分可以完全更改,而无需更改所有用户。

选项3:QProperty

Qt有一个property system,对于可参数化的对象非常有用。如果使用QProperty,则生成对话框以获取属性/限制变得非常容易,此外,还有一个XML序列化系统。在是否编写自定义获取器,设置器和通知信号方面,属性具有很大的灵活性。也可以在运行时动态添加或修改对象的属性。

另一方面,TestLimits容器必须从QObject派生而来,后者引入了元对象编译器。这将深度Qt依赖关系引入了限制代码,这可能不适合。