SlideShare a Scribd company logo
1 of 58
Якісний код
Аудиторія: розробники
Олександр Павлишак, 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);
}
Сприяє документуванню коду
Good code
Beautiful
Easy to read
Easy to understand
Clean
Clear
Tested
Cohesive
Compact
Efficient
Obvious
Organic
Рівень абстракції
Функція виконує лише одну операцію
Всередині функції – один рівень абстракції
Рівень абстракції
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(...);
}
...
Обробляйте помилки
...
// Catching exceptions is for communists
...
Wrong!
http://stackoverflow.com
Граничні умови
Враховуйте граничні умови
Тестуйте граничні умови
public void Sort(int[] array)
{
...
}
Не дублюйте код
Непотрібний код
Функції, які не ніде не використовуються –
видаляйте їх!
Код, який ніколи не викликається – видаляйте
його!
Історія – в системі контролю версій
Здоровий глузд
Код не повинен викликати здивування
Поведінка має бути очевидна
«Ви працюєте з чистим кодом, якщо кожна
функція робить приблизно те, що ви очікуєте»
Ваш код будуть читати
Коментарі
...
/////////////////////////////////////// this is a well commented line
...
http://stackoverflow.com
Про коментарі
Надавайте перевагу коду
Коментуйте те, що не можна виразити в коді
Проблема коментарів – супровід
Неточні коментарі – гірше відсутності коментарів
Коментарі не компенсують поганого коду
vs.
if (server.IsRedirectNeeded())…
// check if we should redirect to another URL
if (server.HasResponse && 
    server.HttpResponseCode == 301)…
vs.
bool isRedirectNeeded = server.HasResponse && 
    server.HttpResponseCode == 301;
if (isRedirectNeeded)…
Як коментувати
Коментуйте публічний API
Коментуйте внутрішній API тільки якщо він
складний
Не використовуйте коментар там, де можна
використати функцію або змінну
Видаляйте закоментований код
Класи
Single responsibility
Класи повинні бути компактні
Компактність визначається кількістю
відповідальностей (responsibilities)
Клас повинен мати одну відповідальність
(single responsibility)
Клас повинен мати одну причину для зміни
Багато компактних класів
if-statements
Чим більше if-statements, тим більше
потенційних помилок
public int GetHours()
{
if (_numberOfManuals <= SMALL)
{
if (_serviceType == "writing")
return 30 * _numberOfManuals;
if (_serviceType == "analysis")
return 10;
}
else if (_numberOfManuals <= MEDIUM)
{
if (_serviceType == "writing")
return (SMALL * 30) + (20 *
_numberOfManuals - SMALL);
if (_serviceType == "analysis")
return 20;
}
else //i.e. LARGE
{
if (_serviceType == "writing")
return (SMALL * 30) + (20 *
(MEDIUM - SMALL)) + (10 *
_numberOfManuals - MEDIUM);
if (_serviceType == "analysis")
return 30;
}
return 0; //Just a default fallback
for this contrived example
}
Ваш код будуть читати
Ще кілька думок
Робота
Робота розробника не закінчується після того,
коли програма запрацювала
Після цього потрібно покращити структуру і
чистоту коду
Правило
Дотримуйтесь «правила бойскаута»
кожен раз коли ви працюєте з кодом,
залишайте його трохи чистішим, ніж він був
до цього
Це просто
Переважно неважко покращити код
Лише трохи переіменувать, введення нових
функцій, трохи реструктуризації
Це не rocket science
Навіть якщо це не просто, ...
... це все одно цікаво
Чому б цим не зайнятись?
Тести
Чистка коду тісно пов’язана з тестами
Тести – впевненість
Код – це ще не все
Управління
Маркетинг
Команда
Комунікації
Бачення
Замовник
Професіоналізм
Будьте професіоналом
Професіонали не пишуть неякісний код
Якщо професіонал написав неякісний код, він його
почистить
Література
Code Complete,
Steve McConnell
Clean Code,
Robert C. Martin
Code Craft,
Pete Goodliffe

More Related Content

Viewers also liked

Colloque Infoclio 2009
Colloque Infoclio 2009Colloque Infoclio 2009
Colloque Infoclio 2009infoclio.ch
 
T. Onnela E Learning History In Europe
T. Onnela   E Learning History In EuropeT. Onnela   E Learning History In Europe
T. Onnela E Learning History In Europeinfoclio.ch
 
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...infoclio.ch
 
In search for an appropriate tool for the humanities
In search for an appropriate tool for the humanitiesIn search for an appropriate tool for the humanities
In search for an appropriate tool for the humanitiesinfoclio.ch
 
Colloque infoclio.ch 2011
Colloque infoclio.ch 2011Colloque infoclio.ch 2011
Colloque infoclio.ch 2011infoclio.ch
 
Основи використання MVC
Основи використання MVCОснови використання MVC
Основи використання MVCIgor Bronovskyy
 
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...infoclio.ch
 
Prof. Susan Schreibman: History and future of DH
Prof. Susan Schreibman: History and  future of DHProf. Susan Schreibman: History and  future of DH
Prof. Susan Schreibman: History and future of DHinfoclio.ch
 
Leon Alberti Battista
Leon Alberti BattistaLeon Alberti Battista
Leon Alberti Battistahushaam
 
Sky farming
Sky farmingSky farming
Sky farminghushaam
 
Recreational spaces
Recreational spacesRecreational spaces
Recreational spaceshushaam
 

Viewers also liked (12)

Colloque Infoclio 2009
Colloque Infoclio 2009Colloque Infoclio 2009
Colloque Infoclio 2009
 
T. Onnela E Learning History In Europe
T. Onnela   E Learning History In EuropeT. Onnela   E Learning History In Europe
T. Onnela E Learning History In Europe
 
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...
Stuart Hamilton (IFLA) - Flexibility for better access: copyright Exceptions ...
 
In search for an appropriate tool for the humanities
In search for an appropriate tool for the humanitiesIn search for an appropriate tool for the humanities
In search for an appropriate tool for the humanities
 
Colloque infoclio.ch 2011
Colloque infoclio.ch 2011Colloque infoclio.ch 2011
Colloque infoclio.ch 2011
 
Основи використання MVC
Основи використання MVCОснови використання MVC
Основи використання MVC
 
What else
What elseWhat else
What else
 
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...
Gary Hall, Professor of Media and Cultural Studies, Conventry University – Op...
 
Prof. Susan Schreibman: History and future of DH
Prof. Susan Schreibman: History and  future of DHProf. Susan Schreibman: History and  future of DH
Prof. Susan Schreibman: History and future of DH
 
Leon Alberti Battista
Leon Alberti BattistaLeon Alberti Battista
Leon Alberti Battista
 
Sky farming
Sky farmingSky farming
Sky farming
 
Recreational spaces
Recreational spacesRecreational spaces
Recreational spaces
 

Similar to Чистий код

природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...Andrii Podanenko
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаютьсяcit-cit
 
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...GoQA
 
"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 KindritskyiFwdays
 
Net framework і c# module 10
Net framework і c# module 10Net framework і c# module 10
Net framework і c# module 10Andrii Hladkyi
 
Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.Elantix
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net eleksdev
 
CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"Bohdan Pashkovskyi
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basicseleksdev
 
NET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesNET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesAndrii Hladkyi
 
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиціРоман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиціGoQA
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex DevelopingRoman Shuper
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Dmitry Chabanenko
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3eleksdev
 

Similar to Чистий код (20)

природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
Practices
PracticesPractices
Practices
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
 
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
 
"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
 
Net framework і c# module 10
Net framework і c# module 10Net framework і c# module 10
Net framework і c# module 10
 
Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.
 
Design patterns part 1
Design patterns part 1Design patterns part 1
Design patterns part 1
 
10 asp.net
10 asp.net 10 asp.net
10 asp.net
 
CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basics
 
NET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesNET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. Interfaces
 
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиціРоман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
 
розробка-програм
розробка-програмрозробка-програм
розробка-програм
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
 
Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 

Чистий код

Editor's Notes

  1. &amp;lt;номер&amp;gt;
  2. &amp;lt;номер&amp;gt;
  3. &amp;lt;номер&amp;gt;
  4. &amp;lt;номер&amp;gt;
  5. &amp;lt;номер&amp;gt;
  6. &amp;lt;номер&amp;gt;
  7. &amp;lt;номер&amp;gt;
  8. &amp;lt;номер&amp;gt;
  9. &amp;lt;номер&amp;gt;
  10. &amp;lt;номер&amp;gt;
  11. &amp;lt;номер&amp;gt;
  12. &amp;lt;номер&amp;gt;
  13. &amp;lt;номер&amp;gt;
  14. &amp;lt;номер&amp;gt;
  15. &amp;lt;номер&amp;gt;
  16. &amp;lt;номер&amp;gt;
  17. &amp;lt;номер&amp;gt;
  18. &amp;lt;номер&amp;gt;
  19. &amp;lt;номер&amp;gt;
  20. &amp;lt;номер&amp;gt;
  21. &amp;lt;номер&amp;gt;
  22. &amp;lt;номер&amp;gt;
  23. &amp;lt;номер&amp;gt;
  24. &amp;lt;номер&amp;gt;
  25. &amp;lt;номер&amp;gt;
  26. &amp;lt;номер&amp;gt;
  27. &amp;lt;номер&amp;gt;
  28. &amp;lt;номер&amp;gt;
  29. &amp;lt;номер&amp;gt;
  30. &amp;lt;номер&amp;gt;
  31. &amp;lt;номер&amp;gt;
  32. &amp;lt;номер&amp;gt;
  33. &amp;lt;номер&amp;gt;
  34. &amp;lt;номер&amp;gt;
  35. &amp;lt;номер&amp;gt;
  36. &amp;lt;номер&amp;gt;