?

Log in

No account? Create an account
Sprint #3 review - В Северном Ледовитом
May 9th, 2014
09:00

[Link]

Previous Entry Share Next Entry
Sprint #3 review
В течение третьего спринта мы продолжили развивать инфраструктуру нашей нотной программы, не приступая к наращиванию её основных функций. Что это значит? Это значит, что ещё до того, как мы нарисуем в нашей программе первую ноту, мы должны уметь делать всё то, что умеет любая программа: открывать и записывать файлы, показывать изображение на экране и печатать на принтере, вводить с клавиатуры или мыши, и так далее.

Конечно, инфраструктуру создавать на пустом месте довольно сложно, поэтому мы запрограммировали несколько самых базовых функций, и отлаживаем всё на них. Любители скрама одобрят ещё один шаг, который мы сделали, а именно написание документа под названием Definition of Done («Что означает „сделано“»). Вот содержание этого документа:

Элемент музыкальной нотации считается реализованным в программе, если программа может его
- показать на экране
- напечатать на принтере

- сохранить в файл
- загрузить из файла

- экспортировать в MusicXML
- импортировать из MusicXML

- добавить вручную
- удалить вручную

- отменить, как последнее действие
- восстановить, как последнее действие

- дать отредактировать его свойства


Это довольно большой список, и если следовать этому определению, то в нашей программе ещё не реализован ни один элемент нотации. К слову сказать, кусочки нотоносцев с ключами и акколадами, которые мы показывали на предыдущих ревью, были «захардкожены», т. е. вбиты в исходный код программы, а не добавлялись динамически. Нам важно было это сделать, чтобы наладить первые четыре пункта Definition of Done, то есть вывод на экран, принтер, сохранение и загрузку.

В этом спринте мы открыли одну команду редактирования: таким образом теперь можно добавлять нотоносец над позицией курсора (после добавления курсор сразу переходит на новый нотоносец):



Обратите внимание на звёздочку, появившуюся в заголовке окна после выполнения команды — это признак «грязного файла», иными словами, при закрытии программы файл будет предложено записать.

Экспериментируя с этой единственной командой, мы проработали одну из важнейших подсистем инфраструктуры — историю действий. Это та подсистема, которая позволяет последовательно отменить ошибочно произведённые действия. Нам кажется, что это само собой разумеющаяся штука, и да, она сама собой разумеется. Однако ещё каких-то двадцать лет назад большинство программ умели отменять лишь одно последнее действие, а некоторые не умели отменять и одного.

Реализация истории действий довольно хитра. Из курса термодинамики мы знаем, что не всякий процесс является обратимым. Например, мы можем переложить яйца из левого угла холодильника в правый угол. Отмена этого действия очень проста — нужно лишь переложить их обратно в левый угол. Однако если вы зажарили яичницу, то для отмены этого действия вам придётся сбегать в магазин и докупить сырых яиц.

Точно так же и с нотами. Если мы хотим отменить добавление нотоносца, то программе всего лишь нужно его удалить. Кстати, проверим, как это работает:



А вот если вы выделите весь документ и удалите, а затем попросите программу отменить это действие, то ей потребуется откуда-то из волшебного рукава вытряхнуть сохранённую копию предыдущего состояния документа. Но это в будущем. Сейчас ещё нечего выделять.

А пока проверим, как работает восстановление отменённого действия:



Заметим, что звёздочка в заголовке окна честно гаснет, когда состояние файла становится идентичным исходному (или сохранённому), и загорается, как только мы отходим от него.

Теперь, поскольку схема отмены и восстановления действий уже реализована, мы сможем пользоваться ею и для всех последующих добавляемых в программу команд.

Ещё один важный шаг в развитии инфраструктуры, который мы совершили в этом спринте, это импорт MusicXML. Мы решили не засорять меню и не выделять импорт в отдельную команду, и поскольку результатом этого действия всё равно становится открытие документа, то и реализуется оно через стандартную команду File > Open:



Напомним, что мы не против стандарта MusicXML, как такового. Мы против использования его, как основного формата для программы, поскольку он не предназначен для этого и не предоставляет возможностей для хранения специфически выстроенных данных. Его назначение — передача усреднённого унифицированного внешнего представления нотного текста из одной программы в другую. Вот в этом качестве мы его и применяем.

На этом нововведения минувшего спринта заканчиваются. К этому моменту мы потратили на разработку прототипа 153 идеальных инженерных часа и написали 317 автоматических тестов для контроля качества. Да, мы успели много, но всё интересное — ещё впереди. Самая нотация начнётся после того, как мы реализуем все пункты нашего Definition of done для начальных нескольких команд.

Всех, кому интересно развитие проекта, приглашаем на следующее спринт-ревью, которое состоится в этом ЖЖ ровно через две недели, 23 мая, в 9:00 по московскому времени.

Tags: , , ,

(4 comments | Leave a comment)

Comments
 
[User Picture]
From:niclaus
Date:May 9th, 2014 05:11 am (UTC)
(Link)
Неразрушающее редактирование? То есть, пусть программа жарит яичницу не из яиц из холодильника, а из их копии?
[User Picture]
From:ptrue
Date:May 9th, 2014 06:32 am (UTC)
(Link)
Наоборот. Яичницу будем жарить из настоящих яиц, но перед этим «засейвим» копию.
[User Picture]
From:reineke
Date:May 9th, 2014 07:06 am (UTC)
(Link)
объединить импорт и открыть - я прям уже годы недоумеваю, почему их не объединили сто лет назад.
[User Picture]
From:ptrue
Date:May 9th, 2014 07:10 am (UTC)
(Link)
Видимо, тем самым хотят подчеркнуть, какой формат родной, а какой импортный.

Но на самом деле, резделение имеет право на существование в тех случаях, когда речь идёт о вставке импортного фрагмента в основной документ. Например, вставка картинки в текст — это, наверное, мог бы быть импорт.
Powered by LiveJournal.com