Lia*_*cey 8 c++ design-patterns structure osc
我试图根据需要详细描述我正在构建的应用程序,所以我提前为这篇文章道歉!
我正在使用C++ Juce框架设计和构建一个相当大的音乐应用程序,简而言之就是接收OSC消息并将它们转换为音频和MIDI数据.该应用程序有三个"模式",每个模式定义OSC消息将产生什么样的声音.用户可以应用模式和另一组模式设置来定义每个OSC消息"触发"的声音.
下面是程序的类关系和层次结构的基本框图概述,或者至少是我在理论上想象它的方式.为了阐明Juce术语,"Component"类基本上是一个GUI对象/类,它在屏幕上显示内容并允许用户交互.
基本框图http://liamlacey.web44.net/images/Software_block_diagram.jpg
我是一位经验丰富的C程序员,但我对C++和OOP设计还不熟悉.我最了解它是否很好,但我遇到的主要问题是在构造所有类以获得正确的关系和层次结构方面,以便它们都可以正常通信,以便应用程序执行它需要做的事情.
以下是每个课程的简要说明:
OscInput - 此基类使用oscpack库来侦听OSC消息.只有一个类可以从此基类继承,因为如果同一UDP端口上有多个侦听器,应用程序将崩溃.
Main - 申请启动.从OscInput继承,以便每次收到OSC消息时,都会在此类中调用回调函数
MainWindow - 应用程序主文档窗口 - 默认为Juce应用程序.
MainComponent - 应用程序的主要/后台组件/ GUI - 默认为Juce应用程序.
Mode1Component/ Mode2Component/ Mode3Component-每个组件类的单个实例被调用并从MainComponent其用于由用户改变的每个OSC消息做什么的设置显示.
SubComponent1 - 从MainComponent调用并显示此组件类的单个实例.
SubComponent2 - 从SubComponent1调用并显示此组件类的48个实例.每个实例用于显示正在接收的不同OSC消息的值.
Mode1/Mode2/Mode3 - 从Main调用每个类的单个实例.每个类用于根据Settings类中的值/变量将OSC消息实际转换为音频或MIDI数据.
Settings - 此类的单个实例,用于存储控制从每个不同OSC消息生成的声音的设置.
我很高兴我将所有组件/ GUI类布局并以正确的方式连接.我也收到了传入的OSC消息.但是我不太确定如何实现Settings类实例的关系.以下是我需要帮助的关系:
因此,我有以下问题:
应该Settings从哪里调用类实例,以便上面提到的所有相关类实例都能与之通信?我只想要这个类的单个实例需要被许多其他类访问,所以它应该是全局,单例还是静态类?我一直在研究Singleton设计模式,这似乎是我正在寻找的,但我得到的印象是我应该避免它,如果我可以考虑替代方法.
它应该Main是侦听OSC消息的类吗?如何让SubComponent2接收OSC消息以及Mode1,Mode2和Mode3类实例?
是否应该从Main调用功能类(Mode1,Mode2和Mode3)?我正在努力保持所有功能和GUI代码分离,因为我正在处理GUI编程,而我正在处理应用程序的功能编程.
任何人都可以发现我的程序设计模式中的任何重大缺陷吗?
任何帮助将不胜感激!
谢谢
关于您对“Main”的问题:您不应该将“应用程序启动”与同一类/组件中的消息处理职责混合在一起(“关注点分离”)。您所描述的内容听起来像是发布者/订阅者模式的应用程序
http://en.wikipedia.org/wiki/Publish/subscribe
如果你想让你的架构真正面向消息,而不是一切都依赖于“Main”,而“Main”也不依赖于一切,我建议你看看“Flow Design”。看这里
当您在程序中几乎所有地方都需要这些设置时,将设置类实例实现为单例是可以的。至少它比静态类具有更好的可测试性。但你应该避免在那里放太多东西,因为很多东西可能取决于设置,这可能会对以后的可维护性产生负面影响。