Sep. 2nd, 2011

madf: (Default)
У C++ ідіома RAII, мабуть, одна із найкорисніших і найбільш широко вживаних штук. Починаючи від ScopedPtr і ScopedLock, і закінчуючи BusyCursor (встановлення курсора "зайнятості" для довготривалих процесів) і Logger (Logger(Level::debug).stream() << "Debug output";) . Але іноді її властивостей виконувати роботу на початку і в кінці scope не вистачає.
Візьмемо, наприклад, створення pid-файлу. RAII чудово підходить: після "демонизації" створюємо файл, при зупинці знищуємо. А що робити, коли програма запускається без "демонизації"?
if (options.isDaemon()) {
    MakeDaemon(...);
    PIDFile pid(...);
}

- не працює, бо scope замалий. Потрібний такий RAII, що може не існувати. Maybe-RAII. Можна, звісно, зробити так:
PIDFile pid(...);
if (options.isDaemon()) {
    MakeDaemon(...);
}
pid.init();

але тоді ми отримуємо всі "мінуси" додаткового конструктора. А саме, проміжний стан об’єкту: створений, але ще невалідний. Ні риба ні м’ясо.
Еквівалентом Maybe у C і C++ виступає вказівник. Він може вказувати на значення (Just T) або бути NULL (Nothing). Але простий вказівник не реалізує RAII. Тоді на допомогу приходить ScopedPtr:
ScopedPtr pid;
if (options.isDaemon()) {
    pid = new PIDFile(...);
    MakeDaemon(...);
}

Найцікавішим тут є той факт що RAII використовується двічі: для ScopedPtr і для PIDFile. У якості ScopedPtr можна використати, наприклад, boost::scoped_ptr.

Amorphis

Sep. 2nd, 2011 09:01 pm
madf: (Default)
Якось я раніше його не дуже слухав. А на цьому тижні перебирав свою музику і вчора наштовхнувся на нього. Слухав весь день, кілька разів і сьогодні ще. "Am Universum" 2001-го року, мабуть, наймелодійніший альбом із тих що у мене є (1994 - "Tales From The Thousand Lakes", 1996 - "Elegy", 1997 - "My Kantele", 2000 - "Story - 10Th Anniversary", 2001 - "Am Universum", 2006 - "Eclipse").

Profile

madf: (Default)
madf

April 2018

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 8th, 2025 03:22 am
Powered by Dreamwidth Studios