0

我对一般方法感兴趣,而不是特定的库或框架。

我尽量避免使用意大利面条代码式的条件。可能是我以完全错误的方式思考这些应用程序,但我似乎无法在网上找到任何有用的东西。

当存在多种相互影响的状态时,就会出现问题。这是一个例子:

想象一个具有以下能力的人:

走。跑。坐。

我用 Walk.execute()、Run.execute() 和 Sit.execute() 创建了一个命令模式。这些命令由用户输入或其他触发。当然,这样做的好处在于,如果需要对运行进行调试或修改,很容易知道在代码库中的何处查找。

现在我被要求添加一只狗。狗可以...

走。跑。睡觉。

如果一个人在走路而狗在跑,那么狗(用皮带拴着)跑得比他自己跑时慢。如果狗在睡觉,这个人会比平时坐的时间更长。换句话说,狗和人是相互影响的。

然后我被要求添加一个装有食物的冰箱。冰箱会影响狗和人,因为他们吃的量会影响他们跑步的能量等。

我不断被要求调整这个系统。“请让狗多睡一会儿,但前提是他和那个人一直在走路,冰箱几乎是空的。” 然后,后来:“请改变它,使人跑的量对狗的睡眠没有影响。”

我想避免用大量的条件来包装 DogSleep,我也想避免 DogSleepIfDogAndManHaveBeenWalkingAndFridgeIsAlmostEmpty。那是不可扩展的。

在任何时候,我们都可能想将冰箱从系统中取出。或者我们可能想以一些基本或微妙的方式改变它。

一个更真实的例子是媒体播放器,它可以显示为紧凑型播放器、扩展播放器(比如占据一半屏幕的播放器)和全屏播放器。所以有这三种屏幕状态。

同时,播放器可能正在显示图像、视频或文本。

如果它正在显示视频,则该视频可能正在播放、暂停、完成等。

视频的状态会影响不同屏幕状态的呈现方式。媒体的类型也会影响渲染。屏幕状态会影响其他对象(例如,无论出于何种原因,您应该能够在播放器紧凑时暂停视频,但在展开或全屏时不能暂停视频)。

当这些交互很复杂并且在两个(或多个)方向上流动时,使多个状态系统相互交互的最佳方式是什么?如何组织这样的代码,使其最容易调试和扩展?

4

1 回答 1

0

在复杂系统中管理复杂性的主要方法是在现实世界中找到类比和概念,您可以以此为基础进行设计实现。因此,当您谈论在某些系统中交互的人、狗和冰箱时,您的交互方法基于这些条目在现实世界中的交互方式——这在很大程度上是基于感知的输入和内部兴趣/目标/需求的自主性。当您谈论媒体播放器、图像和文本时,找到类比更加困难,但同样重要。

于 2012-04-17T05:54:17.997 回答