[ <<<
| 1
| 2
| 3
| 4
| врезка
]
Шаблоны и функции фабрики в контексте пространства имен
(Врезка)
В основной статье, я утверждаю, что статические методы классов должны быть реализованы как внешние функции всякий раз, когда это возможно, потому что это увеличивает инкапсуляцию класса. Здесь я рассматриваю две возможных реализации для функций фабрики:
// менее инкапсулированный проект
class Widget
{
...
public:
static Widget* make(/* params */);
};
// более инкапсулированный проект
namespace WidgetStuff
{
class Widget { ... };
Widget* make( /* params */ );
};
Эндрю Коунинг (Andrew Koenig) подчеркивает, что первый вариант (в котором make является статическим методом класса) позволяет написать шаблонную функцию, которая может вызывать make и не знать порождаемый ею тип:
template<typename T>
void doSomething( /* params */ )
{
// вызвать функцию фабрики для класса T
T *pt = T::make( /* params */ );
...
}
Это не возможно в проекте, использующем пространство имен, потому что нет никакого способа, чтобы идентифицировать пространство имен, содержащего тип, внутри шаблона. То есть, нет способа выяснить чем является ??? в псевдокоде, приведенном ниже:
template<typename T>
void doSomething( /* params */ )
{
// нельзя узнать какое T содержит пространство имен!
T *pt = ???::make( /* params */ );
...
}
Для функций фабрики и подобных функций, которые могут быть заданы с одинаковыми именами, это означает, что максимальная инкапсуляция класса, и максимальное использование шаблонов имеют разногласия. В таких случаях, Вы должны решить, что является более важным и следовать этому. Однако, для статических методов классов - с именами определяемыми классом, проблема шаблонов перестает возникать, и инкапсуляция может снова быть главенствующей.
Возврат к статье
[ <<<
| 1
| 2
| 3
| 4
| врезка
]
|