2

每当我开始从事足够复杂的项目时,我无法一次全部记住,我喜欢概述应用程序应该如何工作......我通常在文本编辑器中破解类似这样的内容:

# Program is run
#     check to see if database exists
#         create database
#             complain on error, exit
#     ensure database is writable
#         complain to user, exit
#     check to see if we have stored user credentials
#         present dialog asking for credentials
#             verify credentials and reshow dialog if they're invalid
#     show currently stored data
#     start up background thread to check for new data
#         update displayed data if new data becomes available
#     ...
# 
# Background service
#     Every 15min update data from server
#     Every 24 hours do a full sync w/ server

等等(注意:这是注释所以 SO 不会解析它,不是因为我将它作为注释包含在代码中)。

我想知道你们是怎么做到的。是否有任何工具可以概述程序的流程?您如何描述复杂的项目,以便在编写代码时可以专注于代码而不是所有小块的设计/架构?

4

9 回答 9

2

如果我需要画出如此简单的图表,我会使用 GraphViz - DOT 语言是轻量级的,当我比较图表的版本时,差异非常好。

几个月前,我在博客上写了一个例子,其中一个例子显示了一个更复杂的架构图。

我还刚刚添加了一篇博客文章,其中包含一个显示大型程序流程的缩小图,以了解如何组成 GraphViz 流程。我没有时间混淆所有文本,所以只需将其作为低分辨率图片放在那里,以给人以架构的印象,而无法放大以查看可读的细节。

这张图是在经过一堆 grepping 后手工制作的。为避免过多嘲讽您,以下是生成图表的 DOT 文本的一些摘录。

digraph windows {
 rankdir=LR
 label="Windows Invoked\nby controls and menu items"
 node[fontsize=12]

/* ENTRY POINTS */
 wndMainMenu[shape=box color=red fontcolor=red]
 DEFAULT_WINDOW[LABEL="DEFAULT\NWINDOW" shape=box color=red fontcolor=red]


/* WINDOWS */ 
 node[shape=box color=black fontcolor=black style=solid]
 App
 wndAddBill [label="Add Payable\nwndAddBill"]
 wndAddCustomer [label="Add a Customer\nwndAddCustomer"]

...

/* WINDOW INVOCATION */
 node[shape=oval color=blue fontcolor=blue style=normal]
 edge[fontsize=10 style=normal color=blue fontcolor=blue]

 wndPayBills_bvlNewBill -> wndAddBill 
 wndAddCustomer -> wndAddCustomer_save001
 wndManageDrivers_bvlNewCustomer -> wndAddCustomer 

替代文字 http://www.aussiedesignsoftware.com/img/WindowLaunchesZoomedOut.png

于 2009-09-17T11:01:18.403 回答
1

基本上,您要做的是以 Given-When-Then 格式提取信息和用例。请参阅http://wiki.github.com/aslakhellesoy/cucumber/given-when-then。这种方法解决了这两个问题。

  • 理解领域和边缘情况
  • 概述解决方案,以便您知道除了从哪里开始之外接下来要做什么
于 2009-09-18T09:22:08.793 回答
1

Emacs Mx大纲模式

或者,纸。

ps这是一个严肃的答案。

于 2009-09-17T03:34:43.510 回答
0

我推荐使用UML 在设计时你可以进入各种深度。如果您将 UML 做得足够好,大多数 UML 应用程序都可以为您自动生成代码的基本框架。

通常我依赖松散的UML,生成用例、用例图、类图、组件图,并且已经开始更多地使用序列图。

根据项目,白板或记事本可以工作,但对于合理大小和时间的项目,我将使用 ArgoUML 做所有事情,我过去很喜欢 StarUML,但它只是 Win32,现在对我来说没用。

一本关于该主题的好书是 Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) - [978-0131489066]

我不得不为一门大学课程选择它,该课程在教授 UML 方面做得很糟糕,但保留了它并从那以后读了一两次。

这也值得一试:Learning UML 2.0 - O'Reilly - [978-0596009823]

于 2009-09-18T02:55:59.753 回答
0

对于与文档相关的任何内容:Wiki、Wiki 和更多 Wiki! 易于阅读,最重要的是,任何人都可以轻松更新。

我最喜欢的一个:Trac(无论如何不仅仅是一个 wiki)

于 2009-09-17T03:32:19.083 回答
0

是否有任何工具可以概述程序的流程?

您的热门评论(“程序已运行”)可以使用“流程图”来表达。

您的底部评论(“后台服务”)可以使用“数据流图”来表达。

我不使用流程图(与您编写的相应伪代码/文本相比,我发现它们没有增加价值),但我确实喜欢用于显示系统顶层视图的数据流程图(即数据存储/格式/位置,以及数据处理阶段/IO)。但是,数据流图早于 UML,因此网上对它们的描述并不多。

于 2009-09-17T03:35:31.317 回答
0

我喜欢OO 领域中任何事物的序列图。有几种很好的方法可以创建序列图,而无需花费所有时间来推动多边形。

首先,有一些在线序列图生成器接受文本输入。例如,请参阅WebSequenceDiagrams.com

还有一个不错的基于 Java 的工具,它接受文本输入并创建图表。这非常适合集成到您的构建过程中,因为它可以直接从 ant 调用。

于 2009-09-17T03:53:07.770 回答
0

如果某件事很复杂,我喜欢图片,但我倾向于在纸上手工完成这些,这样我可以更好地想象它。白板非常适合这一点。

我将大型或复杂的应用程序分解成更小的部分,并在纸上设计出来,这样我就可以更好地理解各部分之间的流程。

一旦我完成了部分之间的流程,那么我可以更好地单独设计每个部分,因为每个部分都是它自己的子系统,所以我可以根据需要更改语言或平台。

那时,我只是开始处理应用程序,一次只处理一个子系统,即使该子系统可能需要分解,直到我有一个可以记住的部分。

于 2009-09-17T03:56:11.320 回答
0
  1. 用例
  2. 活动图
  3. 序列图
  4. 状态机图
  5. 类图
  6. 数据库图
  7. 最后,在完成这些并且项目看起来定义良好之后,进入 Microsoft Project。

我喜欢保持这种流程,因为它可以很好地记录事情,明确定义并且易于解释,更不用说,这只是一个很好的过程。如果您不确定这些是什么,请在此处查看我的答案,以提供更多信息以及一些链接。

于 2009-09-17T05:40:56.320 回答