Рефакторинг Java в отраслевые стандарты Generics - PullRequest
5 голосов
/ 27 февраля 2010

Кажется, есть некоторые споры по поводу рефакторинга, чтобы использовать дженерики Java в моей текущей команде. У меня вопрос: каковы текущие отраслевые стандарты с точки зрения рефакторинга старого кода Java, чтобы воспользоваться некоторыми из этих функций? Конечно, по отраслевым стандартам я имею в виду лучшие практики. Ссылка на книгу или сайт, на котором они перечислены, получит голос за ответ, поскольку это наименее субъективный способ решения этого вопроса.

Ответы [ 7 ]

8 голосов
/ 27 февраля 2010

Я не думаю, что слепое следование тому, что кто-то еще объявляет «лучшей практикой» или «отраслевым стандартом», является хорошей идеей.Вы в лучшем положении, чтобы решить, стоит ли менять код или нет.

Вопросы, на которые вам нужно ответить, - какие преимущества вы получите от обновления старого кода, сколько это будет стоить и каковыриски?

Основное преимущество заключается в улучшении проверки типов во время компиляции, которая должна помочь обнаруживать ошибки в новом коде, который использует обновленный код.Это может даже выделить ошибки в существующем коде.Код, который использует дженерики, хотя иногда и довольно многословный, обычно более читабелен, так как он явно указывает, какие типы допустимы в каких контекстах.Вам также больше не придется подавлять / игнорировать предупреждения компилятора.

Стоимость - это количество времени, которое потребуется для того, чтобы внести и протестировать необходимые изменения для введения обобщений.Каждый раз, когда вы вносите изменения в код, есть вероятность, что вы можете внести ошибки, так что это риск.Преимущества перевешивают затраты?Это зависит от того, сколько у вас есть кода, как он используется и какие другие требования у вас есть к вашему времени.

4 голосов
/ 27 февраля 2010

Документы этой исследовательской группы MIT могут дать вам несколько полезных рекомендаций:

3 голосов
/ 27 февраля 2010

Использование Java-дженериков, безусловно, хорошая идея. Это обратно совместимо. Таким образом, кодовая база, которую вы не можете преобразовать, будет продолжать работать с новым кодом.

РЕДАКТИРОВАТЬ : Я должен был упомянуть стирание типа в качестве причины, делающей обратную совместимость.

1 голос
/ 27 февраля 2010

Best Practices не существует. Это странный термин, который предполагает, что дверь закрывается на «лучшее» конкретного решения ... Использовать дженерики? Да. Немедленно. Это неловкое путешествие, так как многие большие библиотеки (Hibernate, Spring) все еще не в состоянии полностью их охватить ... но, по моему опыту, работа со смесью обобщений и смелых приведений по-прежнему создает лучшую базу кода, чем отсутствие использования их вообще.

Я бы также назначил политику конвертации по мере необходимости вместо какой-то гигантской миссии по рефакторингу.

1 голос
/ 27 февраля 2010

Ваша команда должна сбалансировать преимущества масштабного рефакторинга с затратами, техническими и бизнес-рисками, связанными с этим ... и другими приоритетами, которые имеет ваша команда.

Аргументы и рекомендации «передового опыта» от людей, которые не понимают ваш проект и бизнес-контекст, здесь просто не актуальны.

1 голос
/ 27 февраля 2010

Лучшие практики для принятия дженериков? Первая лучшая практика - это «делать». Постарайтесь исключить как можно больше приведений из своего кода. Если вы хотите сделать свою жизнь проще, используйте рефакторинг IntelliJ «Generify» - просто наведите его на всю кодовую базу, дайте ему сделать свое дело, а затем проведите небольшую пост-очистку.

0 голосов
/ 19 сентября 2012

Обычно хорошей идеей является рефакторинг для использования дженериков.

Это не требуется, поэтому не рассматривайте это как неотложную задачу, но вы можете считать, что использование дженериков - это мягкая форма технического долга - так что если у вас есть свободное время и запланирована база кода чтобы иметь долгую и продолжительную жизнь, стоит инвестировать в ее модернизацию.

Основные преимущества:

  • Лучшая проверка типов во время компиляции, которая уменьшит количество ошибок
  • Удаление ненужных приведений из исходного кода, что делает код более читабельным
  • Он все еще обратно совместим со старым кодом (благодаря стиранию типа)

Реального недостатка нет - единственная потенциальная проблема, о которой я могу подумать, - это если вы когда-нибудь захотите перенести код обратно на более ранние версии Java без общей поддержки. Но это было бы очень необычно!

Если вы решите провести рефакторинг в дженерики, я рекомендую следующие шаги:

  1. Включите все предупреждения вашего компилятора (Eclipse имеет довольно хорошие предупреждения)
  2. Сначала добавьте универсальный тип в ваш класс, например, MyClass<T>
  3. Затем измените тип сигнатур любого метода / внутренних полей / структур данных, чтобы использовать T
  4. Возможно, в этот момент в коде будет много предупреждений / ошибок. Это нормально, просто проработайте их и исправьте все. Часто ваша IDE может быстро исправить многие из них.
  5. Тестовые сценарии записи / рефакторинга, которые демонстрируют общие функции

Это довольно быстро сделать - я думаю, что мне удалось реорганизовать около 10 000 строк кода библиотеки Java, чтобы использовать дженерики менее чем за один день, что включало обновление некоторого клиентского кода.

...