SlideShare uma empresa Scribd logo
1 de 56
Якісний код
      Аудиторія: розробники

      Олександр Павлишак, 2010
      pavlyshak@gmail.com
Чому «якісний код»?
• Maintainability
• >50%
  – Зміни
  – Багфікси
  – Підтримка
• Ітеративні методи розробки
Maintainability ==    $

Maintainability == Якісний код

     Якісний код == $$
Стандартні питання до розробника
• Що робить система, коли відбувається Х?
• Як конкретно працює функціональність Y?
• Звідки дістаються
  опції Z?
• Скільки часу займе
  реалізувати Х?
Де відповіді?

• В специфікації
•                Якщо у вас вона є ;)
• В коді
•                Код є завжди
•                Only the Code Tells the Truth
В реальному житті
• Неякісний код сповільнює розробку
• Щоб дотриматись графіка, розробники
  швидко пишуть неякісний код



     Парадокс!
Якісний код


• Як писати якісний код?
• Не пишіть поганий код
Імена
Осмислені іменa

public void Copy(char[] a1, char[] a2)
{
  for (int i = 0; i < a1.Length; i++)
  {
    a2[i] = a1[i];
  }
}
Осмислені іменa

public void Copy(char[] source, char[] destination)
{
  for (int i = 0; i < source.Length; i++)
  {
    destination[i] = source[i];
  }
}
Ім’я відображає наміри і суть
• d, tot, res, srv, c, cc, c1, c2 – BAD!
• createdDate, totalCount, result,
  storageService, characters – GOOD!

• Довге змістовне ім’я краще короткого
  незрозумілого
• Змістовне ім’я краще чисельної константи
Константи
...
if (!resource.Exists)
{
    result = 404;
}
else if (resource.WasMoved)
{
    result = 301;
}
else if (user == null)
{
    result = 401;
}
...
Константи
...
if (!resource.Exists)
{
    result = HttpStatusCode.NotFound;
}
else if (resource.WasMoved)
{
    result = HttpStatusCode.MovedPermanently;
}
else if (user == null)
{
    result = HttpStatusCode.Unauthorized;
}
...
Коротке ім’я – коротка видимість

int[] elements = …
for (int i = 0; i < elements.Count(); i++)
{
  elements[i] = elements[i] * 2;
}
Послідовні імена
• Get, Fetch, Retrieve, Obtain, Acquire
Feed feed = FeedService.ObtainSyndicationFeed();
if (feed.IsValid)
{
   Storage feedStorage = GetFileStorage(path);
   List<Post> posts = feed.RetrievePosts();
   feedStorage.Save(posts);
}

• Виберіть одне і послідовно дотримуйтесь
  його
Надлишковість
• nameString, customersArray
• sName, iCount, arrCustomers

string nameString = "Kenny";
string[] girlsArray = FindAllAttractiveGirls();

FileStream ouputFile = File.Open("c:autoexec.bat");
Url urlToBashOrg = new Url("http://bash.org.ru");
Імена з предметної області
List<Person> list =
   country.GetAllUnemployedPeople();
if (list.Count > 1000 * 1000)
{
   presidentFacebookPage.CurrentStatus =
       "Still working...";
}
Імена з предметної області
List<Person> unemployedPeople =
   country.GetAllUnemployedPeople();
if (unemployedPeople.Count > 1000 * 1000)
{
   presidentFacebookPage.CurrentStatus =
     "Still working...";
}
Імена з предметної області
if (pageIdsByUserId.Get(user.Id)
   .ContainsKey(page.Id)
   ) {...}

Map<int, Map<int, int>> pageIdsByUserId;


if (user.HasAccessTo(page))
{...}
Типові імена
• Імена змінних
  customer, currentPosition, isCompleted, result
• Імена класів – іменники
  Customer, UrlParser, Page, SortAlgorithm
• Імена методів – дієслова
  GetCustomers(), CreateDirectory(),
  OpenSocket(), Save(), Close()
Ваш код будуть читати
Функції
Розмір має значення
• Максимальний: 20 рядків
• Оптимальний: <= 5 рядків
• Рівень відступів: <= 2
Коротка функція
if (user.IsAuthenticated)
{
       SendProcessingCompletedEmail();
}
else
{
       RedirectUserToLoginForm(user);
}

Сприяє документуванню коду
Рівень абстракції
• Функція виконує лише одну операцію
• Всередині функції – один рівень абстракції
Рівень абстракції
public void SynchronizeNewTasks()
{
  string database = "DBGLOBAL";
  if (user.HasAttribute("LOCAL"))
  {
     database = service.GetDatabaseBaseName() +
        "_LOCAL";
  }
  if (user.Tasks.ContainsNewTasks())
  {
     SaveNewTasks(database, user.Tasks.GetNewTasks());
  }
}
Рівень абстракції
public void SynchronizeNewTasks()
{
  if (user.Tasks.ContainsNewTasks())
  {
     string database = GetDatabaseForUser(
        user);
     SaveNewTasks(database,
        user.Tasks.GetNewTasks());
  }
}
Аргументи функцій
•   Без аргументів, Save() – найкращі :)
•   Один аргумент, Send(address) – теж нічого
•   Два, Copy(source, destination) – ОК
•   Три – вже не дуже
•   Більше – значно погіршують читабельність
    :(
Булеві аргументи
char[] source = ...
char[] destination = ...
Copy(source, destination, true);


                           :(
Булеві аргументи
List<Task> tasks = ...;
Storage storage = ...;
SaveNewTasks(tasks,
   storage,
   true,
   false,
   false,
   true,                   :(
   true);
Вихідні аргументи
byte[] fileContent = ...
byte[] compressedContent;
Compress(fileContent, out compressedContent);
Побічні ефекти
public bool IsPasswordValid(string userName, string password)
{
  User user = Database.FindUserByName(userName);
  string encryptedPassword = Encryptor.Encrypt(password);
  bool result = user.EncryptedPassword == encryptedPassword;
  if (result)
  {
     Session.Initialize();
  }
  return result;
}
Shared state
• Мінімізуйте спільні дані
Exceptions замість кодів помилок
if (FindUserByName(userName, out user) == STATUS_OK)
{
   if (Encrypt(password, out encryptedPassword) == STATUS_OK)
   {
       bool result = user.EncryptedPassword == encryptedPassword;
       if (result)
       {
          if (Session.Initialize() == STATUS_OK)
             return true;
          else
             LogError(...);
       }
     ...
Обробляйте помилки



                                  http://stackoverflow.com
...
// Catching exceptions is for communists
...
                                     Wrong!
Граничні умови
• Враховуйте граничні умови
• Тестуйте граничні умови

public void Sort(int[] array)
{
  ...
}
Непотрібний код
• Функції, які не ніде не використовуються –
  видаляйте їх!
• Код, який ніколи не викликається –
  видаляйте його!
• Історія – в системі контролю версій
Здоровий глузд
• Код не повинен викликати здивування
• Поведінка має бути очевидна
• «Ви працюєте з чистим кодом, якщо кожна
  функція робить приблизно те, що ви
  очікуєте»
Ваш код будуть читати
Коментарі
http://stackoverflow.com




...
/////////////////////////////////////// this is a well commented line
...
Про коментарі
• Надавайте перевагу коду
• Коментуйте те, що не можна виразити в
  коді
• Проблема коментарів – супровід
• Неточні коментарі – гірше відсутності
  коментарів
• Коментарі не компенсують поганого коду
// check if we should redirect to another URL
if (server.HasResponse &&
    server.HttpResponseCode == 301)…

vs.

bool isRedirectNeeded = server.HasResponse &&
    server.HttpResponseCode == 301;
if (isRedirectNeeded)…


vs.

if (server.IsRedirectNeeded())…
Як коментувати
• Коментуйте публічний API
• Коментуйте внутрішній API тільки якщо він
  складний
• Не використовуйте коментар там, де можна
  використати функцію або змінну
• Видаляйте закоментований код
Класи
Single responsibility
• Класи повинні бути компактні
• Компактність визначається кількістю
  відповідальностей (responsibilities)
• Клас повинен мати одну відповідальність
  (single responsibility)
• Клас повинен мати одну причину для зміни
• Багато компактних класів
if-statements
   • Чим більше if-statements, тим більше
     потенційних помилок         if (_serviceType == "analysis")
                                                        return 20;
public int GetHours()                            }
  {                                              else //i.e. LARGE
     if (_numberOfManuals <= SMALL)              {
     {                                              if (_serviceType == "writing")
         if (_serviceType == "writing")                 return (SMALL * 30) + (20 *
             return 30 * _numberOfManuals; (MEDIUM - SMALL)) + (10 *
         if (_serviceType == "analysis")   _numberOfManuals - MEDIUM);
             return 10;                             if (_serviceType == "analysis")
     }                                                  return 30;
     else if (_numberOfManuals <= MEDIUM)        }
     {                                           return 0; //Just a default fallback
         if (_serviceType == "writing")    for this contrived example
             return (SMALL * 30) + (20 *      }
_numberOfManuals - SMALL);
Ваш код будуть читати
Ще кілька думок
Робота
• Робота розробника не закінчується після
  того, коли програма запрацювала
• Після цього потрібно покращити структуру і
  чистоту коду
Правило
• Дотримуйтесь «правила бойскаута»

 кожен раз коли ви працюєте з кодом,
 залишайте його трохи чистішим, ніж він був
 до цього
Це просто
• Переважно неважко покращити код
• Лише трохи переіменувать, введення нових
  функцій, трохи реструктуризації
• Це не rocket science
• Навіть якщо це не просто, ...
• ... це все одно цікаво
• Чому б цим не зайнятись?
Тести
• Чистка коду тісно пов’язана з тестами
• Тести – впевненість
Код – це ще не все
•   Управління
•   Маркетинг
•   Команда
•   Комунікації
•   Бачення
•   Замовник
Професіоналізм
• Будьте професіоналом
• Професіонали не пишуть неякісний код
• Якщо професіонал написав неякісний код,
  він його почистить
Книги
 Code Complete,
 Steve McConnell



 Clean Code,
 Robert C. Martin



 Code Craft,
 Pete Goodliffe

Mais conteúdo relacionado

Destaque

Apresentação gn fe_2012ok-1
Apresentação gn fe_2012ok-1Apresentação gn fe_2012ok-1
Apresentação gn fe_2012ok-1
AgenciaGH
 
SRJ_Supplement_P2
SRJ_Supplement_P2SRJ_Supplement_P2
SRJ_Supplement_P2
Shajahan VA
 
Geotecnologias e desastres naturais
Geotecnologias e desastres naturaisGeotecnologias e desastres naturais
Geotecnologias e desastres naturais
Maria José Brollo
 

Destaque (20)

Laptops na Sala de Aula. E agora?
Laptops na Sala de Aula. E agora?Laptops na Sala de Aula. E agora?
Laptops na Sala de Aula. E agora?
 
Apresentação gn fe_2012ok-1
Apresentação gn fe_2012ok-1Apresentação gn fe_2012ok-1
Apresentação gn fe_2012ok-1
 
TALLER DE ERGONOMIA LABORAL
TALLER DE ERGONOMIA LABORALTALLER DE ERGONOMIA LABORAL
TALLER DE ERGONOMIA LABORAL
 
Bullying
BullyingBullying
Bullying
 
Santoro et al 13 cbge
Santoro et al 13 cbgeSantoro et al 13 cbge
Santoro et al 13 cbge
 
Ejemplo spectacle
Ejemplo spectacle Ejemplo spectacle
Ejemplo spectacle
 
Violação Doméstica
Violação Doméstica Violação Doméstica
Violação Doméstica
 
SRJ_Supplement_P2
SRJ_Supplement_P2SRJ_Supplement_P2
SRJ_Supplement_P2
 
Artigo_Santoro et al
Artigo_Santoro et alArtigo_Santoro et al
Artigo_Santoro et al
 
Cómo hacer una brújula casera
Cómo hacer una brújula caseraCómo hacer una brújula casera
Cómo hacer una brújula casera
 
Elianetarefawriter
ElianetarefawriterElianetarefawriter
Elianetarefawriter
 
PP Blogger
PP BloggerPP Blogger
PP Blogger
 
Reddeblogs
ReddeblogsReddeblogs
Reddeblogs
 
Geotecnologias e desastres naturais
Geotecnologias e desastres naturaisGeotecnologias e desastres naturais
Geotecnologias e desastres naturais
 
Sintonizados na rádio peão
Sintonizados na rádio peãoSintonizados na rádio peão
Sintonizados na rádio peão
 
Alex 13
Alex 13Alex 13
Alex 13
 
Art 6 Thomaz
Art 6 ThomazArt 6 Thomaz
Art 6 Thomaz
 
Aprimorando a percepção
Aprimorando a percepçãoAprimorando a percepção
Aprimorando a percepção
 
Jardim do Ser - Apresentação Institucional
Jardim do Ser - Apresentação InstitucionalJardim do Ser - Apresentação Institucional
Jardim do Ser - Apresentação Institucional
 
Precentacion maria jose
Precentacion maria josePrecentacion maria jose
Precentacion maria jose
 

Semelhante a Clean code (UA)

Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
Dmitry Chabanenko
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
 
Lec10 11 ado-net
Lec10 11 ado-netLec10 11 ado-net
Lec10 11 ado-net
cit-cit
 
Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1
rznz
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
Ann Eres
 

Semelhante a Clean code (UA) (20)

Practices
PracticesPractices
Practices
 
Play Mongodb
Play MongodbPlay Mongodb
Play Mongodb
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
 
Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
Automated testing
Automated testingAutomated testing
Automated testing
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
Модулі Python
Модулі PythonМодулі Python
Модулі Python
 
Lec10 11 ado-net
Lec10 11 ado-netLec10 11 ado-net
Lec10 11 ado-net
 
Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.
 
Руйнуємо .NET Міфи
Руйнуємо .NET МіфиРуйнуємо .NET Міфи
Руйнуємо .NET Міфи
 
3018 1
3018 13018 1
3018 1
 
Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1Основи програмування .Паскаль ч.1
Основи програмування .Паскаль ч.1
 
Паскаль
ПаскальПаскаль
Паскаль
 
Phpunit модульне тестування
Phpunit модульне тестуванняPhpunit модульне тестування
Phpunit модульне тестування
 
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
 
JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basisJavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
 
07 Containers
07 Containers07 Containers
07 Containers
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
Основи мови Ci
Основи мови CiОснови мови Ci
Основи мови Ci
 

Clean code (UA)

  • 1. Якісний код Аудиторія: розробники Олександр Павлишак, 2010 pavlyshak@gmail.com
  • 2. Чому «якісний код»? • Maintainability • >50% – Зміни – Багфікси – Підтримка • Ітеративні методи розробки
  • 3. Maintainability == $ Maintainability == Якісний код Якісний код == $$
  • 4. Стандартні питання до розробника • Що робить система, коли відбувається Х? • Як конкретно працює функціональність Y? • Звідки дістаються опції Z? • Скільки часу займе реалізувати Х?
  • 5. Де відповіді? • В специфікації • Якщо у вас вона є ;) • В коді • Код є завжди • Only the Code Tells the Truth
  • 6. В реальному житті • Неякісний код сповільнює розробку • Щоб дотриматись графіка, розробники швидко пишуть неякісний код Парадокс!
  • 7. Якісний код • Як писати якісний код? • Не пишіть поганий код
  • 9. Осмислені іменa public void Copy(char[] a1, char[] a2) { for (int i = 0; i < a1.Length; i++) { a2[i] = a1[i]; } }
  • 10. Осмислені іменa public void Copy(char[] source, char[] destination) { for (int i = 0; i < source.Length; i++) { destination[i] = source[i]; } }
  • 11. Ім’я відображає наміри і суть • d, tot, res, srv, c, cc, c1, c2 – BAD! • createdDate, totalCount, result, storageService, characters – GOOD! • Довге змістовне ім’я краще короткого незрозумілого • Змістовне ім’я краще чисельної константи
  • 12. Константи ... if (!resource.Exists) { result = 404; } else if (resource.WasMoved) { result = 301; } else if (user == null) { result = 401; } ...
  • 13. Константи ... if (!resource.Exists) { result = HttpStatusCode.NotFound; } else if (resource.WasMoved) { result = HttpStatusCode.MovedPermanently; } else if (user == null) { result = HttpStatusCode.Unauthorized; } ...
  • 14. Коротке ім’я – коротка видимість int[] elements = … for (int i = 0; i < elements.Count(); i++) { elements[i] = elements[i] * 2; }
  • 15. Послідовні імена • Get, Fetch, Retrieve, Obtain, Acquire Feed feed = FeedService.ObtainSyndicationFeed(); if (feed.IsValid) { Storage feedStorage = GetFileStorage(path); List<Post> posts = feed.RetrievePosts(); feedStorage.Save(posts); } • Виберіть одне і послідовно дотримуйтесь його
  • 16. Надлишковість • nameString, customersArray • sName, iCount, arrCustomers string nameString = "Kenny"; string[] girlsArray = FindAllAttractiveGirls(); FileStream ouputFile = File.Open("c:autoexec.bat"); Url urlToBashOrg = new Url("http://bash.org.ru");
  • 17. Імена з предметної області List<Person> list = country.GetAllUnemployedPeople(); if (list.Count > 1000 * 1000) { presidentFacebookPage.CurrentStatus = "Still working..."; }
  • 18. Імена з предметної області List<Person> unemployedPeople = country.GetAllUnemployedPeople(); if (unemployedPeople.Count > 1000 * 1000) { presidentFacebookPage.CurrentStatus = "Still working..."; }
  • 19. Імена з предметної області if (pageIdsByUserId.Get(user.Id) .ContainsKey(page.Id) ) {...} Map<int, Map<int, int>> pageIdsByUserId; if (user.HasAccessTo(page)) {...}
  • 20. Типові імена • Імена змінних customer, currentPosition, isCompleted, result • Імена класів – іменники Customer, UrlParser, Page, SortAlgorithm • Імена методів – дієслова GetCustomers(), CreateDirectory(), OpenSocket(), Save(), Close()
  • 23. Розмір має значення • Максимальний: 20 рядків • Оптимальний: <= 5 рядків • Рівень відступів: <= 2
  • 24. Коротка функція if (user.IsAuthenticated) { SendProcessingCompletedEmail(); } else { RedirectUserToLoginForm(user); } Сприяє документуванню коду
  • 25. Рівень абстракції • Функція виконує лише одну операцію • Всередині функції – один рівень абстракції
  • 26. Рівень абстракції public void SynchronizeNewTasks() { string database = "DBGLOBAL"; if (user.HasAttribute("LOCAL")) { database = service.GetDatabaseBaseName() + "_LOCAL"; } if (user.Tasks.ContainsNewTasks()) { SaveNewTasks(database, user.Tasks.GetNewTasks()); } }
  • 27. Рівень абстракції public void SynchronizeNewTasks() { if (user.Tasks.ContainsNewTasks()) { string database = GetDatabaseForUser( user); SaveNewTasks(database, user.Tasks.GetNewTasks()); } }
  • 28. Аргументи функцій • Без аргументів, Save() – найкращі :) • Один аргумент, Send(address) – теж нічого • Два, Copy(source, destination) – ОК • Три – вже не дуже • Більше – значно погіршують читабельність :(
  • 29. Булеві аргументи char[] source = ... char[] destination = ... Copy(source, destination, true); :(
  • 30. Булеві аргументи List<Task> tasks = ...; Storage storage = ...; SaveNewTasks(tasks, storage, true, false, false, true, :( true);
  • 31. Вихідні аргументи byte[] fileContent = ... byte[] compressedContent; Compress(fileContent, out compressedContent);
  • 32. Побічні ефекти public bool IsPasswordValid(string userName, string password) { User user = Database.FindUserByName(userName); string encryptedPassword = Encryptor.Encrypt(password); bool result = user.EncryptedPassword == encryptedPassword; if (result) { Session.Initialize(); } return result; }
  • 33. Shared state • Мінімізуйте спільні дані
  • 34. Exceptions замість кодів помилок if (FindUserByName(userName, out user) == STATUS_OK) { if (Encrypt(password, out encryptedPassword) == STATUS_OK) { bool result = user.EncryptedPassword == encryptedPassword; if (result) { if (Session.Initialize() == STATUS_OK) return true; else LogError(...); } ...
  • 35. Обробляйте помилки http://stackoverflow.com ... // Catching exceptions is for communists ... Wrong!
  • 36. Граничні умови • Враховуйте граничні умови • Тестуйте граничні умови public void Sort(int[] array) { ... }
  • 37. Непотрібний код • Функції, які не ніде не використовуються – видаляйте їх! • Код, який ніколи не викликається – видаляйте його! • Історія – в системі контролю версій
  • 38. Здоровий глузд • Код не повинен викликати здивування • Поведінка має бути очевидна • «Ви працюєте з чистим кодом, якщо кожна функція робить приблизно те, що ви очікуєте»
  • 42. Про коментарі • Надавайте перевагу коду • Коментуйте те, що не можна виразити в коді • Проблема коментарів – супровід • Неточні коментарі – гірше відсутності коментарів • Коментарі не компенсують поганого коду
  • 43. // check if we should redirect to another URL if (server.HasResponse && server.HttpResponseCode == 301)… vs. bool isRedirectNeeded = server.HasResponse && server.HttpResponseCode == 301; if (isRedirectNeeded)… vs. if (server.IsRedirectNeeded())…
  • 44. Як коментувати • Коментуйте публічний API • Коментуйте внутрішній API тільки якщо він складний • Не використовуйте коментар там, де можна використати функцію або змінну • Видаляйте закоментований код
  • 46. Single responsibility • Класи повинні бути компактні • Компактність визначається кількістю відповідальностей (responsibilities) • Клас повинен мати одну відповідальність (single responsibility) • Клас повинен мати одну причину для зміни • Багато компактних класів
  • 47. if-statements • Чим більше if-statements, тим більше потенційних помилок if (_serviceType == "analysis") return 20; public int GetHours() } { else //i.e. LARGE if (_numberOfManuals <= SMALL) { { if (_serviceType == "writing") if (_serviceType == "writing") return (SMALL * 30) + (20 * return 30 * _numberOfManuals; (MEDIUM - SMALL)) + (10 * if (_serviceType == "analysis") _numberOfManuals - MEDIUM); return 10; if (_serviceType == "analysis") } return 30; else if (_numberOfManuals <= MEDIUM) } { return 0; //Just a default fallback if (_serviceType == "writing") for this contrived example return (SMALL * 30) + (20 * } _numberOfManuals - SMALL);
  • 50. Робота • Робота розробника не закінчується після того, коли програма запрацювала • Після цього потрібно покращити структуру і чистоту коду
  • 51. Правило • Дотримуйтесь «правила бойскаута» кожен раз коли ви працюєте з кодом, залишайте його трохи чистішим, ніж він був до цього
  • 52. Це просто • Переважно неважко покращити код • Лише трохи переіменувать, введення нових функцій, трохи реструктуризації • Це не rocket science • Навіть якщо це не просто, ... • ... це все одно цікаво • Чому б цим не зайнятись?
  • 53. Тести • Чистка коду тісно пов’язана з тестами • Тести – впевненість
  • 54. Код – це ще не все • Управління • Маркетинг • Команда • Комунікації • Бачення • Замовник
  • 55. Професіоналізм • Будьте професіоналом • Професіонали не пишуть неякісний код • Якщо професіонал написав неякісний код, він його почистить
  • 56. Книги Code Complete, Steve McConnell Clean Code, Robert C. Martin Code Craft, Pete Goodliffe