4. Agile-манифест разработки программного обеспечения
Мы постоянно открываем для себя более совершенные методы
разработки программного обеспечения, занимаясь разработкой
непосредственно и помогая в этом другим.
Благодаря проделанной работе мы смогли осознать, что:
Люди и взаимодействие важнее процессов и инструментов
Работающий продукт важнее исчерпывающей документации
Сотрудничество с заказчиком важнее согласования контракта
Готовность к изменениям важнее следования первоначальному плану
То есть, не отрицая важности того, что справа,
мы всѐ таки больше ценим то, что слева.
Идея
15. 1. Я пишу пользовательский интерфес
2. Трудно сопровождать
3. Они не ловят новые “баги”
4. Они медленные
5. Это скучно
6. Это дело тест-тима
7. У меня легаси код
8. Мне нужно делать фичи
9.
Отговорки
16. 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;
}
}
17. 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;
}
}
18. 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;
}
}
19. 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;
}
}
20. 1. Смешивание инстанциирования с логикой
2. Смешивание патерна Lookup с логикой
3. Выполнение целевой логики в конструкторе
4. Глобальная видимость полей класса
5. Использование патерна Singleton
6. Статические методы
7. Глубокая иерархия наследования
8. Смешивание сервисов с общей логикой
Антипатерн
29. 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/
Notes de l'éditeur
Отсутствие прозрачных процедур сборки и установкиНе структурированный кодОтсутсвие тестов, как следствие не тестируемый код
1. билд в один клик2. деплой в один клик3. тест-тим строит и деплоит IR
Разработчик не ведает что творит (только вот эта маленькая фича и она ничего не сломает)
Но иногда ведаем что творим, но приходится идти осознано
Что именно делает код — не важно. Для тестирования важно только как код структурирован.
Что именно делает код — не важно. Для тестирования важно только как код структурирован.
Что именно делает код — не важно. Для тестирования важно только как код структурирован.
Что именно делает код — не важно. Для тестирования важно только как код структурирован.
1. Unit тестирование без модулей2. Интеграционное когда нечего интегрировать3. Не возможно рефакторить без тестов4. Системные тесты дают нам уверенность
1. Системные тесты сложны в поддержке2. Выполняются долго и редко3. Переворачиваем пирамиду