Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

воскресенье, 20 ноября 2011 г.

Рефакторинг: Что такое рефакторинг?


Хочу сделать презенташку по Рефакторингу. Вот сел и набросал в mindmap'чик все что было в голове по этому поводу. Надеюсь кому-то пригодится.

9 комментариев:

  1. Уже пригодилось.

    Начал читать Фаулера, но столкнулся с тем, что он очень любит ссылки из одного раздела (паттерна) в другой. Изложение в виде иерархической структуры более наглядно

    Я так понял, что это после пятничного общения со мной :)

    ОтветитьУдалить
  2. Да, Славик, все как-то на кучу наложилось и то, о чем мы с тобой говорили в пятницу, и таск в TODO моем - сделать презентацию по рефакторингу и минутка свободная... Парад планет так сказать.

    Это так сказать самый сложный первый шаг был. Дальше пойдет по проще.

    ОтветитьУдалить
  3. А вообще сама книга - это дерево. Смотри сам - оглавление, потом главы, параграфы, абзацы, предложения, слова и наконец буквы.

    Книгу удобнее было бы читать как mind map карту.

    ОтветитьУдалить
  4. C "метод что-то делает с объектом пришедшим извне" не согласен, т.к. по закону Деметры http://en.wikipedia.org/wiki/Principle_of_Least_Knowledge метод может вызывать поля и методы объекта, который приходит к нему в качестве параметра.

    ОтветитьУдалить
  5. Может то может, но больше, я бы сказал, read only. Если же он злоупотребляет этим и нагло меняет состояние объекта который ему пришел извне вместо того, чтобы отвечать за состояние того объекта в котором находится - это не гуд.

    Представь себе List, который в методе add(Object) кроме добавления объекта еще и каким-то образом его причесывает. Я об этом.

    ОтветитьУдалить
  6. Типичный пример - когда метод меняет состояние своего параметра - шаблон параметр-накопитель http://c2.com/cgi/wiki?CollectingParameter

    ОтветитьУдалить
  7. Почему бы не написать просто?

    String[] userFiles = ...
    List userList = new ArrayList();
    for (int i=0; i < userFiles.length; i++) {
    userList.add(userFiles[i]);
    }

    или List userList = Arrays.asList(userFiles);

    Пример какой-то непрактичный.

    Опять же. Есть правила и есть исключения.
    "метод что-то делает с объектом пришедшим извне" - можно и нужно нарушать, без этого не сделаешь некоторых шаблонов. Но когда весь код написан так, пора задуматься о рефакторинге.

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

    ОтветитьУдалить
  8. "Так, пора задуматься о рефакторинге", с этим тоже не согласен в корне, т.к. есть специальный рефакторинг - "Move Accumulation to Collecting Parameter", по той же ссылке, что я кидал (прямая: http://www.industriallogic.com/xp/refactoring/accumulationToCollection.html)

    Другой пример, когда метод изменяет состояние параметра: метод Persist (Save) в ORM, который обычно присваивает идентификатор сохраняемой сущности.

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

    ОтветитьУдалить
  9. "Его может реабилитировать то, что он служит какому-то шаблону, но чаеще всего это не так."

    У меня другой опыт. И он подсказывает, что метод делающий правки в объекте плохо пахнет.

    Если этот подход - часть шаблона - вопросов нет. Но в моем опыте это скорее исключение, чем правило.

    Давай лучше сконцентрируемся на том, с чем есть согласие, что было ново, что захотелось попробовать?

    ОтветитьУдалить