gpt4 book ai didi

oop - 适配器模式和依赖

转载 作者:行者123 更新时间:2023-12-02 06:40:35 25 4
gpt4 key购买 nike

我对适配器类毫无疑问。我知道适配器类的目标是什么。什么时候应该使用。我的疑问是关于类(class) build 。我检查了一些教程,他们都说我应该将“Adaptee”类作为我的“适配器”的依赖项传递。例如

Class SampleAdapter implements MyInterface
{
private AdapteeClass mInstance;
public SampleAdapter(AdapteeClass instance)
{
mInstance=instance;
}
}

这个例子是从维基百科复制过来的。如您所见,AdapteeClass 作为依赖项传递到我的对象。问题是为什么?如果我正在更改一个对象的接口(interface) 很明显我将使用"new"接口(interface)而我不需要“旧”接口(interface)。为什么我需要在适配器外部创建“旧”类的实例。有人可能会说我应该使用依赖注入(inject),这样我就可以传递任何我想要的东西,但这是适配器——我需要更改具体类的接口(interface)。我个人认为下面的代码更好。

Class SampleAdapter implements MyInterface
{
private AdapteeClass mInstance;
public SampleAdapter()
{
mInstance= new AdapteeClass();
}
}

你怎么看?

最佳答案

我想说的是,当涉及到复杂对象时(除非类是 BuilderFactory),您应该始终避免在类中使用 new 运算符,以减少耦合并使您的代码更好地可测试。当然,像 List 或 Dictionary 或值对象这样的对象可以在类方法中构造(这可能是类方法的目的!)

例如,假设您的 AdapteeClass 是一个 Remote Proxy。如果你想使用单元测试,你的单元测试将不得不使用真正的代理类,因为在你的单元测试中没有办法替换它。

如果您使用第一种方法,您可以在运行单元测试时轻松地将模拟或伪造注入(inject)构造函数,以便您可以测试所有代码路径。

Google 有一个 guide on writing testable code其中更详细地描述了这一点,但一些要点是:

Warning Signs for not testable code

  • new keyword in a constructor or at field declaration
  • Static method calls in a constructor or at field declaration
  • Anything more than field assignment in constructors
  • Object not fully initialized after the constructor finishes (watch out for initialize methods)
  • Control flow (conditional or looping logic) in a constructor
  • Code does complex object graph construction inside a constructor rather than using a factory or builder
  • Adding or using an initialization block

关于oop - 适配器模式和依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838337/

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