Вопрос о дизайне: Какая практика лучше? - PullRequest
2 голосов
/ 10 января 2010

У меня есть 3 разных веб-сервера, которые обрабатывают пользовательские данные (имя пользователя / пароль / электронная почта / и т. Д.). У меня 3 разных вызова веб-службы соответственно, поэтому я создал 3 разных класса, которые вызывают одну и ту же информацию (getUsername, setUsername, getEmail, setEmail и т. Д.). Из основного класса я создаю экземпляры каждого объекта вызова веб-сервиса и, когда у меня есть запрос на новое имя пользователя, пароль, я вызываю метод createUsername() каждого класса (предоставление данных).

Есть ли у вас какие-либо предложения о том, как применить шаблон проектирования для этой проблемы? Я думал о создании класса, который будет иметь метод createUsername() {}, и в этом я буду вызывать каждый из классов webservice и сохранять каждый результат в предопределенном массиве. У кого-нибудь есть предложение или лучшая практика?

В настоящее время у меня есть:


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

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

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

<p>//My "like a proxy" class:</p>

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

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

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

}

// и вызов выполняется из другого класса, примерно так:

class doThings { function run () { $ ws = new webServiceCalls (); $ ws_res = $ ws-> createUser (); } } Я думал, что приведенное выше представление поможет вам понять текущее дизайн (и, возможно, лучшее понимание проблемы. спасибо!

Ответы [ 4 ]

1 голос
/ 10 января 2010

Eep! Во-первых, поскольку они очень похожи, они должны иметь общий базовый класс или использовать интерфейс:

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) {}
}

Во-вторых, я надеюсь, что ваши услуги на самом деле не называются 1,2,3. Если это так, это подсказывает мне, что, возможно, вам следует использовать какую-то форму массива.

Мне не нравится твоя идея о "прокси" классе. Вы всегда используете все 3 сервиса или это какая-то библиотека, в которую вы просто включаете нужный сервис? Вы не предоставили достаточно информации о том, чего на самом деле пытаетесь достичь.

0 голосов
/ 10 января 2010

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

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);
    }
    // ...
}

Вы также можете использовать магические методы для прокси этой функции:

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);
    }
}

Таким образом, если вы добавите больше функций в свой интерфейс, вам не понадобитсяобновить свой класс пула.Надеюсь, это поможет!

0 голосов
/ 10 января 2010

Я бы выбрал совершенно другой подход. REST-интерфейс идеально подходит для того, что вы пытаетесь сделать, это стандартные команды CRUD.

0 голосов
/ 10 января 2010

Что вы думаете о арке Model - ModelMapper? Zend Framework использует этот подход. Вы могли бы иметь следующие классы: (глупое соглашение об именах для лучшего понимания)

  • Model_User
  • Mapper_User_Email
  • Mapper_User_Name
  • Mapper_User_Password

А отдельные средства отображения читают необходимые данные, сторонний класс вызывает только Model_User-> getName ()

Edit: Пример использования:

//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);
}

Только пример, геттеры и сеттеры могут быть более оборонительными.

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