Неизменность и читабельность - PullRequest
6 голосов
/ 03 сентября 2010

Итак, я читал книгу «Эффективная Java» Джошуа Блоха и заметил два момента, с которыми я действительно столкнулся в своей работе.

Точка 1: Создание методов установки, чтобы сделать код более читабельным. В его примере у нас есть класс со смехотворно огромным конструктором. Когда люди создают экземпляр класса, трудно сказать, что происходит со всеми параметрами. Таким образом, он предложил сделать минималистичный конструктор и использовать методы установки для всех других опций, поэтому вместо ...

MyClass clazz = новый MyClass (a, b, c, д, е, е, г);

вы бы написали ....

MyClass clazz = новый MyClass (a, b, c);
clazz.setDitto (d);
clazz.setEcho (е);
clazz.setFunzies (е);
clazz.setGumballs (г);

Что, как огромный сторонник читабельного кода, мне очень понравилось.

Пункт 2: В общем, он предложил иметь неизменные классы. Он углубляется в то, почему иметь неизменяемые классы гораздо лучше, чем иметь класс, который может быть в нескольких разных штатах. Я могу с уверенностью сказать, что он продал эту идею мне, и я не могу дождаться, чтобы большинство классов, которые я пишу, теперь были неизменяемыми, кроме ....

Что происходит, когда у вас есть неизменный класс с огромным конструктором? Вы не можете создавать методы для этого; это сломало бы неизменность. Я попытался пролистать оставшуюся часть книги, но не думаю, что он рассматривает решение для этого.

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

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

Ответы [ 4 ]

14 голосов
/ 03 сентября 2010

Один из вариантов - предоставить отдельный класс построителя, который предоставляет установщики, отвечающие за построение реального объекта.

Во втором издании «Эффективной Java» Блоха пункт 2 иллюстрирует это для неизменяемого класса.Ключевые идеи:

  • Для каждого параметра у строителя есть изменяемое поле.
  • Сам строитель передает в качестве единственного аргумента конструктору неизменяемого класса.
3 голосов
/ 03 сентября 2010

Введите параметр объекта , может быть? Это как бы решает проблему, но может быть полезным. Ваш параметр объекта не нуждается в методах; он просто хранит данные, и вы настраиваете их вместо своего реального класса. Затем ваш реальный класс инициализирует себя в конструкторе через объект параметра.

0 голосов
/ 03 сентября 2010

Как насчет наличия абстрактного базового класса, который поддерживает геттеры, но не сеттеры для всех атрибутов класса, производного запечатанного «неизменяемого» класса, конструктор которого принимает объект базового класса, и производного изменяемого класса, который включает в себя сеттеры для всехсвойства?

...