我目前正在研究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构造函数的每一行。
有人做过类似的事情,可以给我一些提示吗?
谢谢!
答案 0 :(得分:1)
针对您的情况的最佳答案取决于其余软件的设计目标。我将用来指导设计选择的一些示例问题:
以下是一些可能会或可能最不适合您的特定情况的可能性。
如果问题是样板吸气器和装定器的错误封装,也许最好摆脱它们:
struct TestLimits {
voltage max_voltage;
current max_current;
limit limit3;
};
这允许您在源代码中通过有意义的名称引用每个限制,并且消除了任何繁琐的构造函数,getter和setter代码。以后使限制变得更复杂可能会更困难。例如,如果稍后在软件中添加了新测试,因此max_voltage
现在是test_time
的功能,那么涉及TestLimits的一切都必须更改。
假设通过一些密集的操作(例如读取配置文件或查询测试设备)一次计算出所有测试极限。我经常以这样的模式结束:
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
接口提供。然后,所有限制的使用者都不知道软件如何找到它们。该实施的一部分可以完全更改,而无需更改所有用户。
Qt有一个property system,对于可参数化的对象非常有用。如果使用QProperty,则生成对话框以获取属性/限制变得非常容易,此外,还有一个XML序列化系统。在是否编写自定义获取器,设置器和通知信号方面,属性具有很大的灵活性。也可以在运行时动态添加或修改对象的属性。
另一方面,TestLimits
容器必须从QObject
派生而来,后者引入了元对象编译器。这将深度Qt依赖关系引入了限制代码,这可能不适合。