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

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

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

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

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

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

или   
$obj = pricer->new( );`  
`$obj->calc_total( item_id => $item_id )`  
  
  

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

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

Заранее спасибо. 

 Я не пишу на Perl, больше на Java, но попробую подсказать.  

  

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

  

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

  

Если я не ошибаюсь в своих предположениях насчёт вашей задачи. 

 Если ваш модуль pricer завязан на item\_id, ну или если половина его методов требует этот айди, то первый вариант вполне подходит. Если же айди требует только метод calc\_total, тогда лучше использовать второй вариант. 

 Зависит от сути, которую вы хотите вложить.  

Например, если этот объект является «моделью» и дает доступ к операциям в БД со всякими item'ами, то второй вариант выходит. А если объект умеет работать только с одним item, то логично его с ним и инициализировать (первый вариант). 

 В perl есть правило/выражение — There Is More Than One Way To Do It!  

Ваш пример хорошо демонстрирует это :-)  

Мое мнение: Правильно и так и так! 

 Судя по тому, что вас волнует такой вопрос, ваш модуль сравнительно небольшой, и для него оба варианта приемлемы. Когда/если ваш pricer.pm станет достаточно большим, чтоб возникла потребность в ООП, правильный вариант вам станет очевиден.  

  

Вообще правильнее будет делать так:  

```
$item->calc_total_price();

  

Где calc_total_price будет выглядеть как-то так:  

my $item = shift;
return $pricer->calc_total( item_id => $item->{id});

```
  

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

  

 Если item\_id не используется больше нигде, кроме как в calc\_total, то лучше второй вариант. Иначе — первый.  

В конструктор обычно передаются некие общие для всего объекта поля.