Как правильно использовать ООП?

Всем привет. Недавно сел за изучение Perl, но не в этом суть. В программировании самоучка, и есть у меня проблема я не очень понимаю как правильно использовать ООП.


Вот на примере, есть модуль pricer.pm который имеет набор методов для подсчета всяких ценовых значений у предмета.

Например функция calc_total().


Вопрос меня мучает такое как правильно использовать этот модуль.

Создавая новый объект который вот так
$obj = pricer->new( $item_id );
$obj-&gt;calc_total();<br/>

или
$obj = pricer-&gt;new( );
$obj-&gt;calc_total( item_id =&gt; $item_id )


Прошу сильно не пинать, а помочь начинающему программисту.

По идее правильный первый вариант, но второй тоже не такой плохой?

Заранее спасибо.
  • Вопрос задан
  • 2862 просмотра
Пригласить эксперта
Ответы на вопрос 6
Я не пишу на Perl, больше на Java, но попробую подсказать.

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

Если-же у вас много item_id, то второй вариант предпочтительнее, если надо посчитать сумму результатов для набора item_id. Чтоб не плодить множество объектов pricer.

Если я не ошибаюсь в своих предположениях насчёт вашей задачи.
Ответ написан
Комментировать
@v1z
Если ваш модуль pricer завязан на item_id, ну или если половина его методов требует этот айди, то первый вариант вполне подходит. Если же айди требует только метод calc_total, тогда лучше использовать второй вариант.
Ответ написан
Комментировать
Зависит от сути, которую вы хотите вложить.
Например, если этот объект является «моделью» и дает доступ к операциям в БД со всякими item'ами, то второй вариант выходит. А если объект умеет работать только с одним item, то логично его с ним и инициализировать (первый вариант).
Ответ написан
Комментировать
perl_demon
@perl_demon
В perl есть правило/выражение — There Is More Than One Way To Do It!
Ваш пример хорошо демонстрирует это :-)
Мое мнение: Правильно и так и так!
Ответ написан
Комментировать
@TimTowdy
Судя по тому, что вас волнует такой вопрос, ваш модуль сравнительно небольшой, и для него оба варианта приемлемы. Когда/если ваш pricer.pm станет достаточно большим, чтоб возникла потребность в ООП, правильный вариант вам станет очевиден.

Вообще правильнее будет делать так:
$item->calc_total_price();

Где calc_total_price будет выглядеть как-то так:
my $item = shift;
return $pricer->calc_total( item_id => $item->{id});

Т.е. специальный объект (или функцию), который обсчитывает данные итема, использовать не явно, а внутри метода класса Item. Но это всё теория, до которой в перле мало у кого доходят руки.

Сразу хочу предостеречь вас от изучения ООП на примере перла. Оно там сделано ужасно и лишь частично исправляется костылями. Рискуете получить травму на всю жизнь, подобно GOTO-программистам на бейсике. Чтобы лучше понять что такое ООП и как им пользоваться, посмотрите как оно реализуется в Java/С++, Python/Javascript, LISP/Scheme.
Ответ написан
Комментировать
iSage
@iSage
Если item_id не используется больше нигде, кроме как в calc_total, то лучше второй вариант. Иначе — первый.
В конструктор обычно передаются некие общие для всего объекта поля.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы