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

Цитата:
До изобретения пылесоса люди жили в грязи
Вы будете удивлены, насколько Вы оказались правы, сами того не желая.
Лев Толстой сморкался под стол. В Европе 18 века помои выливали из окон прямо на улицу. Люди не мылись вообще.
Вот, первое что нагуглилось по этому поводу.
А современная паническая боязнь микробов под ободком унитаза - результат целенаправленного "зомбирования" населения, осуществлённого в интересах компаний, производящих моющие средства. Всё решают технологии. Формирование представления людей о правильном быте - тоже технология

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

Технологии появляются как озарение в головах самых одарённых, а остальные (не очень гениальные) просто изучают найденное другими. Я думаю, я вряд ли гений...
Ответить с цитированием
  (#17 (permalink)) Старый
AD AD вне форума
Member
 
Сообщений: 575
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 15.07.2009
По умолчанию 17.11.2009, 17:45

Цитата:
Вы будете удивлены, насколько Вы оказались правы, сами того не желая.
Лев Толстой сморкался под стол. В Европе 18 века помои выливали из окон прямо на улицу. Люди не мылись вообще.
А современная паническая боязнь микробов под ободком унитаза - результат целенаправленного "зомбирования" населения, осуществлённого в интересах компаний, производящих моющие средства. Всё решают технологии. Формирование представления людей о правильном быте - тоже технология
Ошибочное мнение. В азиатских странах еще не знаю с каких веков люди высших слоев населения были крайне чистоплотны. И мылись с мылом. В Древней Греции и Риме тоже почище было, чем в средневековой Европе. Средневековая Европа не показатель! Но при этом о пылесосах не знали.

Вам намекнули вполне корректно, что технику рефакторинга очень часто применяют, не задумываясь о том, что это он и есть! Конечно, лучше хорошо и разносторонне ее узнать, но не следует из нее делать самоцель.
Ответить с цитированием
  (#18 (permalink)) Старый
apofig
Guest
 
Сообщений: n/a
По умолчанию 13.12.2009, 17:36

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

Тут было решено впервые воспользоваться шаблоном замена условного оператора полиморфизмом. Выделил интерфейс из 4х методов на каждое дерево case.
public I {
void doAtStart();
void doAtEdd();
void validate();
void ещеЧтоТоНеПомнюУже();
}

выделилось 4 новых класса. Причем я так же переживал как и вы - нафига столько много классов, интерфейс и еще factory method, в котором остался один единственный case - проверяющий какой сейчас шаг и возвращающий один из нескольких реализаций под интрфейсом I.

И тут я понял, что выделенные классы инкапсулируют в себе логику шага визарда - я переименовал все из Node в Step и жутко обрадовался.

Позже добавился еще один шаг, и реализовать его было очень просто - добавить ветку в case factory method и один класс с реализацией нужного шага.

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

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

Вот как-то так. Я помог?
Ответить с цитированием
  (#19 (permalink)) Старый
Dionisiy Dionisiy вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.06.2007
По умолчанию 14.12.2009, 15:32

Цитата:
Позже добавился еще один шаг, и реализовать его было очень просто - добавить ветку в case factory method и один класс с реализацией нужного шага.
Можно обойтись и без метода с case-ми. Что-то типа:

Код:
>>stepFor: stepType
  Step withAllSubclassesDo: [:each | each stepType = stepType ifTrue: [^each new]].
  self error: 'unknown step'
Ответить с цитированием
  (#20 (permalink)) Старый
HandleX HandleX вне форума
Member
 
Сообщений: 40
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2007
По умолчанию 17.12.2009, 09:38

Цитата:
Можно обойтись и без метода с case-ми. Что-то типа:

Код:
>>stepFor: stepType
  Step withAllSubclassesDo: [:each | each stepType = stepType ifTrue: [^each new]].
  self error: 'unknown step'
У смоллтока много приятных аспектов -- кроме объектов не нужно забывать и про посылку сообщений
Мне как-то в своё время было лень раскидать логику шагов визарда по классам, потом отлавливать эту логику в разных классах...
В общем, поскольку перформинг ненапряжен в смоллтоке, то сделал так:
1) Вкладкам визарда дал осмысленные имена -- к примеру InitialStep, PreRegisterStep и т.п. -- чтобы знать, где находимся в тек. момент. Это можно было бы реализовать целочисленной переменной номера шага в визарде -- но хотелось дать методам опять же осмысленные, а не "очередные" номера.
2) Методы в презентере визарда: #doInitialStep, #doPreRegisterStep и т.д.
3) Методы контроля доступности шага: #isInitialStepAllowed, #isPreRegisterStepAllowed и т.д.
4) В методе #validateUserInterface выясняю имя текущей вкладки, и динамически конструирую селектор проверки доступности действия шага (методы группы #is***Allowed), перформю его. От результата зависит доступность кнопки "Далее >>".
5) По нажатию на кноку "Далее >>" динамически конструирую селектор действия этого шага (методы группы #do***), перформю, переключаю вкладку.

Профит: вся логика в одном классе, там где она и должна быть, в презентере. Ветвлений нет -))

А ещё в презентерах Dolphin Smalltalk есть замечательный метод #queryCommand:, в нём, как пишут в комментариях к этому методу, долфинисты должны "enter details about a potential command for the receiver".
Этот метод в сложных презентерах, где много гуйни, превращается в оооочень ветвистого монстра. Если идти путём конструирования класса на каждое ветвление -- поимеем к презентеру как таковому ещё штук 30 классов -- "ветвистых борцов ", что как-то странно, потому что и в этом случае динамическое конструирование селекторов получается весьма изящным решением.
Ответить с цитированием
Ads.
Ads
Ответ

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

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

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 - компьютерный форум и программирование, форум программистов