Не пойму, в чем удобство такого метода написания кода

FB3

Новичок
Автор оригинала: Активист
FB3
Про двигатель.

Смысл создавать обект типа "подача топлива" появляется только тогда, когда он самостоятелен, у него есть методы (сменить тип подачи топлива), если для типа данных "двигатель" достаточно иметь свойство "тип подачи топлива", то это можно сделать в контексте объекта двигатель, иначе, да, иерархия будет другая.

То есть у тебя может быть тип данных "карбюраторный двигатель", наследованный от базового "двигатели".
В контексте ООП вполне может быть и так. Я говорил про реальную жизнь :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: triumvirat
>всего-лишь навести мышку, держа Ctrl, и прочитать декларацию с описанием
я всегда смотрю что делают методы с "говорящими" именами
Зачем тебе чужой код? Есть публичные методы - вызываешь, не работает - пишешь баг репорт.
Не можешь понять, что как взаимодействуют методы - распечатываешь API, читаешь, спрашиваешь тимлида/архитектора.

Сложно понять?
Очевидно, нарушен принцип бритвы Оккамы.
Ты злой на говнокодера, чей код надо фиксить? Работа такая ...

Проблемы от несоблюдения принципов не означают, что принципы - плохие.

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

мой код большинства контроллеров выглядит так: http://pastebin.com/5ZeLMwrN
Вызов
$this->getView()->loadI18n('common/FrontendGeneral',
'advert/'.$this->getRequest()->getRequest()->getControllerName());

не становится понятнее.

то что я до этого привел - исключительный пример =)
Это хороший пример.
Наглядно показано применение принципа простыни к задачам более сложным, чем вывод новости.
 

Духовность™

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

Вызов
$this->getView()->loadI18n('common/FrontendGeneral',
'advert/'.$this->getRequest()->getRequest()->getControllerName());

не становится понятнее.
достаточно один раз посмотреть описание и понять, что идет подгрузка во вью языковых данных расположенных в файлах, чьи пути описаны в виде строк Модуль/Контроллер
 

Духовность™

Продвинутый новичок
я про API, про ядро говорю, когда есть ОБЩИЙ функционал на безе которого строится приложение.

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
triumvirat
я стремлюсь писать код, который можно понять, не читая описание :)
вероятно, у нас очень разные цели

-~{}~ 29.10.10 11:43:

Автор оригинала: triumvirat
ахаха =) дедушке на деревню писать?))
вообще то с кодом мы работаем, в т.ч. и с чужим, его постоянно приходится править. такие вот задачи у рядовых программистов =))
специально для тех, кто ... пропускает часть текста поста с 1го раза, повторяю^

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

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

Духовность™

Продвинутый новичок
Ты злой на говнокодера, чей код надо фиксить
почему фиксить? не фиксить, а изменять в виду каких-то перестроение логики программы. говнокодеры тут не при чем

-~{}~ 29.10.10 12:49:

Некого спросить? Ты что, плагины для джумлы правишь, написанные индийскими студентами?
Может, стоит код купить, чтобы поддержка была?
понятно. Абстрактная идеальная работа и идельный код, в котором все методы не требуют доработки. К сожалению, у меня иначе - кода много, его нужно постоянно править. Код, причем, довольно профессиональный. И тем не менее, я сталкиваюсь с проблемами, описанными мной выше.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>не фиксить, а изменять в виду каких-то перестроение логики программы
я чего-то не понимаю?
как делается изменение функционала в OOP?
расширяем класс, пишем свой кошерный метод.

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

трудно разобрать старый класс? налицо нарушение принципов

у меня правило - каждый правит только свой код

-~{}~ 29.10.10 12:00:

>ахаха =) дедушке на деревню писать?))
>Код, причем, довольно профессиональный.

взаимоисключающие параграфы?
 

fixxxer

К.О.
Партнер клуба
Все участники этой темы делятся на две категории.

Те, кто знает ООП, и те, кто думает, что знает ООП.
 

Духовность™

Продвинутый новичок
у меня правило - каждый правит только свой код
коней абстрактных опять обсуждаем? Интересно, если я сейчас скажу главному программисту - "правь сам с вой код", меня просто выгонят или сначала пошлют матом?

grigori ты отвечаешь на вопросы в духе "Это не проблема ООП", находя на каждый вопрос ответ в стиле "каждый правит только свой код", " налицо нарушение принципов" и т.д. Ты пишешь отговорки, которые взывают к Доброму, Хорошему и вечному, к идеальному коду. Но мы живем в реальном мире, где дела обстоят иначе. Каждодневно нужно модифицировать написанное, вносить изменения, рефакторить и т.д. А ты отвечаешь "каждый правит только свой код". Смешно.

Я спросил КОНКРЕТНЫЙ ВОПРОС: зачем выносить конструкцию
PHP:
if (!$category->getId())
    $redirect = new Base_Redirect();
    $redirect->setHeader('action_failed');
    $redirect->setType('alert');
    $redirect->setMessage('element_does_not_exist');
    $redirect->setRedirectUrl('/admin/user/');
    return $redirect;
}
в метод
PHP:
if (!$category->getId())
    return $this->elementDoesNotExistRedirect('element_does_not_exist');
и плодить одноразовый абсолютно не функциональный метод, который потребует изменения своего API как только в $redirect нужно будет передать, например, ещё какие-то параметры.
 

korchasa

LIMB infected
triumvirat
Чтобы логику экшена можно было удержать на одном экране. Когда я читаю экшен, мне не важно, что редирект имеет тип alert, мне не это нужно.

-~{}~ 29.10.10 14:01:

triumvirat
Вопрос на засыпку, твои взгляды тебе позволят ввести какой-нибудь DoesNotExistRedirect?

PHP:
if (!$category->getId()) 
    return DoesNotExistRedirect('element_does_not_exist');
 

Духовность™

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

korchasa

LIMB infected
Автор оригинала: triumvirat
Я бы позаботился о том, что бы читающий удержал написанное в голове. Если таких методов будет в экшене много, а логика будет сложная, но простыню методов, вызывающих друг-друга, будет куда более тяжелее воспринимать.
Ты серьезно так думаешь? Замени в своем сообщении слова "экшен" и "простыня" на их описание. Пусть даже всего в пару строчек. И дай кому-нибудь прочитать.
 

Духовность™

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

- скрытым
- иметь заголовок
- тело
- кучу параметров для подстановки в тело
- иметь логику

тут надо тогда делать либо универсальный метод с кучей возможных параметров, что очень не красиво, либо ничего не делать.

PHP:
$redirect = new Base_Redirect();
$redirect->setMessage('пользователь <a href="edit/?id={id_user}">{user_name}</a> сохранен');
$redirect->addParam('user_name', Helper_Format::hsc( $this->user->getFullName() ));
$redirect->addParam('id_user', $this->user->getId());
$redirect->setRedirectUrl($this->getRequest()->getRequest('return_on_page')
                          ? Base_Redirect::implode('admin', 'user', 'edit').'?id='.$this->user->getId()
                          : (
                                $this->getRequest()->getRequest('referer')
                                    ? $this->getRequest()->getRequest('referer')
                                    : array('admin', 'user')
                            )
               );
выносить это в одноразовый метод только ради того, что кому-то сложно читать я не буду. Редирект инкапсулирует реализацию, в контроллере только его API и логика, которая лежит на контроллере (куда слать ответ).
 

korchasa

LIMB infected
triumvirat
И вот это нормально читается? Мне так кажется проблема не в других программистах.

ЗЫ: А насчет неиспользования локальных переменных - это тоже от лукавого да?
 

Духовность™

Продвинутый новичок
ЗЫ: А насчет неиспользования локальных переменных - это тоже от лукавого да?
нет. а вот методы созданы для повторного использования. если вам нужно выносить код - используйте блоки
 

fixxxer

К.О.
Партнер клуба
Я бы это обернул в метод базового пейдж контроллера, типа $this->redirectTo($page, $args), только даже ради того, чтобы это говно больше не видеть :)

-~{}~ 29.10.10 15:15:

>> setMessage('пользователь <a href="edit/?id={id_user}">{user_name}</a> сохранен');

расстрел на месте.
 
Сверху