我为自己设定了实现实时MIDI应用程序的任务。就像我迄今为止所写的所有其他软件一样,我从编码开始。我实现了一个小型GUI(GTK2)应用程序,可以控制Jack Audio Connection Kit及其客户端的传输状态。
我之前从未编写过实时应用程序,并且只编写过一个多线程程序。这两个细节结合起来对我来说是一个巨大的挑战,因为我迄今为止所写的所有软件都没有要求我先设计它。我偶尔只需要一支笔和纸来解决问题。
但是,这个项目不会让我继续编码。但我对软件设计几乎一无所知,我自学成才(在20世纪90年代中期打折了2年的计算机研究课程)。我一直在逐步工作,让工作变得有效,然后继续发展。
在我的研究过程中,我遇到了模型视图控制器模式,但我发现很难不去思考细节,并且找不到任何基础来构建,而不会发现导致它全部崩溃的问题。
我需要建议才能超越这个区块。我需要停止找到分散注意力的东西,这会让我失去思路。这是分心之一。我如何通过这个街区?
答案 0 :(得分:3)
从广义上讲,“软件设计”是指在一系列模块中分解当前问题的过程,并指定每个模块的责任,以及每个模块应如何与其他模块通信(如果在全部)。
有多种方法可以继续此活动。考虑到这将是你的第一次尝试,尽量保持简单:抓一些纸和笔。
第一步:记下新应用程序必须能够执行的任务列表。 在此之后尝试将您认为属于逻辑上的不同集合中的任务分组。
对于每个子集,找到一个名称,将其写在空白表(一个用于子集)上,并更详细地描述该模块的作用,包括它应该处理和/或与其他人交换的数据类型。这些都是“模块设计论文”
在另一张空白纸上为每个子集绘制一个框,用正确的名称标记它,然后尝试从一个框到另一个框绘制箭头,每个箭头都应该有一个名称,并代表一个模块调用另一个。我们称之为您的模块“界面设计论文”。
仔细检查您的模块描述及其应提供给其他模块的接口,看看是否需要更改原始任务列表以及这会如何影响他们管理的数据。
如果模块看起来太复杂/太大,可以迭代细分。如果您在子模块中拆分模块,只需绘制另一个界面设计文件,并记住子模块的总和应该能够执行您最初为模块设想的所有任务,并能够回答其余部分的请求。系统。
有关详细信息,另请参阅CRC cards。
答案 1 :(得分:3)
为这个问题编写的答案很棒,但没有一个提到实时软件开发中最独特的部分:实时技术要求。
您需要确切了解软件需要的响应速度,可能占用的内存占用量,启动速度以及可执行文件的大小。如果您使用普通PC,内存要求可能对您来说并不重要,但无论您的目标平台是什么,运行时速度要求都将非常重要。
如果您的高级技术要求“足够好以至于用户满意”,那么您只需要担心低级技术要求 - 基本上,您的目标计算机,目标操作系统和您的第三方库可以处理。
听起来你已经写过一些低级代码了。我建议编写其余的硬件/操作系统/库接口代码并为每个部分计算时间,包括错误条件和快乐路径。这将使您更好地了解代码应如何处理其每个接口。 (例如:此实用程序调用的超时足以让我的应用程序恢复!我最好在我调用它之前看看是否可以缩短超时或进行更好的错误检查!)
最后,大多数实时软件被编写为循环,如下所示:
while( program_running )
{
// This period needs to be long enough for you to do your work
// but short enough that your user doesn't think your program
// is choppy. Anything better than 50 Hz is usually good enough
// for an application with a human interface.
wait_for_short_period()
check_interfaces_for_new_data()
update_model() // or state machine
update_outbound_interface() // the speaker, monitor, whatever
}
这有变化(定期回调而不是等待),但这是一般的想法。
答案 2 :(得分:0)
一种方法是与熟悉designpattern和设计软件的人讨论您的要求并非常粗略地设计出一个设计。在此过程中,您可以讨论应用的设计模式的概念。