Dart:用于从HTTP请求构造对象的接口的代码设计



我试图实现一个抽象基类的对象,将从HTTP调用解析。我们的目标是创建一个CachedFuture<T>类,当它被访问时,通过HTTP调用来获取对象并缓存结果。

我倾向于这样实现这些类:

class HTTPGetable<T extends HTTPGetable<T>> {
static Future<T> httpGet(int id);
}
class CachedFuture<T extends HTTPGetable<T>> {
int _id;
Future<T?>? _cachedResult;
bool _has_already_made_request;
CachedFuture({required int this._id});
Future<T?> get() {
if(this._cachedResult == null)
try {
this._cachedResult = T.httpGet(this._id);
} except {
// parse error or other error
this._cachedResult = CompletableFuture.completedFuture(null);
}       
}
return this._cachedResult;
}
}

这里的直觉是,有很多对象带有"指针"。到后端数据库中的其他对象。在HttpRequest中构造要返回的对象时,遵循每个指针是没有意义的,所以我的意图是包装"指针"。在这个CachedFuture类。

这应该使某人能够"关注";这些"指针"之一而不必担心缓存HTTP请求或构造该请求的细节。希望这为类的用户提供了另一层抽象,这样他们就可以正确处理与底层发生的事情无关的代码。

然而由于静态接口不在Dart中,所以这种模式不起作用。我的直觉是,这是一个信号,我应该使用不同的模式,而不是试图强迫我的方式。

httpGet基本上是一个工厂方法,但CachedFuture的功能需要一种从类型查找工厂的方法,所以我也没有立即看到实现真正工厂的好方法。

谁能推荐一个好的编程模式来解决这个问题?我想这对于http请求和数据库请求来说都是一个很常见的用例。

我发现最好的解决办法是做不同的"工厂"。到httpGet每个T,然后使用反射查找适当的工厂。然而,正如描述的那样,这似乎相当复杂& &;很容易出错,所以我仍然相信几乎肯定有更好的模式可以使用。

你不能只是创建抽象类CachedFuture沿着你写的行,用一个抽象方法httpGet(int id)由子类实现?如果只有一个<T extends CachedFuture>类型对象的实例,那么你可以考虑将子类设为Singleton。如果我误解了你的问题,我道歉!

最新更新