我试图根据需要详细描述我正在构建的应用程序,所以我提前为这篇文章道歉!
我正在使用C ++ Juce框架设计和构建一个相当大的音乐应用程序,简而言之就是接收OSC消息并将它们转换为音频和MIDI数据。该应用程序有三个“模式”,每个模式定义OSC消息将产生什么样的声音。用户可以应用模式和另一组模式设置来定义每个OSC消息“触发”的声音。
下面是程序的类关系和层次结构的基本框图概述,或者至少是我理论上想象它的方式。为了阐明Juce术语,“Component”类基本上是一个GUI对象/类,它在屏幕上显示内容并允许用户交互。
Basic block diagram 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设计模式,这似乎是我正在寻找的,但我得到的印象是我应该避免它,如果我可以考虑其他方法。
是否应该是侦听OSC消息的Main
类?如何让SubComponent2接收OSC消息以及Mode1,Mode2和Mode3类实例?
是否应从Main调用功能类(Mode1,Mode2和Mode3)?我正在努力保持所有功能和GUI代码分离,因为我正在处理GUI编程,而我正在处理应用程序的功能编程。
有人能发现我的节目设计模式中的任何重大缺陷吗?
非常感谢任何帮助!
由于
答案 0 :(得分:1)
关于“主要”的问题:您不应将“应用程序启动”与同一类/组件(“separation of concerns”)中的消息处理责任混合在一起。您所描述的内容有点像发布者/订阅者模式的应用
http://en.wikipedia.org/wiki/Publish/subscribe
如果你想让你的架构真正面向消息,那么并非所有东西都依赖于“Main”,而“Main”并不依赖于所有东西,我建议你看看“Flow Design”。看这里
当您在程序中几乎无处不在时需要这些设置时,将设置类实例实现为单例是可以的。至少它比静态类更容易测试。但是你应该避免在那里放太多东西,因为很多东西可能取决于设置,这可能会对以后的可维护性产生负面影响。