Такой рефакторинг применяется, когда методу нужна дополнительная информация от вызывающего его клиента.

php
  1.  
  2. <?php
  3. // ..... было
  4. public function getProducts()
  5. {
  6. // забираем продукты из базы
  7. return $this->orm->select('products');
  8. }
  9.  

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

php
  1.  
  2. public function getProducts($category_id=null)
  3. {
  4. $cid = intval($category_id);
  5. if($cid)
  6. {
  7. $this->orm->setCriteriaEqual('category_id',$cid);
  8. }
  9. // забираем продукты из базы
  10. return $this->orm->select('products');
  11. }
  12.  

Обратите внимание, что в данном случае рефакторинг выполнен безопасно, т.е. старый функционал не пострадал — если клиент вызовет метод без параметров, ему вернутся все продукты.

Комменты

  • 05.10.2010 01:46:38 tenshi:
    это случай простой. но бывают и сложные, когда модифицируя метод можно незаметно внести ошибку. поэтому лучше не переписывать метод оставляя большую часть кода неизменной. а создать новый метод, а старого даже не касаться.

    а то такими темпами в getProducts появится неимоверное число параметров и сложная логика внутри.

    а вообще, возможно стоит сделать дсл в духе смалтолка

    function _getProducts()
    function _getProducts_category( $catId )
    function _getProducts_name( $name )
    function _getProducts_category_name( $catId, $name )

    $obj->getProducts( array( 'category' => 'xxx' ) )

Добавить коммент