2016-10-18 12 views
1

Скажем, я создаю библиотеку libFoo, который предоставляет АНИ этот классMocking классы, которые используют Pimpl шаблон

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 рисунка. Позже я понимаю, что пользователи моей публичной книги классов могут захотеть издеваться над ними, когда они пишут модульные тесты для своего собственного кода. Теперь им нужно затенять класс Book, так как он не имеет виртуальных методов.

Итак, я хочу сделать класс Book легко макет. Для этого у нас есть виртуализация или templatization (любопытно повторяющийся шаблон дизайна или hi-perf инъекции зависимостей). Каким будет преимущество каждого из них в контексте шаблона Pimpl? Для меня это выглядит не так, как иметь виртуальные методы для класса, реализующего шаблон Pimpl. С другой стороны, виртуализация публичного API libFoo сделает библиотеку макетной с минимальными изменениями. Что ждет меня «gotchas», если я выберу виртуализацию и Pimpl?

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_; 
}; 
+1

_ «Что ж, меня ждут, если я выберу виртуализацию и Пимпл?» Я не вижу ничего. –

+0

Я не рекомендую наследовать на основе mocking в C++ * вообще *, потому что есть слишком много возможностей для кого-то, у которого отсутствует ссылка где-то и недопустимые объекты, возникающие из неявных копий. классы pImpl являются * более безопасными * в этом отношении, потому что преобразование указателя, вероятно, не сработает – Caleth

ответ

2

Pimpl 100% о реализации, он вообще не влияет на интерфейс.

Mocking - это поддержание интерфейса и замена реализации.

Не существует перекрытия. Для насмешек не имеет значения, как реализуется класс, который вы издеваетесь.


Вы могли бы попытаться сделать что-то смешное, как сделать Implementation класс виртуальной. Это было бы удивительно и неожиданно для разработчиков, поэтому я настоятельно рекомендую это. Относитесь к классам pimpl как к любому другому классу.

 Смежные вопросы

  • Нет связанных вопросов^_^