Какие инструменты вы используете для описания проектов?
Всякий раз, когда я начинаю работать над проектами, которые достаточно сложны, и я не могу сразу все это держать в голове, мне хочется обрисовать, как должно работать приложение... Обычно я вырываю что-то подобное в текстовом редакторе:
# 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 не будет его анализировать, не потому, что я включил его в качестве комментариев в коде).
Мне интересно, как вы, ребята, делаете это. Есть ли инструменты для описания потока программы? Как вы описываете сложные проекты, чтобы, когда приходит время писать код, вы могли сосредоточиться на коде, а не на дизайне / архитектуре всех маленьких кусочков?
9 ответов
Я использую GraphViz, если мне нужно набросать такие простые диаграммы - язык DOT облегчен и очень хорошо отличается, когда я сравниваю версии диаграмм.
Я написал об этом с примером несколько месяцев назад с примером, показывающим более сложную диаграмму архитектуры.
Я также только что добавил пост в блоге с уменьшенной диаграммой, которая показывает большой программный поток, чтобы дать представление о том, как можно построить поток GraphViz. У меня нет времени, чтобы запутать весь текст, поэтому просто поместите его там в виде картинки в низком разрешении, чтобы создать впечатление архитектуры без возможности увеличения, чтобы увидеть читаемые детали.
Эта диаграмма была составлена от руки после нескольких попыток запуска. Чтобы не слишком насмехаться над вами, вот некоторые выдержки из текста 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.aussiedesignedsoftware.com/img/WindowLaunchesZoomedOut.png
По сути, вы пытаетесь извлечь информацию и варианты использования в формате Given-When-Then. см. http://wiki.github.com/aslakhellesoy/cucumber/given-when-then. Этот подход решил обе проблемы.
- понимание предметных и краевых случаев
- описание решения, чтобы вы знали, над чем работать в дополнение к тому, с чего начать
Для всего, что связано с документацией: вики, вики и другие вики! Легко читать и самое главное, легко для любого, чтобы обновить.
Мой любимый: Trac (гораздо больше, чем просто вики)
Мне нравятся диаграммы последовательности для всего в области ОО. Есть несколько хороших способов создания диаграмм последовательности, не тратя все свое время на перемещение полигонов.
Во-первых, есть несколько онлайн-генераторов диаграмм последовательности, которые принимают текстовый ввод. Для одного примера, см. http://www.websequencediagrams.com/.
Есть также хороший инструмент на основе Java, который принимает текстовый ввод и создает диаграммы. Это хорошо подходит для интеграции в ваш процесс сборки, потому что он может быть вызван непосредственно из ant.
- Случаи применения
- Диаграммы деятельности
- Диаграммы последовательности
- Диаграммы конечного автомата
- Диаграммы классов
- Диаграммы базы данных
- Наконец, после того, как это сделано, и проект выглядит хорошо определенным, в Microsoft Project.
Мне нравится сохранять этот поток, поскольку он хорошо документирует, четко определяет и легко объясняет, не говоря уже о том, что это просто хороший процесс. Если вы не уверены, что это такое, посмотрите на мой ответ здесь, содержащий дополнительную информацию, а также некоторые ссылки.
Я рекомендую использовать UML Существуют различные глубины, которые вы можете использовать при разработке. Если вы берете UML достаточно далеко, большинство приложений UML могут автоматически сгенерировать базовую структуру вашего кода для вас.
Обычно я полагаюсь на свободный UML, генерируя сценарии использования, диаграмму сценариев использования, диаграмму классов, диаграмму компонентов, и начал больше использовать диаграммы последовательности.
В зависимости от проекта работает доска или блокнот, но для проекта разумного размера и времени я сделаю все, используя ArgoUML, в котором я пользовался StarUML в прошлом, но это только Win32, что сейчас для меня бесполезно.
Большая книга по этому вопросу - "Применение UML и шаблонов: введение в объектно-ориентированный анализ, проектирование и итеративную разработку" (3-е издание) - [978-0131489066]
Я должен был поднять его для курса в колледже, который занимался преподаванием UML, но сохранил его и читал его раз или два с тех пор.
Это также стоит проверить: Изучение UML 2.0 - O'Reilly - [978-0596009823]
Есть ли инструменты для описания потока программы?
Ваши главные комментарии ("Программа запущена") могут быть выражены с помощью "блок-схемы".
Ваши нижние комментарии ("Фоновая служба") могут быть выражены с помощью "диаграммы потока данных".
Я не использую блок-схемы (я не считаю, что они добавляют ценность по сравнению с соответствующим псевдокодом / текстом, как вы его написали), но мне нравятся диаграммы потоков данных для отображения представления системы на верхнем уровне (т.е. хранилища данных / форматы / местоположения и этапы обработки данных /IO). Тем не менее, диаграммы потоков данных предшествуют UML, поэтому в сети их не так много.
Если что-то сложное, мне нравятся картинки, но я стараюсь делать это вручную на бумаге, чтобы лучше их визуализировать. Доски отлично подходят для этого.
Я разбиваю большое или сложное приложение на более мелкие части и разрабатываю их на бумаге, чтобы лучше понять поток между частями.
Как только у меня закончится поток между деталями, я смогу лучше спроектировать каждую часть отдельно, так как каждая часть - это ее собственная подсистема, так что я могу менять языки или платформы, если захочу.
В этот момент я просто начинаю работать над приложением и работаю только с одной подсистемой за раз, хотя подсистему, возможно, придется разложить до тех пор, пока у меня не появится часть, которую я могу оставить в своей голове.