2016-03-25 31 views
0

aşağıdaki yöntem ettik: girişimi ( polimorfik döndürme türü

attemptToGetToken(TokenRequestAttempt attempt); 

Ben jetonu almak için üçüncü taraf bileşeni kullanmak ancak bazı durumlarda başarısız olabilir değil geçerli veya eksik parametreler).

aslında başarısız bekleniyor çünkü bu durum için bir özel durum atmak için hiçbir sebep yoktur.

Ancak, sonuca bağlı olarak, son kullanıcı, hareket etmektedir.

Ben kullanıcı bu/yapmaları gerekenler karar veren bir nesne dönmek gerektiği anlamına gelir.

muhtemelen en açık cevap basitçe böyle sınıf var olacaktır:

class AttemptResult { 

    constructor(status, token, errorMessage); 
    getStatus(); 
    getToken(); 
    getErrorMessage(); 
    isSuccessful(); 
} 

Ve basitçe düzgün nüfuslu bu nesneyi döndürmek (G/başarı için spesifik fabrika yöntemi eklemek devlet başarısız, ama olurdu olabilir sadece araç).

Bu yaklaşım ile sorunumuz sözleşme net olmadığıdır. başarısızlık durumunda

, token null olurdu ama developper sonra deneme başarısız Hava olmadığını kontrol etmek için isSuccessful() yöntemi kullanmak gerekir. Ancak hiçbir şey, getToken() numaralı telefonu aramasını ve null sonucunu almasını engelleyecektir.

İki tür nesneyi gerçekten döndürmenin daha iyi olmayacağını merak ediyorum.

interface TokenAttemptResult {} 

class FailedTokenAttempt implements TokenAttemptResult { 

    getError(); 

} 

class SuccessfulTokenAttempt implements TokenAttemptResult { 

    getToken(); 
} 

ben hem sonucu arasında bir ilişki tanımlamak için boş arabirimini uygulamak için, şimdi benim hizmetindeki bir dönüş türü olarak bu arayüzü kullanabilirsiniz:

TokenAttemptResult attemptToGetToken(TokenRequestAttempt attempt); 

bir kullanıcı yukarıdaki yöntem çağrıları O, geri dönüş türünü kontrol etmek ve buna göre hareket etmekle sorumludur, çağrılmaması gereken ve yan etkiler yaratabilecek olan yöntemi çağırmasını engeller.

Eğer bu tür bir tasarım hakkında ne düşünüyorsunuz? Herhangi biriniz bunu denediniz ve herhangi bir geri bildiriminiz var mı?

Lütfen gerçek argümanlar olmadan kişisel tercihleri ​​içeren yapıcı olmayan cevaplardan kaçının, gerçekten ciddi tasarım teorilerini arıyorum.

Teşekkürler!

cevap

1

Alt sınıflandırma yaklaşımı çalışacaktır, ancak arabirimler açık olduğu için, istemcinin arabirimin tüm olası uygulama türlerini kapsamlı olarak kontrol ettiğinden emin olma yolu yoktur. OO vakalarının kapatılmasına yönelik OO yaklaşımı, visitor pattern örn.

public interface TokenResultVisitor<TResult> { 
    TResult Visit(FailedTokenAttempt failure); 
    TResult Visit(SuccessfulTokenAttempt success); 
} 

ve sonra

interface TokenAttemptResult { 
    T Accept<T>(TokenResultVisitor visitor); 
} 

Bu dil sadece iki işleyicileri örneğin götüren bir yöntem tanımlayabilirsiniz birinci sınıf işlevleri destekliyorsa böylece sadece iki olası vaka varsa oldukça ağır bir yaklaşımdır

interface TokenAttemptResult { 
    T Handle<T>(success: Result => T, failure: TokenError => T); 
} 
+0

Olası uygulama hakkında iyi nokta! Ancak, bu durumda Kabul Edilebilirliğin sadece bir Hata veya Başarı olabileceğini (kendi başına konuştuğunu) kabul etmenin kabul edilebilir olup olmadığını merak ediyorum. Bu yaklaşımın arkasındaki temel amaç, mümkün olan iki tür sonucu doğru bir şekilde modellemek ve boş bir jetona ya da hayalet bir hataya erişmesi nedeniyle çalışma zamanı hatasını önlemekti. – Trent

İlgili konular