Re: Покритикуйте код
От: Evgeny.Panasyuk Россия  
Дата: 05.02.15 09:55
Оценка: 5 (2)
Здравствуйте, CEMb, Вы писали:

CEM>Принцип создания функции инициализации:


Если нормальный RAII, без двухфазной инициализации (или что там у тебя), с нормальными RAII полями, ну ни как не получается (почему?), то можно:
BOOL CApp::InitCommon()
{
    return initialize(m_zero, m_one, m_two);
}
Где initialize это variadic шаблон функции, который прячет внутри всю эту логику.

Либо извратится через RAII обвёртки + ScopeGuard:
BOOL CApp::InitCommon()
{
    try
    {
        auto a = init(m_zero);
        auto b = init(m_one);
        auto c = init(m_two);
        // ...
        commit(a, b, c);
    }
    catch(init_failure)
    {
        return false;
    }
    return true;
}
init возвращает ScopeGuard, который при отсутствии commit'а сделает uninit в деструкторе. А с использованием stack_unwinding commit можно вообще убрать.

Либо просто goto:
BOOL CApp::InitCommon()
{
    if(!m_zero.InitCommon())
        goto ERROR_zero;
    if(!m_one.InitCommon())
        goto ERROR_one;
    if(!m_two.InitCommon())
        goto ERROR_two;
    
    //...
    return true;

    ERROR_two:
        m_two.UninitCommon();
    ERROR_one:
        m_one.UninitCommon();
    ERROR_zero:
        m_zero.UninitCommon();

    return false;
}
Уж точно проще и лаконичней твоего варианта
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.