Як розуміти чужий код, dou
Перш ніж перейти до купи тексту, подивіться на код і зрозумійте, що він робить:
Таке пишуть розробники. Хтось не зрозумів взагалі, хтось тільки здогадується, що робить цей код. Але є спосіб зрозуміти його. Про нього буде нижче.
1. Код дістається у спадок. Коли ви дописуєте за кимось, і вам потрібно оцінити, скільки часу займе доопрацювання.
2. Ваш код, дописаний кимось, в який вносили зміни інші розробники, і вам необхідно зрозуміти, що вони там дописали.
3. Code review. Відрізняється від перших двох тим, що його потрібно проводити до того, як код потрапляє в репозитарій / продакшн.
Що потрібно для розуміння чужого коду?
Перша проблема, з якою ви стикаєтеся, дивлячись на чужій код, - визначити, де потрібно вносити зміни. Для цього використовується пошук за різними критеріями.
Третя проблема - незрозуміла логіка. Ви можете прочитати код, але не розумієте, навіщо було зроблено саме так.
Як знайти потрібне місце в коді?
Знайшли потрібне місце, але як зрозуміти логіку?
Є у нас ось такий код:
Маємо ініціалізацію масиву, який називається «їжа», потім створюємо об'єкт «кішка», а потім чомусь прирівнюємо кішку до їжі і заносимо її в масив їжі. Ця логіка зрозуміла тільки якщо наш сайт продає шаурму. Навіть якщо ваше завдання - створити ще одного кота, ви його додасте, але він знову буде занесений в масив їжі. І чому так - залишиться загадкою.
Хороша практика - перечитати вимоги, бути в курсі предметної області і зрозуміти, чому було реалізовано саме так.
Приклад складний з початку статті:
Ніхто не відміняв старий добрий debugger і послідовне виконання, але знання предметної області все одно потрібно.
Причини виникнення складного коду
Як ми називаємо поганий код?
- «Спагеті-код». Чи не найпоширеніший варіант. Три методу, кожен з яких щось робить. У тілі функції йдуть виклики інших методів, і навіть очима неможливо простежити ланцюжок, що звідки викликається. Код переплутано, як спагеті в мисці.
- «Милиці». Такого в коді дуже багато. Розробник написав цикл, в якому він щось робить з елементами масиву, за яким йде цей цикл. І попереджає, що виклик методу doSomething при певному значенні вивалює помилку. І він просто пише, що якщо значення масиву - 4, треба пропустити його і перейти до наступного. Він передбачив цю ситуацію і зробив «підпірку», щоб не падала помилка. Але цим він створив інші ситуації, які створять інші виняткові ситуації, коли щось не здасться або здасться зайве. Розробник ж продовжить дописувати інші милиці, перекриваючи створені помилки.
Як далі жити?
Реальні приклади легко знайти Можете почитати якщо цікаво. Тобто реального прикладу (добре б ще й із зазначенням того що ось тут ми назвали функцію ххх, а тут проінлайнілі 100500 рядків) немає і не буде?
.
UPD.
Останнє, що пам'ятаю точно бачив з відкритого коду - boofcv. Ось смачний шматок гуана. Якщо я правильно знайшов.
github.com/. ockPyramid.java
Що тут зроблено для оптимізації?
Той, хто шукає та знайде. Цей код працює дуже швидко, там немає зайвих аллокейшнов, все буфери переіспользуются, частина операцій попередньо порахована за межами циклів (для чого використовуються проміжні змінні без осмислених назв), навіть округлення вважається швидше там, де можна скористатися тим фактом, що число невід'ємне.
Загалом, якщо ви зробите це краще / швидше / красивіше, то я (і далеко не тільки я) буду радий, вдячний і з радістю перейду на вашу бібліотеку. Тільки не трактуйте це як «спершу доможися» - це дійсно було б дуже корисно, та й рішення подібних завдань цікавіше 95 (а може і 99) відсотків того, що у нас роблять.
Якщо ви, все ж, вважаєте, що немає прощення написав ці рядки, то пропоную припинити дискусію як безблагодатності.
якщо в коді немає коментів про нетривіальну логіку, якщо немає посилань на документи які допоможуть розібратися в цій нетривіальною логікою, то чому цей код не говнокод? сьогодні над кодом працює спец зі знаннями в доменній області якому ці каменти не потрібні, а завтра він на лікарняному і його підміняє рядовий формошлеп вася. але необхідність підтримувати код нікуди не поділася. і ось тут каменти і посилання на потрібні ресурси для формошлепа васи можуть допомогти заощадити купу часу і пофиксить тривіальний (за мірками спеца) баг.
Почнемо з того, що я ніколи не візьму на проект, в якому є нетривіальна логіка, формошлепа Васю - нехай собі пише опердень.
Тут все ось пишуть про патерни, але ж вони теж неочевидні деяким формошлепам. Чи не писати ж в кожному візитор посилання на вікі або на книжку GoF на Амазон.