30
XP практики в проектах с тяжелой наследственностью Oleg Klymenko Java Developer @ Sigma Ukraine [email protected]

XP практики в проектах с тяжелой наследственностью

Embed Size (px)

DESCRIPTION

Олег Клименко, разработчик, компания Sigma Ukraine

Citation preview

Page 1: XP практики в проектах с тяжелой наследственностью

XP практики в проектахс тяжелой наследственностью

Oleg KlymenkoJava Developer @ Sigma Ukraine [email protected]

Page 2: XP практики в проектах с тяжелой наследственностью

Начало

Page 3: XP практики в проектах с тяжелой наследственностью

Развитие

Page 4: XP практики в проектах с тяжелой наследственностью

Agile-манифест разработки программного обеспечения

Мы постоянно открываем для себя более совершенные методы разработки программного обеспечения, занимаясь разработкой

непосредственно и помогая в этом другим.Благодаря проделанной работе мы смогли осознать, что:

Люди и взаимодействие важнее процессов и инструментовРаботающий продукт важнее исчерпывающей документации

Сотрудничество с заказчиком важнее согласования контрактаГотовность к изменениям важнее следования первоначальному плану

То есть, не отрицая важности того, что справа,мы всё таки больше ценим то, что слева.

Идея

Page 5: XP практики в проектах с тяжелой наследственностью

Процесс

Page 6: XP практики в проектах с тяжелой наследственностью

Ожидание

Page 7: XP практики в проектах с тяжелой наследственностью

Реальность

Page 8: XP практики в проектах с тяжелой наследственностью

Демотивация

Page 9: XP практики в проектах с тяжелой наследственностью

Первый шаг

Page 10: XP практики в проектах с тяжелой наследственностью

1. Страсть (избыток проектирования)2. Чревоугодие (неспособность к рефакторингу)3. Жадность (соревнование между командами разработки)4. Лень (отсутствие проверки входных данных)5. Гнев (отсутствие практики комментировать код)6. Зависть (не использование систем управления версиями)7. Гордость (отсутствие юнит-тестирования)

Neil McAllister8. Оптимизм9. 10.

Анализ

Page 11: XP практики в проектах с тяжелой наследственностью

Новая фича

Page 12: XP практики в проектах с тяжелой наследственностью

Новая фича

Page 13: XP практики в проектах с тяжелой наследственностью

Тест разработчика

Page 14: XP практики в проектах с тяжелой наследственностью

DT

$

Вызов

Page 15: XP практики в проектах с тяжелой наследственностью

1. Я пишу пользовательский интерфес2. Трудно сопровождать3. Они не ловят новые “баги”4. Они медленные5. Это скучно6. Это дело тест-тима7. У меня легаси код8. Мне нужно делать фичи9.

Отговорки

Page 16: XP практики в проектах с тяжелой наследственностью

public class Validator {private static Validator instance =

new Validator(FeatureFactory.get());private Subscription subscr;private final Player player;

public static Validator getInstance() {return instance;}

private Validator(FeatureFactory ff) {player = ff.getPlayer();if (player instanceof GamePlayer)

subscr = ff.findSubscription(player);}

public boolean check(Round round) {SyncService sync = Repository.lookup(SyncService.class);boolean result = false;Date time = new Date();if(!round.isActiveInTime(time)) {

try {sync.lock(round);Ticket ticket = new SubscriptionTicket(subscr);result = round.subscribe(ticket, player);

}finally {

sync.unlock(round);}

}return result;

}}

Page 17: XP практики в проектах с тяжелой наследственностью

public class Validator {private static Validator instance =

new Validator(FeatureFactory.get());private Subscription subscr;private final Player player;

public static Validator getInstance() {return instance;}

private Validator(FeatureFactory ff) {player = ff.getPlayer();if (player instanceof GamePlayer)

subscr = ff.findSubscription(player);}

public boolean check(Round round) {SyncService sync = Repository.lookup(SyncService.class);boolean result = false;Date time = new Date();if(!round.isActiveInTime(time)) {

try {sync.lock(round);Ticket ticket = new SubscriptionTicket(subscr);result = round.subscribe(ticket, player);

}finally {

sync.unlock(round);}

}return result;

}}

Page 18: XP практики в проектах с тяжелой наследственностью

public class V {private static V instance =

new V(FF.get());private S s;private final P p;

public static V getInstance() {return instance;}

private V(FF ff) {p = ff.getP();if (player instanceof GamePlayer)

s = ff.findS(player);}

public boolean do(R r) {SS sync = Repository.lookup(SS.class);boolean result = false;Date time = new Date();if(!round.timeDependentRoutine(time)) {

try {sync.lock(round);T t = new ST(s);result = round.s(t, player);

}finally {

sync.unlock(round);}

}return result;

}}

Page 19: XP практики в проектах с тяжелой наследственностью

public class Validator {private final Subscription subscr;private final Player player;private final SyncService sync;

public Validator(Player player, Subscription subscr, SyncService sync) {

this.player = player;this.subscr = subscr;this.sync = sync;

}

public boolean check(Round round, Date time) {boolean result = false;if(!round.isActiveInTime(time)) {

try {sync.lock(round);Ticket ticket = new SubscriptionTicket(subscr);result = round.subscribe(ticket, player);

}finally {

sync.unlock(round);}

}return result;

}}

Page 20: XP практики в проектах с тяжелой наследственностью

1. Смешивание инстанциирования с логикой2. Смешивание патерна Lookup с логикой3. Выполнение целевой логики в конструкторе4. Глобальная видимость полей класса5. Использование патерна Singleton6. Статические методы7. Глубокая иерархия наследования8. Смешивание сервисов с общей логикой

Антипатерн

Page 21: XP практики в проектах с тяжелой наследственностью

Тестируемость

1. Сбалансированный ООП дизайн.2. Внедрение внешних зависимостей (DI).3. Отслеживание ошибок смешивания логики.4. Соблюдение закона Деметры.5. Юнит тесты (TDD).

Page 22: XP практики в проектах с тяжелой наследственностью

Норма

Unit тесты

Функциональные и интеграционные тесты

Системные тесты

Page 23: XP практики в проектах с тяжелой наследственностью

Переворот

Page 24: XP практики в проектах с тяжелой наследственностью

Время

Page 25: XP практики в проектах с тяжелой наследственностью

Человеческий фактор

Page 26: XP практики в проектах с тяжелой наследственностью

Исходный код

Исходный код

Архитектура и ДизайнАрхитектура и Дизайн

КомментарииКомментарии

СтандартыкодированияСтандарты

кодирования

Потенциальныеошибки

Потенциальныеошибки

Дублированиекода

Дублированиекода

Юнит тестыЮнит тесты

СложностьСложность

Контроль

Page 27: XP практики в проектах с тяжелой наследственностью

Итоговый план

1. Налаживаем сборку/инсталяцию.2. Определяем поведенческие требования.3. Создаем покрытие функциональными тестами.4. Выполняем рефакторинг.5. Покрываем юнит тестами.6. Налаживаем инспекцию кода.7. Убираем излишние функциональные тесты.8. Оставляем мир лучше чем был до нас :)

Page 28: XP практики в проектах с тяжелой наследственностью

Пять минут...

Page 29: XP практики в проектах с тяжелой наследственностью

1. Miško Hevery. Writing Testable Code http://misko.hevery.com/code-reviewers-guide/

2. Wiktor Żołnowski. Reversed Tests Pyramid http://xpdays.com.ua/materials/legacy-code/

3. Neil McAllister. 7 deadly sins of software development http://gigaom.com/2012/06/02/the-7-deadly-sins-of-software-development/

Page 30: XP практики в проектах с тяжелой наследственностью