Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Smalltalk
Перезагрузить страницу Перенос условных ветвлений в полиморфизм
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию Перенос условных ветвлений в полиморфизм - 10.11.2009, 05:55

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

1) Раньше я программировал, разбивая программу на изолированные части, кодируя каждую часть отдельно и сразу забывая про неё, переходя к следующей части. То есть, определился с интерфейсом, написал длинный комментарий как и с чем этот модуль использовать, написал код модуля и сразу после этого забыл все детали, особенности и "подводные камни" его реализации (голова не резиновая). Теперь мне предлагается постоянно делать в программе рефакторинг, в том числе перенося куски кода из одного модуля в другой, чтобы структура программы смотрелась логичнее. Я что, теперь должен всё помнить?

2) Особенно меня шокировал метод рефакторинга под названием "перенос условных ветвлений в полиморфизм", где предлагается вместо условного ветвления на N вариантов делать N классов с разным поведением. Уж очень сомнительным мне кажется выигрыш от замены конструкции if-then-else на пачку новых классов. Нельзя ли привести пример реальной ситуации в Смолток-программе, когда такой метод рефакторинга будет действительно полезен?
Ответить с цитированием
  (#2 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 10.11.2009, 11:43

1) Наоборот. Если твои "подводные камни" периодически вылезают на поверхность, то рефакторинг нужен именно для того, чтобы от них избавиться и таком образом освободить тебя от необходимости помнить какие-то конкретные особенности. Т.е. одной из главных целей рефакторинга является как раз минимизация информации, которую нужно знать, чтобы правильно использовать модуль.
И вообще, рефакторинг проводится по необходимости, а не вообще "чтобы был".
Ответить с цитированием
  (#3 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 10.11.2009, 15:06

Один из главных принципов ООП - инкапсуляция. То есть, прячем все детали реализации в "чёрный ящик". Пишем и прячем, наружу торчит только интерфейс. Никто не видит, что внутри, зачем же тогда тратить усилия, что навести там красоту и порядок?

Цитата:
И вообще, рефакторинг проводится по необходимости, а не вообще "чтобы был".
На этом форуме встретил интересное мнение:
Цитата:
Тщательно следить, не пора ли делать рефакторинг. Есть хороший критерий, когда надо делать рефакторинг: если ты задумался, надо делать рефакторинг или нет - значит, его пора делать icon_smile.gif.
Несмотря на смайлик, думаю, что это была не шутка.
Ответить с цитированием
  (#4 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 10.11.2009, 18:16

Цитата:
Никто не видит, что внутри, зачем же тогда тратить усилия, что навести там красоту и порядок?
Как правило, рефакторинг делается либо после завершения определенного этапа работы (чтобы "вылизать" код, пока еще не забыл, что к чему), либо перед чем-то (например, перед изменением/расширением функционала модуля или его передачей/публикацией).
Ну, либо когда сам почувствова, что пора.
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 11.11.2009, 01:24

По мере разработки продукта начинают выплывать ошибки проектирования. Сначала они приводят к "некрасивым" решениям. Потом "некрасивого" накапливается слишком много - и приходит время рефакторинга.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
chaetal chaetal вне форума
Member
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.04.2005
По умолчанию 11.11.2009, 10:28

Цитата:
1) Раньше я программировал, разбивая программу на изолированные части, кодируя каждую часть отдельно и сразу забывая про неё, переходя к следующей части. То есть, определился с интерфейсом, написал длинный комментарий как и с чем этот модуль использовать, написал код модуля и сразу после этого забыл все детали, особенности и "подводные камни" его реализации (голова не резиновая). Теперь мне предлагается постоянно делать в программе рефакторинг, в том числе перенося куски кода из одного модуля в другой, чтобы структура программы смотрелась логичнее. Я что, теперь должен всё помнить?
Пока не увидел простой мысли: если к разработанном модулю не предъявляется новых требований, то ничего рефакторить и не надо. Проблема же заключается в том, что мало кому удается сделать один раз и навека. И если оказывается, что существующий модуль чем-то устраивает, а чем-то --- нет, то как раз и появляется необходимость адаптировать функциональность модуля минимальными усилиями. Другими словами, внести что-то новое (или изменить часть существующего), минимально затрагивая устраивающее поведение. Рефакторинг как процесс (можно сказать методологиия) описывает, как это можно сделать --- очень простыми изменениями за несколько хорошо контролируемых шагов. Здесь пригодятся тесты --- и для контроля, и как средство документирования (для того, чтобы вспомнить детали, которые в нерезиновую голову не влезают). А рефакторинги как операции, упрощают этот процесс, частично автоматизируя его. См. М. Фаулер, Рефакторинг.

Цитата:
2) Особенно меня шокировал метод рефакторинга под названием "перенос условных ветвлений в полиморфизм", где предлагается вместо условного ветвления на N вариантов делать N классов с разным поведением. Уж очень сомнительным мне кажется выигрыш от замены конструкции if-then-else на пачку новых классов. Нельзя ли привести пример реальной ситуации в Смолток-программе, когда такой метод рефакторинга будет действительно полезен?
Вообще, это одно из основных положений (не аксиома, а, скорее, теорема) ООП: сложная разветвленная логика должна быть заменена простым линейным использованием объектов на основе полиморфизма. (Что-то сложно получилось, но пока не знаю, как лучше сформулировать.) С прагматической точки зрения, в каком-то смысле, ради этого ООП и существует. Но суть простая: там, где были разные if-ы или даже case-ы, должна стоять передача сообщения объекту. И объекту уже не понадобиться ветвления, потому что он про себя знает все. Tell, don't ask, say. Еще дам такую ссылку: http://www.antiifcampaign.com/. Возможно, она прояснит идею.

Кстати, упомянутая в другой теме реализация #ifTrue:#ifFalse --- хороший пример.
Кстати, --- в дополнение к беседе в той теме --- если уж очень хочется, то #ifTrue:ifFalse и т.п. можно использовать и с любыми объектами. Например, в VisualWorks для этого нужно перегрузить метод #mustBeBoolean, например так
Код:
Number >> mustBeBoolean
 ^ self isZero not


Есть масса более очевидных примеров. Например, "классический" пример с отрисовкой различных объектов к графических редакторах. Вместо

Код:
#draw: anObject

  anObject isTriangle ifTrue: [self drawTriangle: anObject].
  anObject isRectangle ifTrue: [self drawRectangle: anObject].
  anObject isCircle ifTrue: [self drawCircle: anObject].
делаем

Код:
#draw: anObject
  anObject draw.
А в anObject будет лежать круг, треугольник, прямоугольник или вообще все, что угодно, что умеет себя отрисовывать. Последнее --- возможность расширять возможности без изменения кода --- очень часто выставляют как самое главное преимущество. На мой взгляд, это не совсем так. Самое главное преимущество --- упрощение логики.
И, надо отметить, очень часто такой анализ типов не приходит один, и какие-то похожие куски встречаются во множестве мест. В этом случае еще и дублирование убираем.

Вообще, в своей практике очень часто встречаюсь с подобным кодом (обычно не в Smalltalk-овских программах, правда). Очччень неудобно такой код расширять и сопровождать.
Ответить с цитированием
  (#7 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 11.11.2009, 12:49

Пример с геометрическими фигурами - не совсем то, что хотелось. Любой программист с самого начала закодирует их разными классами, даже ничего не зная про рефакторинг, потому что кроме метода рисования они отличаются ещё много чем (напр, формулами периметра, площади, алгоритмом определения попадает ли точка внутрь фигуры и др.). Интересны ситуации, когда решение о создании новых классов принимается только из-за рефакторинга, когда в результате всего один "if" исчезает из кода, и взамен появляется куча классов.
Ответить с цитированием
  (#8 (permalink)) Старый
chaetal chaetal вне форума
Member
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.04.2005
По умолчанию 12.11.2009, 14:46

Цитата:
Пример с геометрическими фигурами - не совсем то, что хотелось. Любой программист с самого начала закодирует их разными классами, даже ничего не зная про рефакторинг, потому что кроме метода рисования они отличаются ещё много чем (напр, формулами периметра, площади, алгоритмом определения попадает ли точка внутрь фигуры и др.). Интересны ситуации, когда решение о создании новых классов принимается только из-за рефакторинга, когда в результате всего один "if" исчезает из кода, и взамен появляется куча классов.
Вы любую задачу решаете сразу в наиболее общем виде?

Вообще, рефакторинг не может стать причиной переработки кода. (Как и любой объект, кроме Первоначального, не может стать причиной самого себя.) Причина рефакторинга --- неудовлетворенность имеющимся кодом. Это еще запахом называют. Или антипаттернами. Наличие нескольких рядомстоящих if-ов в объектной программе для меня --- приличный запашок, близкий к вони. (Я просто прекрасно знаю, к чему это может привести, и довольно быстро... и как сложно потом с этим бороться.) Вот эта вонь и заставит меня принять решение о рефакторинге.

И вообще, я теперь не очень понимаю, что же за примеры Вы хотите и зачем.

Ответить с цитированием
  (#9 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 15.11.2009, 01:21

Не понимаю, о чем спор. Мы должны убедить Вас использовать рефакторинг? Да на здоровье, живите без него. Рефакторинг производится тогда, когда программист сам понимает, что пришло время пересмотреть те идеи, которые были заложены на этапе проектирования. Нет у Вас такого понимания - значит, не нужен и рефакторинг.
Ответить с цитированием
  (#10 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 15.11.2009, 09:36

Alexiski, Вы выиграли приз за самый бесполезный совет в этой теме.
Ответить с цитированием
  (#11 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 15.11.2009, 23:08

Цитата:
Alexiski, Вы выиграли приз за самый бесполезный совет в этой теме.
На самом деле Вы просто не умеете общаться с людьми. Вам скоро вообще перестанут отвечать.
Ответить с цитированием
  (#12 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 16.11.2009, 09:06

Считаете, что Ваш ответ заслуживал бОльшего?

Я объяснил, что сталкиваюсь с понятием "рефакторинг" впервые, некоторые его методы мне не очень понятны. Отвечающие как могли попытались мне прояснить ситуацию, и благодаря им моё понимание смысла рефакторинга улучшилось, хотя и не до 100%. И лишь Вы высказались в духе "не понимаешь - не пользуйся":
Цитата:
Мы должны убедить Вас ...? ... живите без него.
Увы, приз по праву Ваш. Форумы существуют для взаимопомощи, а не для демонстрации своего превосходства над новичками.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 16.11.2009, 16:27

Cornered_Rat
В чем-то Alexiski прав. Если бы рефакторинг был бы Вам нужен, то Вы бы делали его, даже не подозревая о существовании такого термина.
Ответить с цитированием
  (#14 (permalink)) Старый
Cornered_Rat Cornered_Rat вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.11.2009
По умолчанию 16.11.2009, 16:39

Цитата:
Если бы рефакторинг был бы Вам нужен, то Вы бы делали его, даже не подозревая о существовании такого термина.
Звучит примерно как "если бы людям в средние века нужно было электричество, они бы им пользовались". Увы, всякую технологию нужно сначала изучить.
Ответить с цитированием
  (#15 (permalink)) Старый
andriano andriano вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 13.02.2006
По умолчанию 17.11.2009, 13:19

Цитата:
Увы, всякую технологию нужно сначала изучить.
Уверяю Вас, очень до многого можно дойти своим умом.

PS. Ваше утверждение звучит примерно так: "До изобретения пылесоса люди жили в грязи".
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенос файлов святой Любые вопросы от новичков 1 08.04.2012 10:57
Полиморфизм. Waldemar С/С++ 2 09.03.2012 20:38
перенос на dvd andrj Любые вопросы от новичков 10 31.12.2011 14:25
перенос файлов vitalijvajt Вопросы начинающих программистов 1 07.10.2011 05:27
Программа демонстрирующая принципы ООП (полиморфизм, инкапсуляцию, наследование) TidalAeon Вопросы начинающих программистов 0 11.12.2010 16:32
Как правильно реализовывать полиморфизм Rocky С/С++ 9 11.02.2010 20:21
Написать программу с использованием циклов и условных операторов bombik Вопросы начинающих программистов 15 05.03.2009 15:15
Задания на С++ на сортировку и на полиморфизм yarmolchuk Вопросы начинающих программистов 3 05.06.2007 00:51
Полиморфизм в Прологах Alexei A. Morozov Prolog 9 24.05.2006 00:20
Как сделать через указатели полиморфизм в двух последних строчках Eric Вопросы начинающих программистов 4 31.12.2005 18:48
Что такое полиморфизм, если можно на примере -=царь=- C++ Builder 11 04.07.2005 17:21
полиморфизм функций в PHP5 imported_Jean PHP 1 12.07.2004 14:44



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов