我正在处理一个大型项目(对我来说),它将有许多类,需要可扩展,但我不确定如何规划我的程序以及类需要如何交互。

几个学期前我上了一门OOD课程,从中学到了很多东西;比如编写UML,并将需求文档转换为对象和类。我们也学过序列图但不知怎么的我错过了这节课,我没能记住它们。

在之前的项目中,我尝试使用从课程中学到的方法,但通常在我说“是的,这看起来像我想要的东西”时,我就会以代码结束,我不想再挖掘出新的功能。

我有一本Steve McConnell的《Code Complete》,我经常在这里和其他地方听到它的神奇之处。我读了关于设计的章节,似乎没有得到我想要的信息。我知道他说这不是一个固定的过程,它主要是基于启发式,但我似乎不能把他所有的信息都应用到我的项目中。

那么,在高级设计阶段(在开始编程之前),你要做些什么来确定你需要什么类(特别是那些不基于任何“现实世界对象”的类)以及它们如何相互交互?

我特别感兴趣的是你使用的方法是什么?你遵循什么样的过程,通常会产生一个良好的,干净的设计,将接近最终产品?


当前回答

我在实际项目中使用的成功的技术是责任驱动设计,灵感来自Wirfs-Brock的书。

从最顶层的用户故事开始,与同事一起,在白板上勾勒出它们所暗示的高级交互。这让你对大模块有了初步的了解;重复一两次高级CRC-card(游戏邦注:如play),你应该已经稳定了一个主要组件列表,它们的作用以及它们如何相互作用。

然后,如果任何职责很大或很复杂,那么细化这些模块,直到有足够小且简单的东西成为对象,方法是在模块内执行由更高级别交互确定的每个主要操作的交互。

知道什么时候该停下来是一个判断问题(只有经验才能决定)。

其他回答

它经常被重复,但完全正确——理解你的数据。

对于面向对象编程,你的类应该描述重要的信息片段以及它们如何交互。

如果您有一个心智模型,它很好地描述了数据的行为和生命周期,那么您将很容易布局您的类。

这句话其实是“确切地知道你要做什么”的延伸。

我在实际项目中使用的成功的技术是责任驱动设计,灵感来自Wirfs-Brock的书。

从最顶层的用户故事开始,与同事一起,在白板上勾勒出它们所暗示的高级交互。这让你对大模块有了初步的了解;重复一两次高级CRC-card(游戏邦注:如play),你应该已经稳定了一个主要组件列表,它们的作用以及它们如何相互作用。

然后,如果任何职责很大或很复杂,那么细化这些模块,直到有足够小且简单的东西成为对象,方法是在模块内执行由更高级别交互确定的每个主要操作的交互。

知道什么时候该停下来是一个判断问题(只有经验才能决定)。

During my adventures of designing class structures, I’ve noticed that it’s very helpful to start with writing some pseudo-code. That means: I start with “writing” some general fragments of application’s code on a highest level, play with it, and discover the elements that are appearing – in fact, the elements that I – as a programmer – would like to use. It’s a very good starting point for designing general structure of modules and their interactions. After few iterations the whole structure starts to look more like a full system of classes. It’s a very flexible way to design parts of code. You can call it a programmer-oriented design.

关于这一点,我所知道的最有趣的来源是Bertrand Meyer所著的《面向对象软件构建》第二版的D部分。

第四部分:面向对象的方法论:很好地应用该方法

19:关于方法论, 20:设计 模式:多面板交互 系统中, 21:传承案例研究: 交互系统中的“undo”,22: 如何找到课程,23: 课程设计原则,24:使用 继承好,25:有用 技巧,26分:风格感,27分: 面向对象分析,28:The 软件构建过程,29: 教学方法

有趣的是,第22章。如何在网上找到课程。

你问了一个很多作家用来写书的问题。有很多方法,你应该选择一个对你来说“最漂亮”的。 我可以推荐Eric Evans写的《Domain Driven Design》。另外,查看dddcommunity.org网站。