我正在处理一个大型项目(对我来说),它将有许多类,需要可扩展,但我不确定如何规划我的程序以及类需要如何交互。
几个学期前我上了一门OOD课程,从中学到了很多东西;比如编写UML,并将需求文档转换为对象和类。我们也学过序列图但不知怎么的我错过了这节课,我没能记住它们。
在之前的项目中,我尝试使用从课程中学到的方法,但通常在我说“是的,这看起来像我想要的东西”时,我就会以代码结束,我不想再挖掘出新的功能。
我有一本Steve McConnell的《Code Complete》,我经常在这里和其他地方听到它的神奇之处。我读了关于设计的章节,似乎没有得到我想要的信息。我知道他说这不是一个固定的过程,它主要是基于启发式,但我似乎不能把他所有的信息都应用到我的项目中。
那么,在高级设计阶段(在开始编程之前),你要做些什么来确定你需要什么类(特别是那些不基于任何“现实世界对象”的类)以及它们如何相互交互?
我特别感兴趣的是你使用的方法是什么?你遵循什么样的过程,通常会产生一个良好的,干净的设计,将接近最终产品?
一个有用的技巧是将你独特的问题描述与你在现实世界中可以找到的东西联系起来。例如,你正在为一个将席卷全球的复杂医疗保健系统建模。有什么例子你可以随时调用建模吗?
确实。观察旁边的药房是如何运作的,或者医生的房间。
把你的领域问题归结为你能理解的问题;一些你能联想到的东西。
然后,一旦领域内的“玩家”开始出现,你开始对你的代码建模,选择“提供者-消费者”建模方法,即你的代码是模型的“提供者”,而你是“消费者”。
与领域相关并在较高层次上理解它是任何设计的关键部分。
我认为这里的答案应该是非常不同的,这取决于这个人在现实世界中的经验。
如果你只有一两年的工作经验,那么你必须明白这一点:你如何才能真正了解你的数据,并确切地了解你要做的事情?
是的,如果您已经在现实世界中工作了5年以上,那么您可以在许多软件开发过程模型或技术中选择任何一种。
但是光靠读书是得不到经验的。你应该在一个好的领导下的好团队中学习。
如果这是不可能的,那么你应该自己做。从编写一段可能非常糟糕的代码开始迭代,学习错误,丢弃所有错误,编写更好的代码等等。
您将学到很多关于代码库的知识。工具就是工具,它们不会教你任何东西。
一个有用的技巧是将你独特的问题描述与你在现实世界中可以找到的东西联系起来。例如,你正在为一个将席卷全球的复杂医疗保健系统建模。有什么例子你可以随时调用建模吗?
确实。观察旁边的药房是如何运作的,或者医生的房间。
把你的领域问题归结为你能理解的问题;一些你能联想到的东西。
然后,一旦领域内的“玩家”开始出现,你开始对你的代码建模,选择“提供者-消费者”建模方法,即你的代码是模型的“提供者”,而你是“消费者”。
与领域相关并在较高层次上理解它是任何设计的关键部分。
大型项目的问题在于您无法监督组件之间的所有交互。因此,降低项目的复杂性是很重要的。类图和序列图对于这个设计阶段来说太详细了。
首先试着从更高的抽象层次来思考。考虑主要组件及其职责(它们与其他组件的接口),查看一些架构模式以获得灵感(不,不是设计模式,这些太低级了!MVC和多层是架构模式的例子)。
对于相当大的项目,这样的视图应该有大约3-5个组件。
只有这样,你才能放大到某个组件,并尝试设计它。现在我们到了设计模式和类图的层次。试着把注意力集中在项目的这一部分,如果你发现你需要向其他组件之一添加一个职责,就把它添加到你的文档/待办事项列表中。不要在这个时候浪费时间思考它们的含义,因为它们的变化太快了,当设计更加可靠时再进行检查。
此时您不需要完整地设计每个组件,尽管使用一段代码来实现未实现的组件接口并生成简单但有用的响应可能是明智的。这样,您就可以一次开始开发(和设计)一个组件,并对其进行合理的测试。
当然,当新组件完成后,您应该在继续之前测试它们如何(以及是否)相互集成。
简而言之:
采用面向对象和信息隐藏原理,并将其提升到另一个层次!
PS:
在设计的时候画很多草图,就像真正的建筑一样!
PPS:试着从不同的角度来看待这个问题,跳出固有的思维模式(尽管固有的思维模式可能是正确的),与同行讨论可能会非常有用……午餐时你们有话可聊。