簡體   English   中英

類型安全的對象組成

[英]Type-safe object composition

我目前正在開發一個網絡健康監視系統,該系統可以監視多種資源,基於事實進行診斷並根據診斷做出反應。

最初的想法...

我最初的想法是要有一個抽象的Watcher類,該類可以配置一個Diagnosis對象(負責基於Facts生成Diagnostic )和DiagnosticHandler對象列表。 這個Watcher類將具有一個abstract protected Facts _check()模板方法,該方法被子類(例如HttpWatcherMemoryWatcher abstract protected Facts _check()覆蓋。

Facts是一個標記界面,代表可以觀察到產生Diagnostic 例如, HttpWatcher_check方法將返回HttpFacts ,它基本上是http響應的詳細信息。

HttpWatcher構造函數如下所示:

public HttpWatcher(
    Duration interval, 
    Diagnosis<HttpFacts> diagnosis, 
    List<DiagnosticHandler> handlers,
    URL url
)

如我們所見,由於此類的_check方法返回HttpFacts ,因此它還僅允許基於HttpFacts進行Diagnosis策略,而這正是我們想要的。 這樣,如果使用了不兼容的Diagnosis策略,則編譯器可能會抱怨。

缺少概念?

但是,這種設計有些困擾我,因為我注意到就行為而言, Watcher子類唯一覆蓋的是_check方法。 更糟糕的是, _check算法無法在其他地方重用。 這使我想到,也許我在設計中缺少一個Resource概念,該概念可以封裝該算法以檢索Facts而不必繼承Watcher

話雖如此,我只需要一個具體的Watcher類即可,該類將配置有ResourceDiagnosis<T extends Facts>List<DiagnosticHandler>

這種設計對我來說更有意義,但隨后我將失去類型安全性,從而無法將不兼容的策略一起使用,如下所示:

new Watcher(
    new Duration(...),
    new HttpResource(...),
    new SimpleMemoryDiagnosis(...), /*<- incompatible with HttpResource*/
    ...
)

解?

自從我使用強類型語言編程以來已經有一段時間了,我想確保自己使用類型來發揮自己的優勢,但是與此同時,我也不希望自己的設計受到影響。

我曾經HttpResource要創建一個新類,例如HttpWatchedResource ,該類將封裝HttpResourceDiagnosis<HttpFacts>對象。

就像是:

public abstract class WatchedResource {
    private final Resource resource;
    private final Diagnosis diagnosis;

    public WatchedResource(Resource resource, Diagnosis diagnosis) {
        //null checks
        this.resource = resource;
        this.diagnosis = diagnosis;
    }

    //called by Watcher
    public final Diagnostic checkHealth() {
        return diagnosis.diagnose(resource.facts());
    }
}

public final class HttpWatchedResource {
    public HttpWatchedResource(HttpResource resource, Diagnosis<HttpFacts> diagnosis) {
        super(resource, diagnosis);
    }
}

然后, Watcher構造函數將如下所示:

public Watcher(
    Duration interval, 
    WatchedResource resource, 
    List<DiagnosticHandler> handlers,
    URL url
)

我想知道當對象由可能不兼容的多種策略組成和/或我是否朝着建議的解決方案邁向正確方向時,是否使用了廣泛采用的模式?

我可能會遺漏一些東西,但是基於對問題的當前理解,我會做類似的事情:

public class Watcher<T> {
    public Watcher(Resource<T> res, Diagnosis<T> diag) {
    ...
    }
}

public class HttpResource implements Resource<HttpFacts> {
   ...
}

這樣可以保證Watcher和Diagnosis始終是兼容的類型,並且仍然允許您覆蓋二者之一。

我可能很想念一些重要的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM