"Рефакторинг" Фаулера, "Выделение метода"

Духовность™

Продвинутый новичок
Купил книгу эту. Первая глава, по моему, называется "выделение метода". Прочитал я, значит, это выделение метода и впал в глубокую депрессию, вызванную полным неприятием такого подхода.

Как я уже писал, сейчас я работаю с системой, код контроллеров которой как раз "отрефакторин" в соответствии с "выделением метода". В результате мы имеем простыню методов, которые порой вызывают друг-друга, составляя цепочку вызовов и труднейшее понимание кода. На каждый чих выделяется метод, который используется в коде всего ОДИН раз. Понимаете? Я сейчас, после реальной практики, когда я воочию столкнулся с таким "улучшением кода", в упор не понимаю, зачем выделять метод, если нет никаких предпосылок его дальнейшего повторного использования?

В общем, пока я не тороплюсь читать дальше эту книгу. Просто потому, что порой кажется, что рефакторингу нельзя научиться - его нужно прочувствовать и почувствовать. Осознать. Но не тупо копировать, как по инструкции.

Давайте обсудим.
 

craz

Нестандартное звание
Купил книгу эту. Первая глава, по моему, называется "выделение метода". Прочитал я, значит, это выделение метода и впал в глубокую депрессию, вызванную полным неприятием такого подхода.

Как я уже писал, сейчас я работаю с системой, код контроллеров которой как раз "отрефакторин" в соответствии с "выделением метода". В результате мы имеем простыню методов, которые порой вызывают друг-друга, составляя цепочку вызовов и труднейшее понимание кода. На каждый чих выделяется метод, который используется в коде всего ОДИН раз. Понимаете? Я сейчас, после реальной практики, когда я воочию столкнулся с таким "улучшением кода", в упор не понимаю, зачем выделять метод, если нет никаких предпосылок его дальнейшего повторного использования?

В общем, пока я не тороплюсь читать дальше эту книгу. Просто потому, что порой кажется, что рефакторингу нельзя научиться - его нужно прочувствовать и почувствовать. Осознать. Но не тупо копировать, как по инструкции.

Давайте обсудим.
А мне понравилось, это же пример, - в действительности код выделенного метода должен/будет больше. Плюс выделяя потихоньку так методы можно прийти

PHP:
void printOwing1() {
		printBanner();
		printDetails1(getOutstanding());
	}
        void printOwing2() {
		printBanner();
		printDetails2(getOutstanding());
	}
.................................................................
	void printDetails1 (double outstanding) {
		System.out.println ("name:	" + _name);
		System.out.println ("amount	" + outstanding);
	}
        void printDetails2 (double outstanding) {
		System.out.println ("name:	" + _name);
		System.out.println ("amount	" + outstanding);
	}
......................................................
так? так быть может я уверен - а теперь порефакторить осталось со всем чуть-чуть надо просто свернуть все похожие методы в один с более "сильной" логикой. И получим нехилое сокращение кода.

Не?
 

Духовность™

Продвинутый новичок
Да. Всё круто. Но вопрос не в том, что "рефакторинг - говно", а в том, накой выделять то, что ещё не требует выделения? Это же фактически преждевременная оптимизация, только связанная не с компьютером, а связанная с человеком.
 

Ragazzo

TDD interested
Духовность™
Там же написано, выделяй те которые явно напрашиваются на обособленность, или те которые явно повторяются, большой метод можно разбить на несколько малких,это упростит поиск ошибок и написание кода...цепочка методов гораздо лучше, чем один большой в котором потом потонешь, и будешь искать ошибку 3 часа, вместо 5 минут при мелких, разделенных методах, каждый из которых отвечает за свое
craz
>>в действительности код выделенного метода должен/будет больше
не всегда
 

craz

Нестандартное звание
Да. Всё круто. Но вопрос не в том, что "рефакторинг - говно", а в том, накой выделять то, что ещё не требует выделения? Это же фактически преждевременная оптимизация, только связанная не с компьютером, а связанная с человеком.
ну так... это как не умеешь сра...ь не мучай ж...? Не зачем выделять то, что не требует выделения.
Пока человек занимающийся кодом не почувствует проблемы с поддержкой кода, он не должен заниматься рефакторингом!!! Преждевременная оптимизация и рефакторинг рабочего кода удовлетворяющего программиста не должна проводиться пока уровень удовлетворения не опуститься ниже 70%. А вот когда это произойдет - имхо это уже 1) опыт -> 2)интуиция<->3)дар

Ну как то так имхо...

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

craz

Нестандартное звание
Духовность™
Там же написано, выделяй те которые явно напрашиваются на обособленность, или те которые явно повторяются, большой метод можно разбить на несколько малких,это упростит поиск ошибок и написание кода...цепочка методов гораздо лучше, чем один большой в котором потом потонешь, и будешь искать ошибку 3 часа, вместо 5 минут при мелких, разделенных методах, каждый из которых отвечает за свое
craz
>>в действительности код выделенного метода должен/будет больше
не всегда
ну не най... тогда думаю не стоит обращать на такой метод внимание - к примеру прорефакторив один метод из примера не получиться профита. Код должен быть изначально не иметь выделенных методов, или иметь их настолько мало, чтобы программист почувствовал возможно выделения и абстрагирования каких то общих методов
 

Ragazzo

TDD interested
craz
>>Пока человек занимающийся кодом не почувствует проблемы с поддержкой кода, он не должен заниматься рефакторингом!!!
Полностью согласен, щас даже начал смотреть в сторону разных профилирующих средств, только оптимальных что-то не нашел...=(
 

Ragazzo

TDD interested
craz
Я имел ввиду, не то что уже должны быть выделенные методы, а что программист должен уметь их видеть, и выделять сначала логически в структуре кода, а затем уже использовав методы...
 
  • Like
Реакции: craz

craz

Нестандартное звание
craz
>>Пока человек занимающийся кодом не почувствует проблемы с поддержкой кода, он не должен заниматься рефакторингом!!!
Полностью согласен, щас даже начал смотреть в сторону разных профилирующих средств, только оптимальных что-то не нашел...=(
А я чето слышал про какие то инструменты, которые могут просматривать код именно с точки зрения рефакторинга - потому что профилирование тут не причем, самый захордкоженный с точки зрения рефакторинга код не факт что производителен - таким образом нафик его профилировать? - Это уже другая задача.

Рефакторинг - это повышение качества кода,
Тестирование - это оптимизация выполенения проекта и его частей, как по времени так и исходя из наличия логических? ошибок.

И как бы имхо они идут параллельно не пересекаясь.
 

Ragazzo

TDD interested
craz
Это то понятно, просто понадобилось повысить скиллы в профилировании, ладно не по теме пошло, пойду дальше искать что-то стоящее
 

Духовность™

Продвинутый новичок
.цепочка методов гораздо лучше, чем один большой в котором потом потонешь, и будешь искать ошибку 3 часа, вместо 5 минут при мелких, разделенных методах, каждый из которых отвечает за свое
Цепочка методов, вызывающих друг-друга - это гораздо хуже, чем что-либо вообще можно представить. Я именно о таких методах говорил.

Не зачем выделять то, что не требует выделения.
О том и речь. Читая Фаулера, я не нашел ПОТРЕБНОСТИ в его коде выделять что-либо. Поэтому я и спросил - зачем и почему уважаемый господин Фаулер занимается выделением ради выделения.
 

Ragazzo

TDD interested
Духовность™
Там он еще выше этого примера писал, что многие примеры надуманы и служат лишь для иллюстрации способа выделения, т.е схематично чтобы было понятно как делать. Если цепочка методов вложена в 30-40 раз то да, а так даже 5 методов вызывающих друг друга, ето лучше, при условии что они отвечают за строгие свои действия, легко если что можно просмотреть трейс и все...
 

craz

Нестандартное звание
Цепочка методов, вызывающих друг-друга - это гораздо хуже, чем что-либо вообще можно представить. Я именно о таких методах говорил.

О том и речь. Читая Фаулера, я не нашел ПОТРЕБНОСТИ в его коде выделять что-либо. Поэтому я и спросил - зачем и почему уважаемый господин Фаулер занимается выделением ради выделения.
А высшие образование есть у тебя?

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

Духовность™

Продвинутый новичок
а так даже 5 методов вызывающих друг друга, ето лучше
ПЯТЬ?! Вы когда-нибудь разбирали код, где функции или методы имеют двух или хотя бы трёх уровневую вложенность?

если что можно просмотреть трейс и все...
О Боже! Вместо простыни кода в 10 строк, вы предлагаете сделать простыню методов из 20 строк и "просмотреть трейс".
 

Ragazzo

TDD interested
Духовность™
Мы не поймем друг друга, т.к ты не хочешь слушать что тебе говорят...хочешь писать громадные методы по 100 строк - пиши...
 

Adelf

Administrator
Команда форума
Духовность™
Выделяя метод мы вводим абстракцию. Т.е. вначале у нас был захаркоденный printDetails, причем именно с таким комментом. А теперь есть абстракция(и коммент не нужен. Там дальше он проходится по комментариям, сравнивая их с дезодорантом, пытающимися прикрыть запах некрасивого кода).
Абстракции удобны. Ищем баг в распечатке Details? Идем в метод printDetails - он почти наверняка там. Не нужно смотреть что печатается ДО и ПОСЛЕ них в этом отчете. В нормальной IDE переход к этому методу - одна клавиша(F3 - Eclipse, VS - F12).
Если выдаются не те данные - переходим в этом методе к методу получения данных. Баг - там. И т.д. Удобно это. Не спорь :)
 

AmdY

Пью пиво
Команда форума
Духовность™
Вы. товарищ, небось из тех, кто покупает гематогенку к "чаю".
Дело же не в процессе, а в цели. Цель - получить читабельную программу. Код основного метода должен читаться, как стихи, а не как математические формулы.
А чтобы почувствовать реальную пользу от кучи мелких методов, нужно подебажить и увидеть, как легко делать это, когда можно сделать step over, а не перебирать каждую строчку и колдуя с брейкпойнтами.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ты до конца книгу дочитай сначала. Там есть и обратный рефакторинг, сведения в один метод, ликвидируя излишнюю абстракцию.
 

MildMildMint

Новичок
Духовность™ синтаксическое обособление участков, обособленных логически. Странно, если бы этого не было.
 
Сверху