Код как низкоуровневая документация
DESCRIPTION
Код как низкоуровневая документация, Михаил Гуренков, Андрей Свердлов, Клуб MAInfo.ruTRANSCRIPT
Код как низкоуровневая документация
Михаил Гуренков
Андрей Свердлов
Программа – штука непростая
Как описать программу?
Спецификация программы –
описание системы, которое полностью определяет ее цель и функциональные возможности.
Глоссарий.ру
PERT-time
Еда
1.2.3.Центреды
Кошки
1.2.4.Центр
размнож.
Удовольствие
1.2.1.Мяука-
лкаМяу!
DFD
IDEF0
1. Кошка
Еда
Кошки
Хозяин
Мяу!
Отходы
Квартира Лоток
UML
КошкаКличка : string
Возраст : unsigned int
Ходить ()
Есть ()
Спать ()
Центр еды
Есть ()
Центр сна
Спать () 1 1
1 1
ЕдаКоличество : unsigned int * *
Мяу!Громкость : unsigned int
Удовольствие
* 1 *
1..* 1
Еда
1.2.3.Центреды
Кошки
1.2.4.Центр
размнож.
Удовольствие
1.2.1.Мяука-
лкаМяу!
DFD IDEF0
1. Кошка
Еда
Кошки
Хозяин
Мяу!
Отходы
Квартира Лоток
UML
КошкаКличка : string
Возраст : unsigned int
Ходить ()
Есть ()
Спать ()
Центр еды
Есть ()
Центр сна
Спать () 1 1
1 1
ЕдаКоличество : unsigned int * *
Мяу!Громкость : unsigned int
Удовольствие
* 1 *
1..* 1
Filters
Configuration
UserInterface
DataAccess
Domain
Как описать этот модуль?
Filters
Самодокументирующийся код
1. найти, где изменить
2. понять как
1. Декомпозиция
Функции:
• Получить прайс для импорта
• Получить описание
• Вытащить данные из Excel
• Обработать данные
• Записать данные
2. Шаблоны проектирования
2. Шаблоны проектирования
3. Именование
public class XOrder
{
public void Remove ();
…
}
public class XItem
{
public void Delete ();
…
}
3. Именование
public class XOrder
{
public void Remove ();
…
}
public class XItem
{
public void Remove ();
…
}
3. Именование
public class XOrder
{
public void Delete ();
…
}
public class XItem
{
public void Delete ();
…
}
3. Именование
public class XUserMB
{
int m_i;
public int NofUrMail ();
…
}
3. Именование
public class XUserMailBox{ int m_NumberOfLetters;
public int UnreadLetters { get {…} } …}
4. Обратная связьpublic XOrderService FindInstallationOrder(){ if (Resource == null) { return null; } …}
4. Обратная связьpublic XOrderService FindInstallationOrder(){ if (Resource == null) { throw new InvalidOperationException("Не указан ресурс"); } …}
5. Модульные тесты[Test]public void OrderStatusController(){ XOrder order = XOrderRepository.Instance.Create(XOrderTypeRepository.Instance.Find(1)); order.Company = TestObjects.Company;
Assert.IsFalse(XOrderStatusController.Instance.IsChanged(order)); order.Save(); XOrderStatusController.Instance.RegisterVersion(order); Assert.IsFalse(XOrderStatusController.Instance.IsChanged(order));
order.BeginEdit(); order.Stages.MoveForward(order.OrderType.Stages.FindById(102)); order.Save(); Assert.IsTrue(XOrderStatusController.Instance.IsChanged(order));
order.BeginEdit();
order.Stages.MoveBack(); order.Save(); Assert.IsTrue(XOrderStatusController.Instance.IsChanged(order));
order = XOrderRepository.Instance.Find(1587); Assert.IsFalse(XOrderStatusController.Instance.IsChanged(order));}
6. Рефакторинг
Что творится с проектом:
• Меняются требования
• Меняется видение архитектуры
• Меняется структура
• Ухудшается код
Что же делать?
7. Комментарии
• неочевидная реализация
• алгоритмы (сложные описываются в дополнительных документах)
• актуальность!
• иногда проще написать коммент, чем понятный код
Вывод: высокий стиль есть гуд
Пейте, дети, молоко – будете здоровы!