以编程方式分组和类型提示不同 类
Programmatically grouping and typehinting different classes
鉴于我有一个 class,它使用某种搜索器来获取和显示 URL 列表,如下所示:
package com.acme.displayer;
import com.acme.searcher.SearcherInterface;
class AcmeDisplayer {
private SearcherInterface searcher;
public AcmeDisplayer(SearcherInterface searcher) {
this.searcher = searcher;
}
public void display() {
List<String> urls = searcher.getUrls();
for (String url : urls) {
System.out.println(url);
}
}
}
而 SearcherInterface
如下所示:
package com.acme.searcher;
public interface SearcherInterface {
List<String> getUrls();
}
这些搜索器有多种实现方式。 (例如,只有 returns 一个 String
的硬编码列表用于测试目的)。
然而,另一个对任何内容执行 HTTP 请求 API 并解析 URL 的响应,如下所示:
package com.acme.searcher.http;
import com.acme.searcher.SearcherInterface;
public class HttpSearcher implements SearcherInterface {
private RequestPerformerInterface requestPerformer;
private ParserInterface parser;
public HttpSearcher(RequestPerformerInterface requestPerformer, ParserInterface parser) {
this.requestPerformer = requestPerformer;
this.parser = parser;
}
List<String> getUrls() {
InputStream stream = requestPerformer.performRequest();
return parser.parse(stream);
}
}
这种 HTTP 请求的拆分是出于关注点的分离。
然而,这会导致一个问题:Parser
可能只为某个 API 构建,它由某个 RequestPerformer
表示。所以他们需要兼容。我现在已经摆弄了这样一个结构的泛型类型,即有一个 TypeInterface
HttpSearcher
s 构造函数的两个参数都应该实现,但我没有让它工作......另一种方法会如果另一个兼容,则只在一个 class 中实施检查,但这看起来很难看。
有什么方法可以通过他们正在处理的 API 实现这样的 RequestPerformer
和 Parser
分组吗?还是架构本身有问题?
您的 HttpSearcher
似乎是将这两个组合在一起的设备。您可以创建一个 class returns HttpSearcher
和其他 class 类似的工厂,然后对该工厂进行编码以将兼容的 RequestPerformer
和 [=13] 分组=]在一起。
我不建议利用类型系统的原因,例如通过泛型,类型 InputStream
不能保证它持有的数据 format/type 。分离获取原始数据和解析的责任似乎是个好主意,但您仍然需要 'manually' 将兼容类型组合在一起,因为只有您知道 format/type 数据 [=14] =] 将举行。
鉴于我有一个 class,它使用某种搜索器来获取和显示 URL 列表,如下所示:
package com.acme.displayer;
import com.acme.searcher.SearcherInterface;
class AcmeDisplayer {
private SearcherInterface searcher;
public AcmeDisplayer(SearcherInterface searcher) {
this.searcher = searcher;
}
public void display() {
List<String> urls = searcher.getUrls();
for (String url : urls) {
System.out.println(url);
}
}
}
而 SearcherInterface
如下所示:
package com.acme.searcher;
public interface SearcherInterface {
List<String> getUrls();
}
这些搜索器有多种实现方式。 (例如,只有 returns 一个 String
的硬编码列表用于测试目的)。
然而,另一个对任何内容执行 HTTP 请求 API 并解析 URL 的响应,如下所示:
package com.acme.searcher.http;
import com.acme.searcher.SearcherInterface;
public class HttpSearcher implements SearcherInterface {
private RequestPerformerInterface requestPerformer;
private ParserInterface parser;
public HttpSearcher(RequestPerformerInterface requestPerformer, ParserInterface parser) {
this.requestPerformer = requestPerformer;
this.parser = parser;
}
List<String> getUrls() {
InputStream stream = requestPerformer.performRequest();
return parser.parse(stream);
}
}
这种 HTTP 请求的拆分是出于关注点的分离。
然而,这会导致一个问题:Parser
可能只为某个 API 构建,它由某个 RequestPerformer
表示。所以他们需要兼容。我现在已经摆弄了这样一个结构的泛型类型,即有一个 TypeInterface
HttpSearcher
s 构造函数的两个参数都应该实现,但我没有让它工作......另一种方法会如果另一个兼容,则只在一个 class 中实施检查,但这看起来很难看。
有什么方法可以通过他们正在处理的 API 实现这样的 RequestPerformer
和 Parser
分组吗?还是架构本身有问题?
您的 HttpSearcher
似乎是将这两个组合在一起的设备。您可以创建一个 class returns HttpSearcher
和其他 class 类似的工厂,然后对该工厂进行编码以将兼容的 RequestPerformer
和 [=13] 分组=]在一起。
我不建议利用类型系统的原因,例如通过泛型,类型 InputStream
不能保证它持有的数据 format/type 。分离获取原始数据和解析的责任似乎是个好主意,但您仍然需要 'manually' 将兼容类型组合在一起,因为只有您知道 format/type 数据 [=14] =] 将举行。