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

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

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

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

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

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


当前回答

老实说,最好是回头看看流程图和序列图。有大量的好网站告诉你如何做到这一点。当我考虑如何将程序分解为类时,我发现这是非常宝贵的,因为我确切地知道程序需要输入、计算和输出什么,并且每一步都可以分解为程序的一个部分。

其他回答

在你要写的软件设计中,你遵循的工作流程是什么?

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

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

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

设计模式

创造性设计模式

单例——确保只创建类的一个实例,并提供对象的全局访问点。

Factory(Factory Method的简化版)—创建对象时不向客户端公开实例化逻辑,并通过公共接口引用新创建的对象。

Factory方法——定义一个用于创建对象的接口,但是让子类来决定实例化哪个类,并通过公共接口引用新创建的对象。

抽象工厂——提供了创建一系列相关对象的接口,而无需显式地指定它们的类。

Builder -定义一个创建对象的实例,但让子类决定实例化哪个类,并允许对构造过程进行更精细的控制。

Prototype—指定使用原型实例创建的对象类型,并通过复制该原型创建新对象。

行为设计模式

责任链——它避免了将请求的发送方附加到它的接收方,从而使其他对象也可以处理请求。 -对象成为链的一部分,请求通过链从一个对象发送到另一个对象,直到其中一个对象处理它。

命令-将请求封装在对象中,允许对不同请求的客户端进行参数化,并允许将请求保存在队列中。

解释器——给定一种语言,为其语法定义一个表示法,并定义一个解释器,使用该表示法解释该语言中的句子/将域映射到语言,将语言映射到语法,将语法映射到分层面向对象的设计

迭代器——提供一种方法,可以按顺序访问聚合对象的元素,而不暴露其底层表示。

中介——定义一个对象,它封装一组对象如何交互。Mediator通过防止对象显式地相互引用来促进松耦合,并且允许您独立地改变它们的交互。

观察者——在对象之间定义一对多的依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会被自动通知和更新。

策略——定义一组算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户机而变化。

模板方法——在一个操作中定义一个算法的框架,将一些步骤推迟到子类/模板方法让子类重新定义算法的某些步骤,而不让它们改变算法的结构。

Visitor -表示要在对象结构的元素上执行的操作/ Visitor允许您定义一个新操作,而无需更改其操作的元素的类。

空对象——提供一个对象作为缺少给定类型对象的代理。/空对象模式提供了智能的无为行为,对合作者隐藏了细节。

结构设计模式

适配器——将一个类的接口转换成客户端期望的另一个接口。/ Adapter允许类一起工作,否则由于不兼容的接口而无法一起工作。

桥接——将对象组合成树形结构来表示部分-整体层次结构。/ Composite允许客户端统一地处理单个对象和对象的组合。

复合——将对象组合成树状结构来表示部分-整体层次结构。/ Composite允许客户端统一地处理单个对象和对象的组合。

装饰器——动态地向对象添加额外的职责。

Flyweight——使用共享来支持大量的对象,这些对象的部分内部状态是相同的,而另一部分状态可能是不同的。

记忆碎片——在不违反封装的情况下捕获对象的内部状态,从而提供了在需要时将对象恢复到初始状态的方法。

代理——为对象提供一个“占位符”来控制对它的引用。

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

从维基百科:

(来源:bluej.org)

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

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

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

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

(来源:altinoren.com)

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.