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

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

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

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

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

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


当前回答

我用于初始设计(得到类图)的步骤是:

Requirements gathering. Talk to the client and factor out the use cases to define what functionality the software should have. Compose a narrative of the individual use cases. Go through the narrative and highlight nouns (person, place, thing), as candidate classes and verbs (actions), as methods / behaviors. Discard duplicate nouns and factor out common functionality. Create a class diagram. If you're a Java developer, NetBeans 6.7 from Sun has a UML module that allows for diagramming as well as round-trip engineering and it's FREE. Eclipse (an open source Java IDE), also has a modeling framework, but I have no experience with it. You may also want to try out ArgoUML, an open source tool. Apply OOD principles to organize your classes (factor out common functionality, build hierarchies, etc.)

其他回答

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

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

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

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

首先,设计应该来自你的灵魂。你必须用每一根纤维去感受它。在我开始做任何事情之前,我通常会走两三个月,只是在街上走(真的)。和思考。你知道,散步是一种很好的冥想。所以它能让你更好地集中注意力。

其次,只在存在自然对象层次结构的地方使用OOP和类。不要人为地把它“拧”进去。如果没有严格的层次结构存在(就像在大多数业务应用程序中一样)-选择过程式/函数式,或者至少只将对象用作具有隔离访问器的数据容器。

最后一本——试着读一下:《创造性思维的算法》

学习和掌握设计模式。 接下来,学习领域驱动设计 之后,学习需求收集

我上了几个学期的OOD课程 回来后,我学到了很多;就像 编写UML和翻译 将需求文档转换为对象 和类。我们学过序列 图表也有,但不知怎么的,我错过了 讲座之类的,他们没有 跟紧我。

You know about the step 3. You need to master it. I mean, via a lot of practice to make it become your second nature. That's because the method you learn, is simply against the way we used to have. So you need to really master it. Otherwise, you will always find yourself go back to your original way of doing thing. This is somehow like Test Driven Process, where a lot of java developer give it up after a few tries. Unless they fully master it, otherwise it's just a burden to them Write use cases, especially for alternate course. Alternate course occupy more than 50% of our development time. Normally when your PM assign you a task, for instance, create a login system, he will think it's straight forward, you can take 1 day to finish it off. But he never take into account that you need to consider, 1. what if user key in wrong password, 2. what if user key in wrong password for 3 times, 3. what if user doesn't type in user name and etc. You need to list them out, and show it to your PM, ask him to reschedule the deadline.

一个有用的技巧是将你独特的问题描述与你在现实世界中可以找到的东西联系起来。例如,你正在为一个将席卷全球的复杂医疗保健系统建模。有什么例子你可以随时调用建模吗?

确实。观察旁边的药房是如何运作的,或者医生的房间。

把你的领域问题归结为你能理解的问题;一些你能联想到的东西。

然后,一旦领域内的“玩家”开始出现,你开始对你的代码建模,选择“提供者-消费者”建模方法,即你的代码是模型的“提供者”,而你是“消费者”。

与领域相关并在较高层次上理解它是任何设计的关键部分。

如果你对你要从事的项目有专业知识,比如银行业。你可以很容易地构建你的对象,而且你知道每隔一天就会有这些增强。

如果你没有这方面的专业知识,那就和有这方面专业知识的人合作,把这些想法转化为技术细节。

如果你对如何组织你的项目设计感到困惑。盲目地遵循“实用的程序员”这本书。我以前也遇到过同样的情况,试着读那本书的一章。它会改变你作为软件开发人员的思维方式。