在生命游戏的实现中,我需要处理用户事件,执行一些常规(如定期)处理并绘制到2D画布。细节不是特别重要。我只想说我需要跟踪大量( - )数量的变量。这些是:表示系统状态的结构(活细胞),图形库提供的结构指针,当前缩放级别,原点坐标,我确信其他几个。
在main函数中,有一个像这样的游戏循环:
// Setup stuff
while (!finished) {
while (get_event(&e) != 0) {
if (e.type == KEYBOARD_EVENT) {
switch (e.key.keysym) {
case q:
case x:
// More branching and nesting follows
此刻的最大嵌套级别为5.很快就会变得无法管理且难以阅读,尤其是在小屏幕上。然后解决方案是将其拆分为多个功能。类似的东西:
while (!finished {
while (get_event(&e) !=0) {
handle_event(state, origin_x, origin_y, &canvas, e...) //More parameters
这是问题的症结所在。子程序必须能够访问状态(由原点,画布,活细胞等表示)才能运行。明确地传递它们是容易出错的(子程序期望它们的顺序)并且也很难读取。除此之外,具有潜在10个以上参数的函数对我来说是一个其他设计缺陷的症状。然而,我能想到的替代方案似乎没有任何改善。
总结:
static int origin_x;
)。如果不是因为全球变量通常都是一个糟糕的想法,那么这将是我的首选。 但如果我想在未来显示同一个Game of Life实例的两个视图,那么文件范围看起来不再那么吸引人了。这个问题也适用于我认为稍微更笼统的术语:如何安全地以可读的方式传递复杂程序的状态?
编辑: 我的动机不是速度,效率或性能或类似的东西。如果由于在这里做出的选择,代码需要花费20%的时间来运行,那就好了。我主要对6个月内不太可能混淆我并导致最轻微头痛的事情感兴趣。