模拟使用 Pimpl 模式的 类
Mocking classes that use Pimpl pattern
比方说,我创建了一个库 libFoo,它公开了一个 API 这个 class
class Book
{
public:
Book(string const& title, string const& author);
string const& title() const;
string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
需要使用 pimpl 模式。后来,我意识到我的 public class 书的用户可能想在为自己的代码编写单元测试时模拟它。现在他们需要隐藏 Book
class 因为它没有虚拟方法。
所以,我想让 Book
class 易于模拟。为此,我们有虚拟化或模板化(奇怪的循环设计模式或高性能依赖注入)。
在 Pimpl 模式的上下文中,每个模式的优势是什么?
对我来说,在实现 Pimpl 模式的 class 上使用虚拟方法看起来有点不对。另一方面,libFoo 的 public API 的虚拟化将使该库可以通过最少的更改进行模拟。如果我选择虚拟化和 Pimpl,'gotchas' 等着我的是什么?
class Book
{
public:
Book(string const& title, string const& author);
virtual string const& title() const;
virtual string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
Pimpl 是 100% 的实现,它根本不影响界面。
Mocking 是关于保留接口和交换实现。
没有重叠。对于模拟,class 你正在模拟的实现方式没有区别。
您可以尝试做一些有趣的事情,例如将 Implementation
class 虚拟化。对于维护开发人员来说,这将是非常令人惊讶和意想不到的,所以我强烈建议不要这样做。像对待其他人一样对待粉刺 classes class。
比方说,我创建了一个库 libFoo,它公开了一个 API 这个 class
class Book
{
public:
Book(string const& title, string const& author);
string const& title() const;
string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
需要使用 pimpl 模式。后来,我意识到我的 public class 书的用户可能想在为自己的代码编写单元测试时模拟它。现在他们需要隐藏 Book
class 因为它没有虚拟方法。
所以,我想让 Book
class 易于模拟。为此,我们有虚拟化或模板化(奇怪的循环设计模式或高性能依赖注入)。
在 Pimpl 模式的上下文中,每个模式的优势是什么?
对我来说,在实现 Pimpl 模式的 class 上使用虚拟方法看起来有点不对。另一方面,libFoo 的 public API 的虚拟化将使该库可以通过最少的更改进行模拟。如果我选择虚拟化和 Pimpl,'gotchas' 等着我的是什么?
class Book
{
public:
Book(string const& title, string const& author);
virtual string const& title() const;
virtual string const& author() const;
private:
struct Implementation;
std::shared_ptr<Implementation> impl_;
};
Pimpl 是 100% 的实现,它根本不影响界面。
Mocking 是关于保留接口和交换实现。
没有重叠。对于模拟,class 你正在模拟的实现方式没有区别。
您可以尝试做一些有趣的事情,例如将 Implementation
class 虚拟化。对于维护开发人员来说,这将是非常令人惊讶和意想不到的,所以我强烈建议不要这样做。像对待其他人一样对待粉刺 classes class。