Ben komut desen kullanarak olmalıdır?

1 Cevap php

Benim Room class Ben komut desen kullanmaya karar vermeden önce kullanılan yöntemler bir yeri vardır. Daha önce, ben komutları çok çağırarak ve şimdi her yöntem için benim roomParser sınıfında bir yöntem yapmak zorunda gibi görünüyor. Ben, diyelim setHotelCode çağırmak istedim ben üzerinden roomParser o dolaşır bir yöntem oluşturmak zorunda ve yöntemini çağırır olacaktır. Bu ben komut desen kullanarak olmalıdır yolu var mı?

<?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;

Edit: Ben tüm nesneleri paylaşacak özelliklerini depolayarak RoomParser az genel yaptıysanız daha kolay olabilir düşünüyorum. Ben belirli bir nesne için geçersiz kılmak istiyorsam muhtemelen yöntemleri yapmak gerekecek ama.

1 Cevap

En az üç farklı şeyler yapıyor gibi bu sınıf görünüyor? (Oda rezervasyon verileri saklama SOAP paketleri oluşturarak, SOAP ulaşım taşıma). Sizin parse () işlevi, bir gizem biraz ...

Ne basit Odası sınıf oluşturmuş olur?

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 ...
}