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

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

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

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

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

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


当前回答

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

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

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

其他回答

大型项目的问题在于您无法监督组件之间的所有交互。因此,降低项目的复杂性是很重要的。类图和序列图对于这个设计阶段来说太详细了。

首先试着从更高的抽象层次来思考。考虑主要组件及其职责(它们与其他组件的接口),查看一些架构模式以获得灵感(不,不是设计模式,这些太低级了!MVC和多层是架构模式的例子)。 对于相当大的项目,这样的视图应该有大约3-5个组件。

只有这样,你才能放大到某个组件,并尝试设计它。现在我们到了设计模式和类图的层次。试着把注意力集中在项目的这一部分,如果你发现你需要向其他组件之一添加一个职责,就把它添加到你的文档/待办事项列表中。不要在这个时候浪费时间思考它们的含义,因为它们的变化太快了,当设计更加可靠时再进行检查。

此时您不需要完整地设计每个组件,尽管使用一段代码来实现未实现的组件接口并生成简单但有用的响应可能是明智的。这样,您就可以一次开始开发(和设计)一个组件,并对其进行合理的测试。

当然,当新组件完成后,您应该在继续之前测试它们如何(以及是否)相互集成。

简而言之: 采用面向对象和信息隐藏原理,并将其提升到另一个层次!


PS: 在设计的时候画很多草图,就像真正的建筑一样!

PPS:试着从不同的角度来看待这个问题,跳出固有的思维模式(尽管固有的思维模式可能是正确的),与同行讨论可能会非常有用……午餐时你们有话可聊。

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

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

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

只是引用http://www.fysh.org/~katie/computing/methodologies.txt

并且RUP的核心是一个您必须使用面向对象设计的小区域 人才……如果你没有它们,就像有一个方法论 100米跑。

“第一步:写关于快跑的故事。 第二步:画一张赛马场平面图。 第三步:去买紧身的莱卡短裤。 第四步:跑得非常、非常、非常快。 第五步:先跨线

第四步才是最难的。但如果你特别强调 在第1 2 3 5次,有可能没有人会注意到,然后你就可以 卖这个方法可能会赚很多钱 那些认为成为百米运动员有什么“秘密”的运动员

我建议你使用BlueJ和ActiveWriter来学习和发展对对象的良好理解。推荐的书也是很好的资源。

从维基百科:

(来源:bluej.org)

BlueJ是一个综合开发项目 Java编程环境 语言,主要是为了 教育的目的,也是 适用于小规模软件 发展。

此外,它使用UML,对我来说,这是一个很好的资源来理解建模对象的一些事情。

可选文字 http://www.ryanknu.com/ryan/bluej.png

ActiveWriter是一个建模实体和关系的工具,它还可以生成代码,并且很容易进行更改。它将节省您的时间,并且对于敏捷开发非常适合。

(来源:altinoren.com)

尝试使用行为驱动开发。要打破你的旧习惯很难,但我发现BDD确实是你在现实世界中开发的最佳选择。

http://behaviour-driven.org/