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

3 Cevap php

Ben (. Adınızı, geçmek, e-posta, vb) kullanıcı verilerini toplamak hangi bir web arayüzü var ve arka uç 3 diğer sistemlere (systema, SystemB, SystemC) içine karşılığı bu verileri vardır.

Provizyon 3 farklı API'ler her sistem (A, B ve C) için bir tarafından yapılıyor.

Backend benim şimdiki tasarım şuna benzer:


interface ProvisionData
{
    public function createUser();
    public function deleteUser();
    public function changePassword();
}


class SystemA_API_wrapper implements ProvisionData
{
    public function createUser(){ ... }
    public function deleteUser(){ ... }
    public function changePassword(){ ... }
}

class SystemB_API_wrapper implements ProvisionData { public function createUser(){ ... } public function deleteUser(){ ... } public function changePassword(){ ... } }

class SystemC_API_wrapper implements ProvisionData { public function createUser(){ ... } public function deleteUser(){ ... } public function changePassword(){ ... } }

Sistem * _API_wrapper her farklı CREATEUSER uygulanmasını () (ve dinlenme) fonksiyonları vardır.

Ben web arayüzünden toplanan verilerle beslemek proxy sınıfının bir tür yarattık Önyüzde .. Bu gibi görünüyor:


class provisionProxy
{
    public $sA = null;
    public $sB = null;
    public $sC = null;

//constructor instantiates all System*_API_wrapper objects
public function __construct() {        
     $sA = new SystemA_API_wrapper();
     $sB = new SystemB_API_wrapper();
     $sC = new SystemC_API_wrapper();
}

// proxy function deleteUser calls deleteUser() of each of 
// our APIs 
public function deleteUser($username, $password) {
     $this->sA->deleteUser($username, $password);         
     $this->sB->deleteUser($username, $password);
     $this->sC->deleteUser($username, $password);
}

}

Herkes herhangi bir öneri ya da daha iyi bir uygulama var mı?

(Ben zaten aynı soruyu gönderdim ama teknik sorunlar nedeniyle benim eski hesabınıza giriş yapamıyorum, bu yüzden soru revize edilmiş ve yeni bir hesap altında tekrar yayınlanmıştır Orijinal soru burada bulunabilir:. {[(0)] } - teşekkürler)

3 Cevap

Eğer her zor kodlama aramalar nerede tüm erişim kullanıcı yönetimi için merkezi bir sistem (daha iyi olurdu) için üç arka uç sistemleri değiştirmek değil varsayımına dayanarak, ben öneririm tek değişiklik, sizin vekil için senin üç sistem - bu yapıcısındaki ProvisionData nesnelerin listesini oluşturmak için daha iyi olacak ve daha sonra silme / aramaları oluşturmak, döngü bu liste üzerinden ve her biri üzerinde uygun yöntemi çağırır.

Bu gelecekte bir noktada, bu sistem D eklemek zorunda, eğer, o zaman tek bir yerde bir değişiklik yapılabilir demektir.

(Benim PHP becerileri biraz ropy, bu nedenle kod sağlamak denemez).

Tasarım iyi görünüyor, ancak soyutlama üzerinden faydalarının her türlü almak istiyorsanız Paddy tarafından önerilen bir listeye ProvisionData nesneleri ekleyerek kesinlikle şarttır. Bu üç harici sistemler sabit ve asla değişmeyecek olsa bile geçerlidir. Buna ek olarak, operation (aka Command pattern) işlem destek ve olası davranış geri alır gerçekleştirdiği nesneden ayırmak için gerçekleştirilebilir.

Bu örneği düşünün - tüm sistemleri arasında veri tutarlılığı gerektirir yana, ilgili işlemlerin çeşit olacak benim tahminim. Orada bir createUser() işlemdir ve bir sistem aşağı ise, kullanıcı, diğer iki sistem üzerinde oluşturulan istemem, bu yüzden tüm işlem bakış senin vekilin noktasından başarısız gerekir. Bu tek tek her öğeyi kontrol vs listesinde bu operasyonlar ile başa çıkmak için daha kolay. Bir liste ile, pseudocode:

/*
 * systems object represents a list of systems
 * execute() and undo() are methods in the systems object
 * 
 * result represents the result of performing an operation on some systems
 * successfulSystems represents systems in which the operation was successful
 */
operation = new Operation("createUser", ["param 1", "param 2", ..])
result = systems.execute(operation);
// if operation failed in any of the systems
if(result.FAILURE) {
    // then undo the operation on systems where it did succeed
    result.successfulSystems.undo(operation);
}

Bir liste temelde kendiniz için soyutlama başka düzeyde ekleyerek, ve bu all ve any bireysel kontroller daha anlamda bir çok kazanmaya başlamak gibi işlemler dolayısıyla bir bütün olarak dış alt sistemlerini gruplama sağlar. İşlemi ayrılması daha fazla fayda ekler.

Sen önyüz veri değişebilir onların sayısı bağımsız uç sistemleri tarafından işlenebilir olması yapmak için Gözlemci deseni kullanabilirsiniz.