我应该在设计新代码和算法时使用UML吗?

我应该在设计新代码和算法时使用UML吗?,uml,Uml,我正在设计一个新的系统,发现我正在与我想做的结构作斗争。一个症状是,每次我重新处理问题时,我都必须尝试在纸上绘制组件之间的关系。(我还不清楚这些组件到底是什么,或者它们之间的关系是什么——例如,我设法删除了一个没有做任何事情的组件) UML是一种有用的前进方式吗?我曾经非常怀疑,并尝试过早期版本,其中生产版本的成本太高。现在我看到Netbeans中有一个插件,除其他外,它有很好的模式选择(仅此一点就值得一试) 我已经阅读了关于SO的大多数顶级帖子,似乎没有达成非常明确的共识。我的背景是,这与研究

我正在设计一个新的系统,发现我正在与我想做的结构作斗争。一个症状是,每次我重新处理问题时,我都必须尝试在纸上绘制组件之间的关系。(我还不清楚这些组件到底是什么,或者它们之间的关系是什么——例如,我设法删除了一个没有做任何事情的组件)

UML是一种有用的前进方式吗?我曾经非常怀疑,并尝试过早期版本,其中生产版本的成本太高。现在我看到Netbeans中有一个插件,除其他外,它有很好的模式选择(仅此一点就值得一试)

我已经阅读了关于SO的大多数顶级帖子,似乎没有达成非常明确的共识。我的背景是,这与研究有关,而不是为客户编写代码,因此主要目的不是记录最终产品,而是帮助我理清思路(并可能编写一些简单的结构)

如果有任何答案支持UML,那么建议需要多长时间才能产生效果以及使用频率将是非常有用的。(作为参考,我每天使用测试、记录器和调试器)


补充UML软件中是否有任何东西在代码和图表之间强制实现一致性(在任何级别)。我假设,当创建一个StrategyPattern时,它可以生成存根代码。但是,如果模式被破坏,UML工具可以检测到这种情况吗?

我可以看到使用UML的两种方法:正式捕获设计,非正式地勾画设计的某些方面,作为设计过程的辅助

前者在有设计师团队的大型项目中特别有用。它需要一些规则和时间,但我认为比在文本中捕获信息更可取——模型确保一致性。如果完全完成,您甚至可以从模型生成代码。这种方法确实有效,但显然需要相当多的启动工作

后者可以更加非正式。也许仅仅为了一个开发者的利益而捕捉设计中的棘手部分,似乎也能奏效。我经常这样做。我发现“玩”类图确实有助于明确责任。在我只想记录类和属性的地方,这样可以节省时间。一些提供UML作为真实代码中类的替代视图的工具非常好


在一个合理的工具中绘制类图的阶段应该是几小时或几天的学习任务——假设熟悉对象概念。学习对象设计是一个完全不同的问题。

如果你发现UML有有用的额外信息——聚合/组合、关联的原型等,那么就使用它,而不是你目前正在使用的任何东西

我还没有找到一个工具,作为早期设计铅笔和纸一样好;在纸上绘制UML草图仍然使用UML


补充:UML软件中是否有任何东西在代码和图表之间强制实现一致性(在任何级别)。我假设,当创建一个StrategyPattern时,它可以生成存根代码。但是,如果模式被破坏,UML工具会检测到这一点吗


有很多不同的UML工具,有些工具有不同程度的约束检查。通常这仅限于UML语法,但也有一些语法可用于对UML模型进行断言,一些工具可以生成代码在运行时测试这些断言。(这里有些模糊,因为我从来没有在一家愿意为上述工具付费的商店工作过,因为它们不便宜,而且更常用于嵌入式系统,我的大部分工作都是技术计算。)因此,如果您购买了一个高端UML工具,支持将OCL映射到代码生成,在工具中设置一个原型来表示策略模式是什么,然后生成包含这些断言(如果它们是运行时的)的代码,或者将这些断言应用于模型中的结构(如果它们是元模型断言)。(我不太确定这些工具是否允许您针对元模型编写约束—即断言策略必须提供一个函数,而不仅仅是断言前置和后置条件,但如果您将方法抽象为策略的超类型,则大多数语言的类型系统也会检查这些断言。)方式)。如果您要对代码进行反向工程,并且它打破了约束,那么该工具将对其进行标记。问题是,构成某些模式示例的内容在某种程度上取决于开发人员的意图,而不是可以断言的关于所创建结构的任何内容

使用铅笔和纸

在我看来,UML对于在大型团队中处理大型项目非常有用。 通过使用UML,您可以通过“编码前思考”创建一个非常好的体系结构

以后你可以把图表考虑一下,如果你做了所有你想做的事情。


尽管如此,为了给你一个好的答案,最好知道你的项目实际有多大?

UML作为不同ppl之间的通用语言,以便所有人都能描述相同的领域


正如Omu所说,对于代码和算法设计,铅笔和纸总是最好的方式。

UML不会使代码变得更好,但可以改善您对所做工作的看法

它不是关于UML在编写代码方面是否有用,而是关于UML的真正用途,使您能够描述您想要做什么,系统看起来是什么样子

你需要一个比喻,一个故事来传达你的工作。稍后加入该项目的开发人员将需要此功能来更好地理解您的代码