【问题标题】:Clear naming for Signal and Slots in QT [closed]QT中信号和插槽的清晰命名[关闭]
【发布时间】:2020-10-26 10:34:57
【问题描述】:

我很难在我的一堂课中为信号和插槽给出清晰的名称

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);
};

我发现这个命名丑陋且不清楚

即使我也很难意识到周末之后在做什么

你明白我需要在每一行前面加上 cmets 来解释函数的含义吗?

这里还有什么更清晰的名字?

编辑

目前我是这样解决的:

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);
};

欢迎任何反馈/cmets

【问题讨论】:

  • 这纯粹是基于意见。我们无法知道您认为什么是“明确的”。恕我直言,将变量命名为 signal_to_device_for_sending_parameter_request 并不好,但仍比无意义的名称 + 评论好。
  • Clear 对我来说意味着“有人阅读代码,看看它在做什么”。事实上,它是基于意见的,但我想知道是否存在任何“约定”或“最佳实践”?
  • 惯例和最佳实践也是基于意见的 ;)

标签: c++ qt signals-slots


【解决方案1】:

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

对于适配器类,最好使用与适配器将调用的函数相同或相似的名称。但这是非常具体的,并受制于意见。

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

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

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

这样您将保持通常的 Event -> Action 模式。

【讨论】:

  • 简而言之:我在您的提案中看不到我的代码有任何更改。你同意我的命名吗?检查 QT 小部件的名称是一个很好的提示。
  • 变化是,不是将您的插槽命名为“parameterReceived”,而是将其命名为“sendParameter”,反之亦然,因为您告诉适配器发送参数(到设备)和适配器将告诉设备它收到了一个参数(来自控制器)。这与您的命名相反。是的,我想说的是,如果只是为了保持一致性,检查你的库使用的约定总是有用的。
【解决方案2】:

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

像这样(仅举个例子)

对插槽使用前缀“ON”+className+“完美动词”..

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

"On_Point_Changed"

如果一个按钮被点击:

"On_MyButton_Clicked"

如果机器人被摧毁:

"On_Robot_Destroyed"

"On_CommunicationAdapter_Replied"

等等等等

【讨论】:

  • 我也在考虑前缀“On”但没有“_”。所以,更多的 C# 风格。但是信号呢?只是一个动词?
  • 如果您觉得更适合您的 CodeGuidelines,请删除下划线,对于信号,您可以使用规则:“class”+“verb”,如“PointChanged”或“ButtonClicked”等尝试制作名称尽可能有意义... :)
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2015-07-18
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多