User Эллеонора Керри
Эллеонора Керри
41 уровень

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

Статья из группы Random

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, когда очередь пуста.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ