Справка по рефакторингу ... объект на основе свойств или множество полей-членов? - PullRequest
1 голос
/ 13 января 2010

Я сейчас занимаюсь рефакторингом класса, который сейчас выглядит примерно так:

 class SomeModel {
    private String displayName;
    private int id;
    private boolean editable;
    private int minimumAllowedValue;
    private int maximumAllowedValue;
    private int value;
    // etc. etc.... a bunch (10+) of other fields...

    // and then tons of setters and getters for these fields, some of the
    // setters have restrictions depending on other settings, like you can't
    // set the maximum lower than the minimum, etc.
    // ...
 }

Мой вопрос: действительно ли это лучший путь или я должен реорганизовать все эти поля в более структуру, основанную на свойствах (просто с двумя методами setProperty и getProperty)?

Другим возможным рефакторингом может быть извлечение «свойств», принадлежащих друг к другу, в собственные классы, такие как структура max / min, в объект «AllowedRange» или что-то в этом роде.

Идеи

Ответы [ 3 ]

2 голосов
/ 13 января 2010

Из полей, которые вы перечислили, я бы - как вы предлагаете - преобразовал minimumAllowedValue и maximumAllowedValue в класс Range, а затем заменил бы их, скажем, allowedRange. Если бы я начал видеть, что value и его allowedRange были общим шаблоном, я мог бы перейти, скажем, к классу BoundedValue. Невозможно, не видя всех других полей, сказать, что с ними делать, но слишком много полей - это определенно запах. Решение зависит от их взаимосвязанности, но примеры min & max -> range и value & range -> boundedValue дают представление о видах применяемых методов.

Кроме того, помните о принципе единственной ответственности .

2 голосов
/ 13 января 2010
  • Вы можете взглянуть на BeanProperties - он поддерживает ограничения, события и т. Д.
  • Также проверьте Project Lombok
  • Вы можете иметь Map и несколько констант в качестве ключей и использовать setProperty для наложения некоторых ограничений.Или даже для регистрации валидаторов.
  • Если предполагается, что этим объектом манипулируют другие инструменты / фреймворки (spring, hibernate и т. Д.), То, конечно, этот рефакторинг не вариант - он должен соответствовать спецификации JavaBeans
  • в конечном счете, зачем вам сначала его реорганизовывать?Разве он не делает свою работу хорошо?
1 голос
/ 13 января 2010

Не делай этого. Это нормально.

В будущем просто используйте IDE, например Eclipse, для автоматического создания Javabean-классов, свойств и / или методов получения и установки в несколько кликов, чтобы вам не приходилось вводить весь этот код снова и снова.

...