Я помню, как читал некоторое время назад об идиоме конструктора для C ++ в случаях сложных конфигураций объектов. Это особенно полезно, поскольку помогает включить RAII для некоторых неприятных концепций, которые имеют way слишком много (часто конфликтующих) опций.
Вот простой пример. Предположим, вы написали класс-оболочку для окон Win32 API. Чтобы инициализировать окно, вам нужно знать стили окна, расширенные стили окна, начальное расположение окна, начальный размер окна и т. Д. Среди стилей окна множество параметров конфликтуют и не могут быть установлены вместе. Помещение всех этих методов в класс Window
является запретительным и препятствует определению правильных инвариантов класса. Использование временного объекта для группировки всех значений параметров может помочь предотвратить невозможные конфигурации и определить хороший инвариант для класса Window
(например, он всегда содержит действительный дескриптор окна).
class Settings
{
::DWORD myBasicStyles; // takes lots of different flags.
::DWORD myExtentedStyles; // even more flags.
::POINT myInitialLocation;
::SIZE myInitialSize;
// lots more...
public:
void setInitialPosition ( int x, int y );
void setInitialSize ( int top, int left );
void useSpecialBorder ();
// lots more...
void enableTransparency ();
// lots more...
};
class Window
{
::HWND handle;
public:
// map settings unto the horrible list of many parameters expected
// by "CreateWindowEx()", then invoke it to allocate the resource.
Window ( const Settings& settings );
};
// calling code.
int main ()
{
Settings settings;
settings.setInitialPosition(0, 0);
settings.setInitialSize(500, 300);
settings.setInitiallyVisible(true);
Window window(settings);
// ... rest of application ...
}
Тем не менее, я не могу найти страницу, где я читаю это или даже имя, под которым оно было названо. Может кто-нибудь сказать мне, как это называется, и, возможно, ссылку на хороший ресурс по теме?