我对一般方法感兴趣,而不是特定的库或框架。
我尽量避免使用意大利面条代码式的条件。可能是我以完全错误的方式思考这些应用程序,但我似乎无法在网上找到任何有用的东西。
当存在多种相互影响的状态时,就会出现问题。这是一个例子:
想象一个具有以下能力的人:
走。跑。坐。
我用 Walk.execute()、Run.execute() 和 Sit.execute() 创建了一个命令模式。这些命令由用户输入或其他触发。当然,这样做的好处在于,如果需要对运行进行调试或修改,很容易知道在代码库中的何处查找。
现在我被要求添加一只狗。狗可以...
走。跑。睡觉。
如果一个人在走路而狗在跑,那么狗(用皮带拴着)跑得比他自己跑时慢。如果狗在睡觉,这个人会比平时坐的时间更长。换句话说,狗和人是相互影响的。
然后我被要求添加一个装有食物的冰箱。冰箱会影响狗和人,因为他们吃的量会影响他们跑步的能量等。
我不断被要求调整这个系统。“请让狗多睡一会儿,但前提是他和那个人一直在走路,冰箱几乎是空的。” 然后,后来:“请改变它,使人跑的量对狗的睡眠没有影响。”
我想避免用大量的条件来包装 DogSleep,我也想避免 DogSleepIfDogAndManHaveBeenWalkingAndFridgeIsAlmostEmpty。那是不可扩展的。
在任何时候,我们都可能想将冰箱从系统中取出。或者我们可能想以一些基本或微妙的方式改变它。
一个更真实的例子是媒体播放器,它可以显示为紧凑型播放器、扩展播放器(比如占据一半屏幕的播放器)和全屏播放器。所以有这三种屏幕状态。
同时,播放器可能正在显示图像、视频或文本。
如果它正在显示视频,则该视频可能正在播放、暂停、完成等。
视频的状态会影响不同屏幕状态的呈现方式。媒体的类型也会影响渲染。屏幕状态会影响其他对象(例如,无论出于何种原因,您应该能够在播放器紧凑时暂停视频,但在展开或全屏时不能暂停视频)。
当这些交互很复杂并且在两个(或多个)方向上流动时,使多个状态系统相互交互的最佳方式是什么?如何组织这样的代码,使其最容易调试和扩展?