Nasıl benim sınıf refactor?

3 Cevap php

Temelde bilgileri bir seferde sadece bir oda işleyebilir .. örneğin, bir yanıt alır oda için bir soap isteği gönderen bir sınıf vardır:

class roomParser {
    private $numRooms;
    private $adults;
    private $dailyPrice;

    public function parse(){}
    public function send(){}

};

$room = new roomParser( $arrival, $departue );
$return = $room->parse();

if ( $return ) { }

Şimdi temelde birden fazla oda destekleme ikilem var, ve her oda için ayrı ayrı dailyPrice, yetişkinlerin # bilgilerini tutmak zorunda, bu yüzden onun bir çok adım forma yana her oda bilgilerini sessionize var ..

Ben sadece benim nesne birden çok örneğini oluşturmak, ya da bir oda dizide herhangi bir oda # destekler ve odaların dizideki her oda için özelliklerini içeren bu yüzden nasılsa benim sınıf değiştirmek gerekir?

Düzenleme # 1: Komut desen uygulama çalıştı tavsiye aldıktan sonra:

<?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='' ) { }

    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;

3 Cevap

Söz konusu bilgiler verilen, muhtemelen kullandığınız bir Command Pattern

Tüm Odalar parse () komutu uygulamak gerekir

interface Parseable
{
    public function parse($arr, $dept);
}

Bir oda örneği bu gibi görünebilir

class Room implements Parseable
{
    protected $_price;
    protected $_adults;
    public function parse($arr, $dept) {
         // nonsense calculation, exchange with your parse logic
        $this->_price = $arr * $dept * rand();
        return $this;
    }
    public function getPrice()
    {
        return $this->_price;
    }
}

Gerekirse onları geçmesi için, ben, tüm odaları, depolar ve bunların parse () yöntemi çağırmak ve aynı zamanda ayrıştırma (dan dönüş ile ne yapacağını bilir bilir nasıl bir Invoker) eklemek istiyorum

class RoomParser extends SplObjectStorage
{
    // makes sure we only have objects implementing parse() in store      
    public function attach(Parseable $obj)
    {
        parent::attach($obj);
    }

    // invoking all parse() methods in Rooms
    public function parseRooms($arr, $dept)
    {
        for($this->rewind(); $this->valid(); $this->next()) {
            $ret = $this->current()->parse($arr, $dept);
            // do something with $ret
            echo $ret->getPrice(), PHP_EOL;
        }
    }
    // other methods
}

Ve sonra bu gibi kullanabilirsiniz:

$parser = new RoomParser;
$parser->attach(new Room);
$parser->attach(new Room);
$parser->attach(new Room);
$parser->attach(new Room);
echo $parser->count(), ' Rooms', PHP_EOL;

$parser->parseRooms(1,2);

Invoker SplObjectStorage uzanır, bu yüzden, yineleyici, Traversable Serializable ve ArrayAccess Sayılabilir uygulayan unutmayın.

Peki ne tanımladığınız Birden fazla oda işlemek istiyorsa, sadece bu tek odalı nesnelerinin bir koleksiyonu olan bir nesne oluşturmak gerekir, bu yüzden doğal olarak, tek bir oda işleyen bir nesnedir.

Eğer RoomParsers yapmak aynı şekilde MultiRoomParser etkileşim istiyorsanız, bu senaryo Composite Pattern için iyi bir aday olabilir. Temel olarak, MultiRoomParser RoomParsers bir koleksiyon içerecektir, ve örneğin MultiRoomParser üzerinde parse () gibi bir yöntemini çağırdığınızda, tüm koleksiyonunda RoomParsers ve çağrıları yoluyla sadece dolaşır her öğe üzerinde () ayrıştırmak.

Ben nesnenin birden fazla örneğini yapma mantıklı olduğunu söyleyebilirim. Bu nesnelerin nasıl çalışır.