4. Стандартні питання до
розробника
Що робить система, коли відбувається Х?
Як конкретно працює функціональність Y?
Звідки дістаються
опції Z?
Скільки часу займе
реалізувати Х?
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);
}
Виберіть одне і послідовно дотримуйтесь його
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()
27. Рівень абстракції
public void SynchronizeNewTasks()
{
string database = "DBGLOBAL";
if (user.HasAttribute("LOCAL"))
{
database = service.GetDatabaseBaseName() +
"_LOCAL";
}
if (user.Tasks.ContainsNewTasks())
{
SaveNewTasks(database, user.Tasks.GetNewTasks());
}
}
28. Рівень абстракції
public void SynchronizeNewTasks()
{
if (user.Tasks.ContainsNewTasks())
{
string database = GetDatabaseForUser(
user);
SaveNewTasks(database,
user.Tasks.GetNewTasks());
}
}
29. Аргументи функцій
Без аргументів, Save() – найкращі :)
Один аргумент, Send(address) – теж нічого
Два, Copy(source, destination) – ОК
Три – вже не дуже
Більше – значно погіршують читабельність :(
35. 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(...);
}
...
39. Непотрібний код
Функції, які не ніде не використовуються –
видаляйте їх!
Код, який ніколи не викликається – видаляйте
його!
Історія – в системі контролю версій
40. Здоровий глузд
Код не повинен викликати здивування
Поведінка має бути очевидна
«Ви працюєте з чистим кодом, якщо кожна
функція робить приблизно те, що ви очікуєте»
44. Про коментарі
Надавайте перевагу коду
Коментуйте те, що не можна виразити в коді
Проблема коментарів – супровід
Неточні коментарі – гірше відсутності коментарів
Коментарі не компенсують поганого коду
46. Як коментувати
Коментуйте публічний API
Коментуйте внутрішній API тільки якщо він
складний
Не використовуйте коментар там, де можна
використати функцію або змінну
Видаляйте закоментований код
48. Single responsibility
Класи повинні бути компактні
Компактність визначається кількістю
відповідальностей (responsibilities)
Клас повинен мати одну відповідальність
(single responsibility)
Клас повинен мати одну причину для зміни
Багато компактних класів
49. 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
}
54. Це просто
Переважно неважко покращити код
Лише трохи переіменувать, введення нових
функцій, трохи реструктуризації
Це не rocket science
Навіть якщо це не просто, ...
... це все одно цікаво
Чому б цим не зайнятись?