【问题标题】:Python -- sanity check on design of programPython——程序设计的健全性检查
【发布时间】:2015-04-15 03:30:12
【问题描述】:

我有一个这样的项目:

User
Interface
Interface Handler
Main
Network Handler
Networks
Elements Handler
Elements

接口是 gui,主要是显而易见的,网络是元素的包装器并定义它​​们的交互,元素是最小的组件。这是一个家庭安全/自动化程序,元素是 ZWave 传感器、Android 手机、灯、电视等,网络将它们包装在 ZWave 或 Lights 或 Stations 等逻辑组中(Android 手机,与 IP 网络摄像头一起使用,将声音推送到他们通过 Soundwire 等)。

这就是问题所在 - 深入到项目中,它变得一团糟。我一直在使用这样的想法,即下面的层不能知道上面的层,但上面的层可以知道下面的 1 层(除了什么都不知道的接口)并且只能与上面的层通信,并且只能通过 pubsub 与抽象消息进行通信可能会感兴趣。往下走,我只是使用对象方法调用、对象属性更改等。我是否正确地接近这个?一旦我开始实现复杂的交互,例如当传感器跳闸并且离开警报处于活动状态时,就会发生很多事情:灯全部亮起,监视器切换到运动检测记录,发送带有快照图片的电子邮件等。这些交互变得混乱,我已经转向紧密耦合的事情。当我尝试松散耦合时,我最终实际上是在创造新的语言,以便所有东西都说同一种语言。

一个核心问题是我有截然不同的元素。 ZWave 通过 OpenZWave 说话,android 电台通过 Zoneminder 和/或 soundwire 说话,灯光通过 http 说话等。我是否正确地接近这个?我应该建模一个更好的通用设计模式吗?谢谢。

【问题讨论】:

  • 我认为这个帖子更适合Code Review;事实上,它对于这个网站来说太宽泛了。

标签: python design-patterns publish-subscribe


【解决方案1】:

您可能想要选择所有元素都可以通过的消息传递协议,例如MQTT。这样,每个元素都可以订阅 MQTT 对话,并在发布与其相关的消息时采取适当的行动。

例如,每个设备可以在状态/# 主题(status/living_room/window_1 -- OK)发生变化时传达其状态。然后系统的其他部分可以订阅状态主题并在发生变化时做出相应的反应,例如 status/living_room/window_1 -- ALARM 或类似的东西。

您还可以设置一个主题,让设备向不使用相同语言的其他设备发出命令。例如,用户从网页输入关闭灯的 command/# 主题可能会发布 command/living_room/light1 -- OFF 并且控制灯的 Zwave 模块可以监听并处理该消息。

查看 MQTT 消息日志是准确了解系统中正在发生什么的好方法,因为它是设备之间的对话,因为它们报告状态并相互交互。

几乎所有平台都支持 MQTT。有 Python、Arduino、PHP、JavaScript、Node.js、C/C++、Java 等客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多