SlideShare una empresa de Scribd logo
1 de 30
XP практики в проектах
с тяжелой наследственностью



               Oleg Klymenko
               Java Developer @ Sigma Ukraine

               oklym@meta.ua
Начало
Развитие
Agile-манифест разработки программного обеспечения

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

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

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

                                                           Идея
Процесс
Ожидание
Реальность
Демотивация
Первый шаг
Анализ

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

                                             Neil McAllister
8. Оптимизм
9.
10.
Новая фича
Новая фича
Тест разработчика
$




         Вызов


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

                                        Отговорки
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;
       }
}
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;
       }
}
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;
       }
}
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;
       }
}
1.   Смешивание инстанциирования с логикой
2.   Смешивание патерна Lookup с логикой
3.   Выполнение целевой логики в конструкторе
4.   Глобальная видимость полей класса
5.   Использование патерна Singleton
6.   Статические методы
7.   Глубокая иерархия наследования
8.   Смешивание сервисов с общей логикой


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




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



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




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



Unit тесты
Переворот
Время
Человеческий фактор
Архитектура и Дизайн


           Комментарии
                                                  Дублирование
                                Исходный              кода
            Стандарты              код
           кодирования                            Юнит тесты


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



Контроль
Итоговый план


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

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
В помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кодаВ помощь разработчику: мини-анализатор кода
В помощь разработчику: мини-анализатор кода
 
Быстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯБыстрое введение в TDD от А до Я
Быстрое введение в TDD от А до Я
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
Thread
ThreadThread
Thread
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 

Destacado

Online Video In China Is Big!
Online Video In China Is Big!Online Video In China Is Big!
Online Video In China Is Big!
Richard Matsumoto
 
Momentsinlife
MomentsinlifeMomentsinlife
Momentsinlife
pishgo
 
Polyglot Programming @ CONFESS
Polyglot Programming @ CONFESSPolyglot Programming @ CONFESS
Polyglot Programming @ CONFESS
Andres Almiray
 
Responsive design lunch and learn
Responsive design lunch and learnResponsive design lunch and learn
Responsive design lunch and learn
Ricardo Queiroz
 
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
Hector Del Castillo, CPM, CPMM
 
Private guitar teacher los angeles
Private guitar teacher los angelesPrivate guitar teacher los angeles
Private guitar teacher los angeles
ZOTZinMusic
 

Destacado (14)

Commodity tips
Commodity tipsCommodity tips
Commodity tips
 
How to Manage Your Social Media like a Boss
How to Manage Your Social Media like a BossHow to Manage Your Social Media like a Boss
How to Manage Your Social Media like a Boss
 
Online Video In China Is Big!
Online Video In China Is Big!Online Video In China Is Big!
Online Video In China Is Big!
 
мирф 8 1880 ocr
мирф 8 1880 ocrмирф 8 1880 ocr
мирф 8 1880 ocr
 
Momentsinlife
MomentsinlifeMomentsinlife
Momentsinlife
 
Hiring for Scale; 13 Hacks in 30 Minutes (Startup Grind Europe presentation)
Hiring for Scale; 13 Hacks in 30 Minutes (Startup Grind Europe presentation)Hiring for Scale; 13 Hacks in 30 Minutes (Startup Grind Europe presentation)
Hiring for Scale; 13 Hacks in 30 Minutes (Startup Grind Europe presentation)
 
Polyglot Programming @ CONFESS
Polyglot Programming @ CONFESSPolyglot Programming @ CONFESS
Polyglot Programming @ CONFESS
 
Bibat museoan
Bibat museoan Bibat museoan
Bibat museoan
 
Chương 2 phương tiện thanh toán quốc tế
Chương 2 phương tiện thanh toán quốc tếChương 2 phương tiện thanh toán quốc tế
Chương 2 phương tiện thanh toán quốc tế
 
Responsive design lunch and learn
Responsive design lunch and learnResponsive design lunch and learn
Responsive design lunch and learn
 
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
BoldPM Insights: 5 Prescriptions for Attracting, Engaging and Converting Your...
 
MidiMobilités Actualités #18 – Avril 2015
MidiMobilités Actualités #18 – Avril 2015MidiMobilités Actualités #18 – Avril 2015
MidiMobilités Actualités #18 – Avril 2015
 
Private guitar teacher los angeles
Private guitar teacher los angelesPrivate guitar teacher los angeles
Private guitar teacher los angeles
 
5 Reasons to Visit Bangladesh
5 Reasons to Visit Bangladesh5 Reasons to Visit Bangladesh
5 Reasons to Visit Bangladesh
 

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

Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
Dmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
Dmytro Mindra
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
yaevents
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
Technopark
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 

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

JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Protecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacksProtecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacks
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Zagursky
ZagurskyZagursky
Zagursky
 

Más de Alex Tumanoff

Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey Klimenko
Alex Tumanoff
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey Morenets
Alex Tumanoff
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
Alex Tumanoff
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri Aizenberg
Alex Tumanoff
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений Firefox
Alex Tumanoff
 

Más de Alex Tumanoff (20)

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen Nedaskivskyi
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene Polonichko
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony Cox
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
 
Spring.new hope.1.3
Spring.new hope.1.3Spring.new hope.1.3
Spring.new hope.1.3
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton Vidishchev
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey Klimenko
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey Morenets
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей Рыбаков
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapter
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri Aizenberg
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в IT
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений Firefox
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programming
 
Lambda выражения и Java 8
Lambda выражения и Java 8Lambda выражения и Java 8
Lambda выражения и Java 8
 

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

  • 1. XP практики в проектах с тяжелой наследственностью Oleg Klymenko Java Developer @ Sigma Ukraine oklym@meta.ua
  • 4. Agile-манифест разработки программного обеспечения Мы постоянно открываем для себя более совершенные методы разработки программного обеспечения, занимаясь разработкой непосредственно и помогая в этом другим. Благодаря проделанной работе мы смогли осознать, что: Люди и взаимодействие важнее процессов и инструментов Работающий продукт важнее исчерпывающей документации Сотрудничество с заказчиком важнее согласования контракта Готовность к изменениям важнее следования первоначальному плану То есть, не отрицая важности того, что справа, мы всѐ таки больше ценим то, что слева. Идея
  • 10. Анализ 1. Страсть (избыток проектирования) 2. Чревоугодие (неспособность к рефакторингу) 3. Жадность (соревнование между командами разработки) 4. Лень (отсутствие проверки входных данных) 5. Гнев (отсутствие практики комментировать код) 6. Зависть (не использование систем управления версиями) 7. Гордость (отсутствие юнит-тестирования) Neil McAllister 8. Оптимизм 9. 10.
  • 14. $ Вызов DT
  • 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. Смешивание сервисов с общей логикой Антипатерн
  • 21. 1. Сбалансированный ООП дизайн. 2. Внедрение внешних зависимостей (DI). 3. Отслеживание ошибок смешивания логики. 4. Соблюдение закона Деметры. 5. Юнит тесты (TDD). Тестируемость
  • 22. Норма Системные тесты Функциональные и интеграционные тесты Unit тесты
  • 26. Архитектура и Дизайн Комментарии Дублирование Исходный кода Стандарты код кодирования Юнит тесты Потенциальные Сложность ошибки Контроль
  • 27. Итоговый план 1. Налаживаем сборку/инсталяцию. 2. Определяем поведенческие требования. 3. Создаем покрытие функциональными тестами. 4. Выполняем рефакторинг. 5. Покрываем юнит тестами. 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/

Notas del editor

  1. Отсутствие прозрачных процедур сборки и установкиНе структурированный кодОтсутсвие тестов, как следствие не тестируемый код
  2. 1. билд в один клик2. деплой в один клик3. тест-тим строит и деплоит IR
  3. Разработчик не ведает что творит (только вот эта маленькая фича и она ничего не сломает)
  4. Но иногда ведаем что творим, но приходится идти осознано
  5. Что именно делает код — не важно. Для тестирования важно только как код структурирован.
  6. Что именно делает код — не важно. Для тестирования важно только как код структурирован.
  7. Что именно делает код — не важно. Для тестирования важно только как код структурирован.
  8. Что именно делает код — не важно. Для тестирования важно только как код структурирован.
  9. 1. Unit тестирование без модулей2. Интеграционное когда нечего интегрировать3. Не возможно рефакторить без тестов4. Системные тесты дают нам уверенность
  10. 1. Системные тесты сложны в поддержке2. Выполняются долго и редко3. Переворачиваем пирамиду