Конструктор об'єктів "налаштування" idiom

Я пам'ятаю, прочитав цілком ще один раз про ідіому конструктора для C ++ у випадках складних об'єктних конфігурацій. Це особливо корисно, оскільки це допомагає увімкнути RAII для деяких неприємних концепцій, які мають шлях занадто багато (часто суперечливих) варіантів.

Ось простий приклад. Припустимо, що ви повинні написати клас упаковки для вікон API Win32. Щоб ініціалізувати вікно, потрібно знати стилі вікон, розширені стилі вікон, розташування початкового вікна, початковий розмір вікна тощо. Серед стилів вікон багато варіантів конфліктують і не можуть бути встановлені разом. Встановлення всіх цих методів у клас 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 ...
}

Однак я не можу знайти сторінку, на якій я читаю це чи навіть ім'я, за яким його назвали. Чи може хто-небудь сказати мені, що це називається, і, можливо, посилання на хороший ресурс на цю тему?

2
@AlexandreC Це не ім'я, яке я бачив дуже часто. Я просто розмовляв з колегою про цю схему і не міг згадати те, що чув, як це називається. Я хотів би назвати це ім'ям.
додано Автор André Caron, джерело
@EricZ: вікно не викликає ніяких налаштувань, він використовує лише налаштування. Може, мій коментар вводить в оману, я буду редагувати.
додано Автор André Caron, джерело
@ EricZ: Доданий код коду використання з метою пояснення. Сподіваюсь, це відповість на ваше запитання.
додано Автор André Caron, джерело
До речі, як в усьому світі ви можете називати ці сетери на const об'єкт у будь-якому випадку?
додано Автор Eric Z, джерело
Я не знав, що це має назву.
додано Автор Alexandre C., джерело

3 Відповіді

Виглядає як суміш речей.

Об'єкт Settings створюється за допомогою Названий Параметр Ідіум . Хоча зазвичай ви бачите, що він повертає посилання на себе, щоб ви могли їх поєднати.

struct Builder {
  Builder &one(int val) { one_ = val_; return *this; }
  Builder &two(int val) { two_ = val_; return *this; }
  int one;
  int two;
};

void foo() {
  Builder builder().one(1).two(2);
}

Settings is being used as an Encapsulated Context Pattern. The link is kind of wordy. The basic idea is that you just stick your arguments in an object and pass the object.

Щось трохи пов'язане з помилками, я звинувачую у думці, що вона містить будь-що. Щоправда, це можуть бути люди, які перевантажують значення слів. :)

3
додано
Дійсно, він близький до будівельника. Я просто хочу уникнути використання терміна "будівельник", оскільки ми використовуємо звичайні конструктори, а будівельник не "будує" що-небудь.
додано Автор André Caron, джерело
Подивившись на них знову, посилання на C ++ FAQ - це те, що я дійсно шукав. Приємно знайти, спасибі.
додано Автор André Caron, джерело

Я знайшов назву Іменованого параметра імені на інтерв'ю. Це трохи інше, але служить для тієї ж мети.

1
додано
Це саме та посилання, яку я шукав. Спасибі купу. Це трохи відрізняється від того, що я пам'ятав, але це те, що я шукав.
додано Автор André Caron, джерело
Вибачте, я переплутав посилання. Це правильне ім'я, але опис на C ++ FAQ, пов'язаний з Том Керр, це те, що я шукав.
додано Автор André Caron, джерело

Я б назвав це idiom Object Parameter , якщо ви дійсно хочете ім'я. Ім'я насправді не є таким важливим, порівняно з ідеєю, що лежить в основі цього.

Ідея полягає в тому, щоб згрупувати набір пов'язаних даних разом з об'єктом, який містить всі ці дані. Варто перетворити ці параметри в об'єкт, оскільки:

  • Це зменшує розмір списків параметрів, а довгі списки параметрів важко зрозуміти.
  • Визначені параметри на новому об'єкті також дозволяють зробити код більш послідовним, що полегшує його розуміння.
  • Що ще важливіше, це допоможе вам визначити загальні риси поведінки в цьому наборі даних, щоб ви могли перейти до нового класу. Переміщаючи ці дії в новий об'єкт, ви можете ідентифікувати дубльований код та видалити їх. Крім того, у вас є гарна інкапсуляція над даними. Після зміни будь-якої операції з даними, існує лише одне місце для зміни, і клієнти не зазнають впливу.
0
додано
Насправді ім'я є важливим. Мені це не потрібно пояснювати, я можу просто вказати на C ++ FAQ item 10.20 і дозвольте людям прочитати опис. З того часу ми можемо просто використовувати термін "названий параметризм" для позначення цього поняття.
додано Автор André Caron, джерело
Робота над цим :-)
додано Автор André Caron, джерело
Ім'я є важливим лише тоді, коли більшість людей знають це ім'я.)
додано Автор Eric Z, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147