JavaRush /Java блог /Random UA /Кава-брейк #65. 5 корисних порад щодо підтримки чужого ко...

Кава-брейк #65. 5 корисних порад щодо підтримки чужого коду. Java Collection та відповіді на найпоширеніші питання на співбесідах

Стаття з групи Random UA

5 корисних порад щодо підтримки чужого коду

Джерело: Dev.to З вашої команди хтось йде? Вам передають застарілий код? Ви змінюєте місце роботи? Це лише деякі причини, через які розробники можуть зіткнутися із завданням підтримки чужого коду.Кава-брейк #65.  5 корисних порад щодо підтримки чужого коду.  Java Collection та відповіді на найпоширеніші питання на співбесідах - 1Робота з кодом, який писав хтось інший, може призвести до деяких проблем. Код може відноситися до незнайомої вам технології. Можливо, цей код потребує доопрацювання. Або може виникнути потреба терміново виправити баг, виявлений у старій кодовій базі. Щоб краще справлятися з такими завданнями, важливо знати про можливі проблеми та мати систематичний спосіб їх вирішення. Якщо ви професійний розробник, ви вже напевно стикалися з подібними ситуаціями. Але якщо ні – повірте мені, це лише питання часу! У цій статті ми розглянемо кілька порад, які можуть полегшити роботу з legacy-кодом.

1. Проведіть сеанс передачі коду з автором

Якщо у вас ще є контакт із людиною, яка написала цей код, проведіть з ним сеанс передачі. Або два! А може, навіть і три. Використовуйте ці сеанси передачі як спосіб прискорити ознайомлення з кодовою базою. Інакше вам доведеться розумітися на всьому самостійно, а це займе більше часу. Розробник, який створив цей код, може розповісти вам про його логіку, а також вказати на приховані секрети. Перед сеансом передачі обов'язково самі перегляньте код і запишіть питання, які у вас виникли. Так, під час спільного перегляду коду з його автором ви не забудете прояснити всі потрібні деталі. Зрозуміло, що під час спільних сеансів ведіть записи. Передача коду з його автором - ймовірно, найшвидший спосіб познайомитися з новою для вас кодовою базою. Тому, якщо у вас ще є можливість звернутися до цього розробника, Обов'язково нею скористайтеся. Якщо ваш колега збирається залишити компанію, подбайте про те, щоб передача коду пройшла до його відходу. Бувають і інші ситуації, коли корисно пройтися кодовою базою разом з кимось, хто її добре знає. Наприклад, якщо ви змінабо команду, потрібно, щоб хтось із нових колег розповів вам про структуру коду. Це прискорить ваше знайомство з новим кодом.

2. Прочитайте всю доступну документацію

Документація — це всі доступні документи щодо проекту, для якого було написано код. Специфікації проекту? Специфікація програми? Файли README? Прочитайте це все. Час, витрачений на читання цих документів, ви заощадите у майбутньому. Замість витрачати величезну кількість часу на спроби з'ясувати, чому код був реалізований саме так, просто прочитайте README. Замість того, щоб намагатися самостійно зрозуміти призначення розділів коду, все це можна дізнатися у специфікаціях програмного забезпечення. Читати документацію важливо, навіть якщо ви провели сеанс передачі коду з його автором. Усі ці документи написані не так. А сеанси передачі навряд чи можуть охопити все. Читання документації є особливо важливим для застарілого програмного забезпечення. Йдеться про випадки, коли у вас немає шансу зустрітись з автором коду. Оскільки сеанс передачі неможливий, все, що у вас є, це вихідний код і будь-яка доступна документація. Остання порада з цього приводу: пам'ятайте, що файли README не дарма називаються README (прочитай мене).

3. Запустіть програму та попрацюйте з нею

Цю пораду треба розуміти буквально. Запустіть код і спробуйте використати програму так, як задумано. Тож ви зможете краще зрозуміти, що воно робить. Це може здатися очевидним, але практика показує, що багато хто ігнорує цей етап. Багато розробників роблять помилку, складаючи уявлення про програму лише за її кодом. Обов'язково запустіть програму та оцініть її як звичайний користувач. Так ви отримаєте загальне розуміння того, що насправді робить додаток, а також уявлення про його функції та обмеження. В результаті вам буде простіше розібратися у коді. Це також стосується і софту, написаного для певного обладнання або платформ. Отримайте доступ до всього необхідного та запустіть програму на цих платформах. Якщо ви намагаєтеся виправити помилку, запуск коду стане для вас логічним першим кроком у процесі налагодження.

4. Тестуйте, тестуйте, тестуйте!

Якщо ви маєте справу з незнайомою кодовою базою, перш ніж вносити будь-які зміни, перевірте наявність тестів для перевірки працездатності програми. Тести допоможуть підтвердити, що після внесення змін нічого не зламалося. Безпечно внести зміни буває набагато складніше, ніж просто ознайомитися з чужим кодом. І якщо припустити, що вам передали код лише для виправлення багів та внесення покращень, то наявність тестів має вирішальне значення. Якщо тестів немає, спробуйте їх написати самостійно. Це можуть бути модульні випробування, димові, ручні або автоматизовані. Будь-яке тестування зазвичай краще, ніж його відсутність.

5. Прийміть виклик

Взявшись за підтримку чужого коду, спробуйте прийняти це як особистий виклик. По-перше, ви вдосконалите навички читання та інтерпретації чужого коду. Це дозволить вам краще вловлювати ідеї інших розробників. Завдяки практиці ви зможете легше справлятися із завданнями підтримки програм. По-друге, підтримуючи чужий код, ви зможете запозичити корисні методи та прийоми, які покращать ваш власний код. Читання незнайомого коду вважатимуться методом непрямого навчання. Тільки будьте обережні - вибирайте лише ті методи, які вважаються передовими, і уникайте не дуже добрих. Усвідомлення того, що зрештою ви отримаєте вигоду від цього досвіду, має вас мотивувати. Тож не бійтеся і приймайте кинутий вам виклик!

Висновок

Підтримка коду, написаного кимось іншим, безумовно, пов'язана з багатьма проблемами. Але це лише одна сторона роботи розробника, з якою нам усім коли-небудь доведеться зіткнутися. І ви зможете куди краще підготуватися до роботи з чужим кодом, якщо не тільки слідуватимете порадам з цієї статті, але й розробите власні систематичні методи при роботі з незнайомою кодовою базою.

Java Collection та відповіді на найпоширеніші питання на співбесідах

Джерело: DZone Щоб закріпити ваші знання в Java, давайте пригадаємо Java Collection і відповімо на деякі питання, які ставлять новачкам на технічних співбесідах.

Collections в Java

Java Collection – це структура, яка підтримує архітектуру зберігання та керування групами об'єктів. Структура колекцій із класами та інтерфейсами визначена в JDK 1.2. Двома основними інтерфейсами класів Java Collection є інтерфейс Collection (java.util.Collection) та інтерфейс Map (java.util.Map). Колекції Java можуть виконувати операції з даними, такі як пошук, сортування, вставка, маніпулювання тощо. Java Collection Framework надає такі інтерфейси, як Set, List, Queue, Deque, та класи, такі як ArrayList, Vector, LinkedList, HashSet, PriorityQueue, TreeSet та LinkedHashSet.

Необхідність в окремій структурі колекцій

Якщо ми не використовуємо структуру колекцій, стандартними методами групування об'єктів Java є масиви, вектори або хеш-таблиці. Усі вони мають спільного інтерфейсу. Усі реалізації визначаються незалежно, і з-поміж них немає кореляції. Таким чином, дуже важко запам'ятати всі різні методи, синтаксис і конструктори, присутні в різних класах. Наприклад, щоб додати елемент у вектор, ми використовуємо функцію addElement() , тоді як додавання елемента до Hashtable ми використовуємо функцію put() . Переваги системи колекцій:
  • Знижує навантаження в процесі програмування: розробник може зосередитися більше на найкращому використанні колекції, а не на дизайні колекції. Це допомагає у реалізації абстракції.
  • Покращує швидкість виконання програми: колекції забезпечують високопродуктивну реалізацію структур даних, що підвищує продуктивність.
Оскільки Java є широко використовуваною мовою програмування, безліч компаній створюють свої продукти саме цією мовою. Тому давайте пройдемося за відповідями на питання базового рівня Java, які допоможуть вам успішно пройти співбесіду.

Деякі питання, що часто ставляться на співбесіді для новачків

Питання 1. Що таке фреймворк Java?

Відповідь: Фреймворк (структура) – це набір класів та інтерфейсів, що підтримують готову архітектуру. Оптимальний об'єктно-орієнтований дизайн завжди включає фреймворк з набором класів, тому всі класи виконують однакові завдання.

Запитання 2. Що таке фреймворк колекцій у Java?

Відповідь: Java Collections Framework – це набір інтерфейсів та класів, які допомагають ефективно зберігати та обробляти дані. Java Collection Framework має такі інтерфейси, як Set, List, Queue, Deque, та класи, такі як ArrayList, Vector, LinkedList, HashSet, PriorityQueue, TreeSet та LinkedHashSet.

Питання 3: Які відмінності між ArrayList і Vector Java Collection Framework?

Відповідь: ArrayList:
  • Чи не синхронізується.
  • Може збільшити розмір на 50% від розміру масиву.
  • Чи не потокобезпечний (thread-safe).
  • Чи не є успадкованим класом (legacy class).
Vector:
  • Синхронізується.
  • Може вдвічі збільшити розмір.
  • Потокобезпечний.
  • Успадкований клас.

Питання 4. У чому відмінність між Iterator і Enumeration?

Відповідь: Iterator:
  • Може працювати як із застарілими, так і з незастарілими елементами.
  • Він повільніший, ніж Enumeration.
  • Він може виконувати операції remove при обході колекції.
  • Він безвідмовний.
Enumeration (Перелічуваний тип):
  • Може переміщатися лише за застарілими елементами.
  • Він швидший, ніж ітератор.
  • Він може виконувати з колекцією тільки операції traverse.
  • Він не безвідмовний.

Питання 5. У чому різниця між LinkedList та ArrayList?

Відповідь: ArrayList:
  • Цей клас продає інтерфейс списку.
  • Цей клас використовує динамічний масив для зберігання елементів.
  • Операції вставки та видалення дорівнюють O (1) у кращому випадку та O (n) у гіршому випадку. Операція пошуку (тобто доступ до елемента за певним індексом) займає час O(1).
  • ArrayList краще працює при зберіганні даних та доступі до них.
LinkedList:
  • Цей клас реалізує як інтерфейс списку, і інтерфейс двосторонньої черги.
  • Цей клас використовує двозв'язковий список для зберігання елементів.
  • Операції вставки та видалення дають продуктивність O(1). Операція пошуку (тобто доступ до елемента за певним індексом) займає O(n) часу.
  • LinkedList краще працює при маніпулюванні збереженими даними.

Питання 6. Поясніть різницю між poll() та remove() у методі інтерфейсу черги (Queue).

Відповідь: Обидва методи повертають та видаляють заголовок черги. Вони відрізняються своєю поведінкою лише тоді, коли черга порожня; remove() видає виняток, тоді як poll() повертає null для порожньої черги.

Питання 7. У чому різниця між Comparable і Comparator.

Відповідь: Comparable:
  • Надає метод compareTo() для сортування елементів.
  • Є в пакеті java.lang.
  • Логіка сортування має бути у тому класі, чий об'єкт ми хочемо відсортувати.
  • Він забезпечує єдину послідовність сортування.
  • Фактичний клас змінено.
Comparator:
  • Надає метод compare() для сортування елементів.
  • Є у пакеті java.util.
  • Логіка сортування має бути у іншому класі, щоб писати різні сортування з урахуванням різних атрибутів об'єктів.
  • Він забезпечує кілька послідовностей сортування.
  • Фактичний клас не змінюється.

Питання 8. Що таке стек з погляду комп'ютерної пам'яті?

Відповідь: Стек — це особлива область пам'яті комп'ютера, де зберігаються тимчасові змінні, створені функцією. У стеку змінні оголошуються, зберігаються та ініціалізуються під час виконання.

Запитання 9. Складіть список із уявлень колекції в інтерфейсі Map.

Відповідь: Методи представлення колекції дозволяють переглядати map як колекцію трьома способами:
  • Key-set view: Набір ключів, що містяться в Map.
  • Value-set view: Колекція значень, що містяться в Map. Ця колекція не є набором, тому що кілька ключів можуть відображатися в тому самому значенні.
  • Entry-set view: набір пар "ключ-значення", що містяться в Map. Інтерфейс Map надає невеликий вкладений інтерфейс під назвою Map.Entry тип елементів у цьому наборі.

Запитання 10. Дайте визначення EnumSet.

Відповідь: Це реалізація набору (Set), яку можна використовувати з типами, що перераховуються. Всі елементи повинні відбуватися з одного типу, що перераховується, зазначеного явно або неявно. Чи не синхронізується. Ключі NULL не допускаються.

Питання 11. Які методи роблять збирання потокобезпечним?

Відповідь: Методи:
  • Collections.synchronizedList (list);
  • Collections.synchronizedMap (map);
  • Collections.synchronizedSet (set).

Питання 12. У чому різниця між Queue і Deque?

Відповідь: Queue:
  • Також відома як одностороння черга.
  • Елементи у черзі (Queue) додаються або видаляються з одного кінця.
  • Менш універсальна.
Deque:
  • Також відома як двостороння черга.
  • Елементи в черзі додаються з будь-якого кінця і можуть додаватися та видалятися з обох кінців.
  • Більш універсальна.

Питання 13. У чому різниця між hashmap і hashtable?

Відповідь: Hashmap:
  • Несинхронізована, не потокобезпечна.
  • Успадковує клас AbstractMap .
  • Допускає один ключ null і кілька значень null.
  • Обходить iterator.
Hashtable:
  • Синхронізований, потокобезпечний.
  • Успадковує клас Dictionary .
  • Не дозволяється використовувати ключ null або значення null.
  • Проходить enumerator та iterator.

Запитання 14. Що таке iterator?

Відповідь: Iterator() — це інтерфейс, який дає методи для перебору Collection. Він надає загальний спосіб обходу з використанням елементів колекції та реалізації шаблону проектування ітератора.

Запитання 15. Що таке Navigable Map?

Відповідь: Інтерфейс NavigableMap входить до Java Collection Framework та належить пакету java.util. Це підінтерфейс SortedMap, який надає зручні методи навігації, такі як lowerKey, floorKey, ceilingKey, and higherKey. Він також допомагає створити ще один Map із існуючого Map.

Запитання 16. Що таке peek() в інтерфейсі queue?

Відповідь: Peek() повертає початок Queue. Він не видаляє жодних елементів. Він повертає null, коли черга порожня.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ