gpt4 book ai didi

java - 如何正确分离生产类和模型类

转载 作者:行者123 更新时间:2023-11-30 02:41:28 25 4
gpt4 key购买 nike

我有 GPS 读取器类,它可以从 GPS 接收器传递坐标。显然,这适用于具有真实接收器的机器。现在我创建了一个模型类,它随机给我坐标,这样我就可以启动我的应用程序并查看是否一切正常,而无需将其部署到另一台机器。

现在这是结构:

class AbstractGPSReader {
}

class RealGPSReader extends AbstractGPSReader {
}

class FakeGPSReader extends AbstractGPSReader {
}

class SomeOtherClass {
private AbstractGPSReader gpsReader = new RealGPSReader();
}

为了能够测试我必须替换的应用程序

new RealGPSReader()

new FakeGPSReader()

有没有更优雅的方式?我可以阻止某人在生产中使用此类吗?

最佳答案

您应该使用dependency injection 。这很简单:应该为类提供其依赖项的实例,而不是自己创建依赖项。

例如:

class SomeOtherClass {
private final AbstractGPSReader gpsReader = new RealGPSReader();
}

变成:

class SomeOtherClass {
private final AbstractGPSReader gpsReader;
public SomeOtherClass(AbstractGPSReader gpsReader) {
this.gpsReader = gpsReader;
}
}

这样做的好处是,现在 SomeOtherClass 仅耦合到 AbstractGPSReader,而之前它耦合到 AbstractGPSReaderRealGPSReader

这在编写单元测试时是一个巨大的好处,因为现在该类可以由未经修改的测试套件使用:

void testSomeOtherClass() {
SomeOtherClass someOtherClass = new SomeOtherClass(new FakeGPSReader());
someOtherClass.someMethod();
// etc...
}

有些框架可以帮助您自动注入(inject)依赖项,但我建议不要使用这些框架以保持代码简单性。

<小时/>

顺便说一句,您应该尝试围绕接口(interface)而不是抽象类构建 API。

关于java - 如何正确分离生产类和模型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41565549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com