Должен ли я использовать шаблон команды? Похоже, много работы - PullRequest
2 голосов
/ 12 февраля 2010

В моем классе Room есть много методов, которые я использовал до того, как решил использовать шаблон команды. Раньше я вызывал много команд, и теперь, похоже, мне нужно создать метод в моем классе roomParser для каждого метода. Если бы я хотел вызвать, скажем, setHotelCode, мне пришлось бы создать метод в roomParser, который выполняет итерацию и вызывает метод. Это то, как я должен использовать шаблон команды?

<?php

interface Parseable {

    public function parse( $arr, $dept );
}

class Room implements Parseable {

    protected $_adults;
    protected $_kids;
    protected $_startDate;
    protected $_endDate;
    protected $_hotelCode;
    protected $_sessionNs;
    protected $_minRate;
    protected $_maxRate;
    protected $_groupCode;
    protected $_rateCode;
    protected $_promoCode;
    protected $_confCode;
    protected $_currency = 'USD';
    protected $_soapAction;
    protected $_soapHeaders;
    protected $_soapServer;
    protected $_responseXml;
    protected $_requestXml;

    public function __construct( $startdate,$enddate,$rooms=1,$adults=2,$kids=0 ) {
        $this->setNamespace(SESSION_NAME);
        $this->verifyDates( $startdate, $enddate );

        $this->_rooms= $rooms;
        $this->_adults= $adults;
        $this->_kids= $kids;

        $this->setSoapAction();
        $this->setRates();
    }

    public function parse( $arr, $dept ) {
        $this->_price = $arr * $dept * rand();
        return $this;
    }

    public function setNamespace( $namespace ) {
        $this->_sessionNs = $namespace;
    }

    private function verifyDates( $startdate, $enddate ) {}

    public function setSoapAction( $str= 'CheckAvailability' ) {
        $this->_soapAction = $str;
    }

    public function setRates( $rates='' ) { }

    public function setHotelCode($code ) { $this->_hotelCode = $code; }

    private function getSoapHeader() {
        return '<?xml version="1.0" encoding="utf-8"?>
            <soap:Header>
            </soap:Header>';
    }

    private function getSoapFooter() {
        return '</soap:Envelope>';
    }

    private function getSource() {
        return '<POS>
            <Source><RequestorId ID="" ID_Context="" /></Source>
            </POS>';
    }

    function requestXml() {
        $this->_requestXml  = $this->getSoapHeader();
        $this->_requestXml .='<soap:Body></soap:Body>';
        return $this->_requestXml;
    }

    private function setSoapHeaders ($contentLength) {
        $this->_soapHeaders = array('POST /url HTTP/1.1',
            'Host: '.SOAP_HOST,
            'Content-Type: text/xml; charset=utf-8',
            'Content-Length: '.$contentLength);
    }
}

class RoomParser extends SplObjectStorage {

    public function attach( Parseable $obj ) {
        parent::attach( $obj );
    }

    public function parseRooms( $arr, $dept ) {
        for ( $this->rewind(); $this->valid(); $this->next() ) {
            $ret = $this->current()->parse( $arr, $dept );
            echo $ret->getPrice(), PHP_EOL;
        }
    }
}

$arrive = '12/28/2010';
$depart = '01/02/2011';
$rooms = new RoomParser( $arrive, $depart);
$rooms->attach( new Room( '12/28/2010', '01/02/2011') );
$rooms->attach( new Room( '12/29/2010', '01/04/2011') );
echo $rooms->count(), ' Rooms', PHP_EOL;

Редактировать : Я думаю, может быть проще, если я сделаю RoomParser менее универсальным, сохраняя свойства, которыми будут пользоваться все объекты. Хотя, возможно, мне придется создавать методы, если я хочу переопределить определенный объект.

1 Ответ

1 голос
/ 12 марта 2010

Этот класс выглядит так, как будто он делает как минимум три разные вещи? (Хранение данных бронирования номеров, создание SOAP-пакетов, обработка SOAP-транспорта). Ваша функция parse () немного загадочна ...

Что если вы создали более простой класс Room?

class Room
{
  protected $_properties = array( 'numberOfAdults' => 0, 'numberOfKids' => 0, ... etc );

  function __set( $name, $value )
  {
     if (!isset($this->_properties[$name])) throw new Exception( 'Invalid property ' . $name );
     $this->_properties[$name] = $value;
  }

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