Tasarım Soru: İyi bir uygulamadır?

4 Cevap php

Ben kullanıcı verilerini işlemek 3 farklı web sunucuları (kullanıcı adı / parola / email / vs.) Var. Ben 3 farklı web servis sırasıyla aramaları var, bu yüzden aynı bilgileri için (getUsername, setUsername, getEmail, {[aramaları 3 farklı sınıflar oluşturduk (3)]}, vb.) Ana sınıfından Her Webcoder-nesneleri çağrı örneğini ve ben yeni bir kullanıcı adı için bir istek olduğunda, parola ben her sınıfın createUsername() yöntemi (veri sağlama) diyoruz.

Bu sorun için bir tasarım deseni nasıl uygulanacağı konusunda herhangi bir öneriniz var mı? I createUsername() {} bir yöntemi var ve bu ben webservice-sınıfların her çağırır ve önceden tanımlanmış bir dizinin her sonucunu saklamak bir sınıf yapma düşündüm. Herkes herhangi bir öneri ya da daha iyi bir uygulama var mı?

currently i have:


class webservice1calls {
function createUser($username, $password) {}
function deleteUser($username, $password) {}
function createGroup($groupname) {}
function deleteGroup($groupname) {}
}

class webService2calls { function createUser($username, $password) {} //different implementation function deleteUser($username, $password) {} //different implementation function createGroup($groupname) {} //different implementation function deleteGroup($groupname) {} //different implementation }

class webService3calls { function createUser($username, $password) {} //different implementation function deleteUser($username, $password) {} //different implementation function createGroup($groupname) {} //different implementation function deleteGroup($groupname) {} //different implementation }

/ / Benim sınıf "bir proxy gibi":

class webServiceCalls { function createUser($username, $password) { $ws1 = new webService1calls(); $ws2 = new webService2calls(); $ws3 = new webService3calls();

$res1 = $ws1->createUser($username, $password);
$res2 = $ws2->createUser($username, $password);
$res3 = $ws3->createUser($username, $password);

// return result depending $res1,$res2 and $res3 values

}

/ / Ve çağrı biraz bu gibi başka bir sınıftan yapılır:

class doThings { function run() { $ws = new webServiceCalls(); $ws_res = $ws->createUser(); } }

I thought that the above representation would help you understand the current design (and maybe a better understanding of the problem. thanks!

4 Cevap

EEP! Bu çok benzer olduğu Birincisi, bunlar ortak bir temel sınıf paylaşmak veya bir arabirim kullanmak gerekir:

interface WebService {
    function createUser($username, $password);
    function deleteUser($username, $password);
    function createGroup($groupname);
    function deleteGroup($groupname);
}

class MyService implements WebService {
    function createUser($username, $password) {}
    function deleteUser($username, $password) {}
    function createGroup($groupname) {}
    function deleteGroup($groupname) {}
}

İkincisi, ben senin hizmetleri aslında 1,2,3 aramadı umuyoruz. Onlar, bu belki bir dizinin bazı formunu kullanarak gerektiğini bana gösteriyor.

Ben bir "proxy" sınıfının kendi fikrini sevmiyorum. Her zaman 3 hizmetlerini kullanarak, ya da bu sadece ihtiyacınız hizmeti kütüphane çeşit var mı? Eğer gerçekten başarmak için çalışıyoruz ne hakkında yeterli bilgi vermemesi.

Ben ayrı bir sınıfta her sunucunun uygulaması tutma fikrini seviyorum, ve ben de bir arabirim kullanan Mark fikir gibi. Ben de bir proxy sınıfı senin fikrin düşkün değilim, ama size sunulan formda. Ben bir çeşit havuz gibi davranan bir sınıf oluşturmak istiyorum. Böyle bir şey:

class WebServicePool implements WebService {

    private $webServices = array();

    public function registerWebService($service) {
        if($service instanceof WebService)
            $this->webServices[] = $service;
    }

    function createUser($username, $password) {
        foreach($this->webServices as $service)
            $service->createUser($username, $password);
    }
    // ...
}

Ayrıca vekil bu işlevsellik için sihirli yöntemleri kullanabilirsiniz:

class WebServicePool {

    private $webServices = array();

    public function registerWebService($service) {
        if($service instanceof WebService)
            $this->webServices[] = $service;
    }

    function __call($name, $arguments) {
        foreach($this->webServices as $service)
            call_user_func_array(array($service, $name), $arguments);
    }
}

Bu şekilde, sizin arayüzüne daha fazla işlev eklerseniz, sizin havuz sınıf güncellemeniz gerekmez. Bu yardımcı olur umarım!

Eğer bir modeli hakkında ne düşünüyorsunuz - ModelMapper kemer? Zend Framework bu yaklaşımı kullanır. (Daha iyi anlaşılması için saçma bir adlandırma kuralı): Sen possibily aşağıdaki sınıfları olabilir

  • Model_User
  • Mapper_User_Email
  • Mapper_User_Name
  • Mapper_User_Password

Ve bireysel mappers gerekli veri okumak, 3. parti sınıfı yalnızca Model_User-> getName aramaları ()

Edit: Example usage:

//simple code:
$user = new Model_User();
echo "Your name is: " . $user->getName();

//Model_User:
public function getName() {
    if($this->_name = null) {
        $this->getNameMapper()->getName($this);
        //getNameMapper() returns a Mapper_User_Name object
    }
    return $this->getName();
}   

//Mapper_User_Name:
public function getName($user) {
    $name = "john"; /*magic here, the class communicate with the service that holds names*/
    $user->setName($name);
}

Örnek sadece, alıcılar ve ayarlayıcıları daha defansif olabilir.

Ben tamamen farklı bir yaklaşım alacaktı. A REST interface standart CRUD komutları olan, yapmaya çalıştığınız şey için mükemmel olurdu.