Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Почему так не рекомендуется писать?

#java #android #задание_на_собеседовании


Делал тестовое задание на вакансию Junior Android разработчика, в коде была строчка:

ArrayList valNames = new ArrayList();


Мне сказали, что лучше писать так: 

List valNames = new ArrayList(); 


Потом в одной из статей на habrahabr.ru встретилась фраза:


  Подумаешь, большое дело, что человек не понимает почему нужно писать 
  List values = new ArrayList(); вместо ArrayList values = ….; Ну и кому
  же не хочется увидеть названия в стиле ArrayList arrayList = new
  ArrayList(); и улыбнуться. Жаль только, что с применением данного
  антипатерна, все эти, вызывающие улыбку, вещи обычно обнаруживаются
  после приблизительно месяца работы.


Объясните, почему так писать неправильно. Формально - ошибки нет?
    


Ответы

Ответ 1



Обычно это объясняется так: если кодер объявляет переменную типа ArrayList вместо List - он не понимает что все нужные ему методы уже есть в интерфейсе. Тем самым демонстрируется непонимание основных принципов проектирования, ведь ему на самом деле совсем не требуется именно ArrayList, он может использовать любую другую коллекцию! ... с той же асимптотикой операций... упс. На самом деле те, кто так пишет, защищаются от автоматических рефакторингов, способных преобразовать переменную конкретного типа в параметр метода, что проявит их непонимание основных принципов проектирования привыкли к IDE, которые подчеркивают такие места желтым и предлагают исправить тип переменной. Это просто привычка. Для большинства алгоритмов, выдумываемых на ходу, ArrayList<> является единственной коллекцией с адекватными временами выполнения операций и нет никакой разницы какого типа объявлять переменную. А вот за типами параметров методов или возвращаемых значений надо и правда следить внимательнее, выбирая наименьший подходящий интерфейс - это упростит стыковку кода, написанного разными программистами.

Ответ 2



Это носит больше религиозно/стилистический оттенок, нежели формальный. Объявление List шире чем декларация ArrayList, то есть когда человек пишет List он типа демонстрирует свою ООП сущность, как бы понимает, что underlying объект может быть и ArrayList и Vector и Stack и т.д. и декларируя List абстрагируется от конкретной реализации. На самом то деле, насколько это правильно или нет - напоминает дискуссии средневековых схоластов о сущности универсалий

Комментариев нет:

Отправить комментарий