输入需要我的程序结构/设计

Input needed for my program structure/design

本文关键字:结构 设计 程序 我的 输入      更新时间:2023-10-16

我已经根据需要详细描述了我正在构建的应用程序,所以我提前为这篇文章道歉!

我正在设计和构建一个相当大的音乐应用程序,使用c++ Juce框架,简而言之,它接受OSC消息并将其转换为音频和MIDI数据。应用程序有三种"模式",每种模式都定义了OSC消息将产生什么样的声音。用户可以应用一个模式和进一步的一堆模式设置来定义每个OSC消息"触发"的声音。

下面是程序的类关系和层次结构的基本框图概述,或者至少是我理论上想象的样子。为了澄清juice的术语,"Component"类基本上是一个GUI对象/类,它在屏幕上显示内容并允许用户交互。

基本框图http://liamlacey.web44.net/images/Software_block_diagram.jpg

我是一个经验丰富的C程序员,但是我对c++和面向对象设计相当陌生。如果它很好,我可以理解大部分,但我遇到的主要问题是在构建所有类以具有正确的关系和层次结构方面,以便它们都可以正确通信,以便应用程序做它需要做的事情。

下面是每个类的功能的简要描述:

  • 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消息工作正常。但它是设置类实例的关系,我不太确定如何实现。以下是我需要帮助的关系:

  • Mode1、Mode2和Mode3的单个实例都需要从Setting类实例中检索值
  • MainComponent、Mode1Component、Mode2Component、Mode3Component的单个实例都需要向Settings类实例发送值,并从实例中检索值。
  • SubComponent2的所有48个实例都需要检索OSC消息

因此我有以下问题:

  • 应该从哪里调用Settings类实例,以便上面提到的所有相关类实例都可以与其通信?我只想要这个类的一个实例,它需要被许多其他类访问,那么它应该是一个全局类、单例类还是静态类呢?我一直在研究单例设计模式,这似乎是我正在寻找的,但我得到的印象是,如果可以的话,我应该避免它,并考虑其他方法。

  • 应该是Main类侦听OSC消息吗?我怎样才能得到SubComponent2接收OSC消息以及Mode1, Mode2和Mode3类实例?

  • 应该从Main调用功能类(Mode1, Mode2和Mode3)吗?我试图保持所有的功能和GUI代码分开,因为我有其他人处理GUI编程,而我正在处理应用程序的功能编程。

  • 有人能发现我的程序设计模式中的主要缺陷吗?

任何帮助都将非常感激!

谢谢

关于你关于"Main"的问题:你不应该将"应用程序启动"与同一类/组件中的消息处理责任混合在一起("关注点分离")。您所描述的内容闻起来像是发布者/订阅者模式的应用程序

http://en.wikipedia.org/wiki/Publish/subscribe

如果你想让你的架构真正面向消息,不是所有的东西都依赖于"主","主"也不依赖于所有的东西,我建议你看看"流设计"。看

http://geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/flow-design-cheat-sheet-ndash-part-i-notation.aspx

http://geekswithblogs.net/theArchitectsNapkin/archive/2011/03/20/flow-design-cheat-sheet-ndash-part-ii-translation.aspx

当你在程序中几乎所有地方都需要这些设置时,将设置类实例实现为单例是可以的。至少它比静态类更易于测试。但是您应该避免在那里放置太多的东西,因为很多东西可能取决于设置,这可能会对以后的可维护性产生负面影响。