QT 中信号和槽的清晰命名

Clear naming for Signal and Slots in QT

我很难在我的 class

中为信号和插槽给出清晰的名称

是Controller控制Device的抽象层次:CommunicationAdapter

确实如此:

  1. 从控制器向设备发送参数(例如,用户在 UI 上输入值)
  2. 从设备请求参数(获取初始数据)
  3. 通知设备中的参数更改(设备上发生事件)

现在我有这样的东西:

class CommunicationAdapter
{
    Q_OBJECT

public slots:
    //1: slot for Controller to set parameter
    void parameterReceived(Parameter parameter);

    //2: slot for Controller to request parameter
    void parameterRequested(Parameter parameter);
    //2: slot for Device to reply on parameter request
    void parameterReplied(Parameter parameter);

    //3: slot for Device to inform about change of parameter
    void parameterUpdated(Parameter parameter);

signals:
    //1: signal to Device
    void sendParameter(Parameter parameter);

    //2: signal to Device for sending parameter request
    void requestParameter(Parameter parameter);
    //2: signal to Controller for reply on parameter request
    void replyParameter(Parameter parameter);

    //3: signal to Controller for inform about change of parameter
    void updateParameter(Parameter parameter);
};

我觉得这个命名很难看而且不清楚

周末过后连我自己都不知道在做什么

你看到我需要在每行前面加上注释来解释功能的含义了吗?

这里还有什么名字更清楚?

编辑:

目前我是这样解决的:

class ICommunicationAdapter : public IThreadObject
{
    Q_OBJECT

public slots:
    void setParameter(Parameter parameter);

    void getParameter(Parameter parameter);

    void subscribeParameter(Parameter parameter);

signals:
    void forwardParameter(Parameter parameter);

    void requestParameter(Parameter parameter);
};

欢迎任何feedback/comments

您可以定义您和您的同事可以遵循的语法,以便更快、更一致地识别信号槽

像这样(举个例子)

为插槽使用前缀“ON”+ class名称+“完美动词”..

所以如果你有一个点 class 并且你想要一个槽,当它改变它的 x,y 值时 那么插槽看起来像

"On_Point_Changed"

如果单击按钮:

"On_MyButton_Clicked"

如果机器人被摧毁:

"On_Robot_Destroyed"

"On_CommunicationAdapter_Replied"

等等等等

我认为,插槽应始终以 它的作用 命名 - 而不是你触发它的方式。信号也是如此,它们应该用过去时命名,说明发生了什么。这是 Qt 在其所有 classes 中使用的通用方案,因此为了保持一致性,这样做是有意义的。

对于适配器 class,最好使用与适配器将调用的函数相同或相似的名称。但这是非常具体的,需要征求意见。

从逻辑的角度来看,适配器不应该真正关心谁调用它的函数,因为这可能会改变。说明调用该函数的效果对用户来说更有趣。

所以在你的情况下,我几乎会翻转你的信号和槽的名称。 parameterReceived() 应该(读作:“可能”)是您的控制器发出的信号。因此,命令链示例如下所示:

Controller::parameterRecieved() -> Adapter::sendParameter() -emits-> Adapter::parameterReceived() -> Device::sendParameter()

这样您将保持通常的事件模式 -> 动作。