完成与稳定的软件设计?


17

几乎没有足够的时间来完成我们制作的游戏,那么如何在坚实的软件体系结构和取得良好进展的所有过程之间取得平衡?

我的个人挑战:如何在今天有效并同时进行长期思考?另外,在执行此操作时,您可能还想在此途中学习新事物,而不是诉诸过去五年来一直使用的相同重复模式?

Answers:


20

经验越少,前期设计就会浪费更多的时间。做好设计是您将要学习的东西,方法是先做一下,然后查看/评估结果。有些决定具有深远的影响,但含糊不清。经过一些游戏后,您可能可以使初始设计变得更加扎实,并且可以花更多的时间来投入此阶段。

我的座右铭:首先完成任务,但要利用常识来检测哪些组件比其他组件更关键,并在您的时限内很好地设计这些组件。例如,如果AI对您的游戏至关重要,请确保以后可以轻松扩展/更改AI。或者,如果您要编写将在每个游戏中使用的组件,请对其进行设计以实现可重用性。跟踪您的时间,不要疯狂地进行设计。设置设计截止日期,然后,开始破解所有内容以获取发布截止日期。但是请确保您记下了哪些点需要事后重构/重新设计,并在开始下一场游戏之前的一段时间内进行计算以改善这些问题,以免它们被您所困扰。

一个好的建议:如果您必须在两个选项之间进行选择,请不要在细节上停留太久。大多数情况下,没有“好”或“坏”。在某些情况下,A会更好,而在某些情况下,B会更好,总的来说,两者之间的差异可能并不总是值得的。

在设计软件或游戏时会获得很多经验,因此请确保您将一些时间花在研究上(例如,读一本关于设计的书,阅读其他人的经验,与其他程序员讨论您的设计等)。 )。


7
+1,很好的建议。不要让自己陷入臭名昭著的“分析瘫痪”,因为这无济于事。重构是理清过去缺陷的强大工具,因此不要害怕犯错误。
Michael Klement

1
分析瘫痪。我最大的敌人!我应该构建一个将“ 分析瘫痪”作为最终老板的游戏。我最好首先设计游戏体系结构开个玩笑:好的答案和好的评论!
bummzack 2010年

12

人们很难预测未来。对于要求每天都会变化的游戏而言,尤其如此。

有一个称为YAGNI的原则,也就是“您将不需要它”,它基本上说您不应该执行某些事情,除非您知道自己将需要它。

我已经看到太多的系统陷入僵化的架构僵化之中,实际上并没有真正使用它,因为人们认为自己需要的功能永远不会被使用。

我的个人理念是“ 做可能可行的最简单的事情”。话虽这么说,“完成它”和“一起砍屎”之间是有区别的。有目的的编写代码并不意味着要进行会产生“代码味道”的事情,例如将所有内容公开,让blob类执行所有操作,或者其他数十种表示“不良”代码的事情。


8

在我今天的心态中,这是正确的:

  • 意识形态的实用主义
  • (1)使其生效(2)然后使其正确-如果您忘了第2步,请结束游戏
  • 放开它!
  • 过多的前期设计将浪费时间
  • TDDClean Code导致更简单,更稳定的软件设计

您能详细说明在游戏环境中进行测试驱动的开发吗?除了一些基本的逻辑,我从未发现高度交互式的程序非常适合这种情况。此外,您还链接到歧义消除页面;)
drxzcl 2010年

2
@Ranieri如果在与图形硬件和用户输入接口的零件之间划一条线,则测试非常简单。
乔纳森·费斯霍夫

@Ranier谢谢,修复了链接。我同意,为交互式仿真或客户端服务器游戏首先提出测试可能会很棘手。除了单元测试之外,您可能还希望进行一些更高级别的功能测试,以及可能以一定间隔运行的回放会话。无论如何,在许多情况下,首先考虑测试很可能会有所收获。在gamedev.stackexchange.com/questions/1905/…中
jmp97

5

我是软件快速原型设计的朋友。特别是在游戏开发期间。对于快速学习,测试和使用事物非常有用。对于接近硬件的编程或复杂的算法,对我来说是最好的方法。

Theory();
RapidPrototype();
bool bOk = false;
while(!bOk)
{
 Testing();
 LotOfFixing();
 PlayingWith(); 
 bOk= AnalysingResults();
}
FinalFastAndNiceDataStructuresAndCode();

我的Rapid Prototype版本必须具有适当的原型外壳:

  • 最大友好的输入界面,用于配置指令和设置变量或数据。
  • 稳定的异常和错误处理。
  • 像调试器功能一样在线,但在级别上您需要什么。
  • 最大友好的输出界面,用于以所有可能和必要的方式显示或捕获结果。

优点:

  • 您可以在整个开发过程中改善RapidPrototype外壳。
  • 您可以通过多种方式查看和设置代码。
  • 您只能专注于理论和需要解决的问题。
  • 您可以快速开发项目的任何新部分,并在其余的最后部分中进行尝试。
  • 您可以交付新内容,以更快地用于内容填充,并在以后完成(特别是在沙盒中)
  • 您可以轻松地向其他人描述和显示原则或解决方案。线上。
  • 功能和透明的原型是最终代码的最佳信息来源(其他任何人都可以做到)。

如果做得好,最后可以得到产品的实际调试/学习版本。
我们正在项目中使用它,对此我们感到满意。


1
这是一个很好的建议,尽管我会建议在循环上绑定一段时间或其他类型的资源,然后退出(0)并尝试另一个原型。

@Joe Wreschnig-时间计划可以包含在AnalysingResults()中,但是我认为您可以使用RapidPrototype一段时间,稍后再完成或放入计划中。更好的是永远坚持下去:)。在RapidPrototype中,您也可以模拟功能。它在许多方面都很有用。
samboush

1

看一下敏捷软件开发。尽管这不是灵丹妙药,但它的目标是做到这两者(完成具有可靠的软件设计)。


2
我认为没有任何开发方法可以声称“完成并拥有可靠的软件设计人员”。

@Joe我认为许多“重量级”方法都倾向于使用CYA而不是可靠的软件。确实,我的许多非敏捷经验都倾向于“它不需要正确,它必须现在就正确”,而“敏捷”旨在说“它必须现在就正确,但是您要做的所有事情”可以随时随地制作东西。”
dash-tom-bang 2010年

我认为敏捷开发对代码是否可靠没有什么影响。敏捷的本质是将所有开发时间都花在重要的事情上。代码交付时仍然很混乱,因为代码质量(或缺乏技术债务)很少衡量交付成功与否。
Magnus Wolffelt,2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.