Покритикуйте код
От: CEMb  
Дата: 05.02.15 09:18
Оценка: +1
Почитал соседнюю ветку, и вспомнилось...

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

BOOL CApp::InitCommon()
{
    try
    {
        if(!m_zero.InitCommon())
            throw 0;
        if(!m_one.InitCommon())
            throw 1;
        if(!m_two.InitCommon())
            throw 2;
        //...
    }
    catch(int iExc)
    {
        switch(iExc)
        {
        //...
        case 3:
            m_two.UninitCommon();
        case 2:
            m_one.UninitCommon();
        case 1:
            m_zero.UninitCommon();
        }
        return FALSE;
    }
    return TRUE;
}

у меня конкретно в коде были вызовы статических методов классов для инициализации общих данных, (через C:: ).

чтоб понятнее, в чём суть, лучше так:

BOOL CApp::Init()
{
    try
    {
        m_hSome0 = InitSome0()
        if (!m_hSome0)
            throw 0;
        m_hSome1 = InitSome1()
        if (!m_hSome1)
            throw 1;
        m_hSome2 = InitSome2()
        if (!m_hSome2)
            throw 2;
        //...
    }
    catch(int iExc)
    {
        switch(iExc)
        {
        //...
        case 3:
            Release(hSome2);
        case 2:
            Release(hSome1);
        case 1:
            Release(hSome0);
        }
        return FALSE;
    }
    return TRUE;
}


Часто в примерах встречал код, который инициализировал некоторые члены класса один за другим, в случае ошибки делал деинициализацию уже готовых. В результате к хвосту функции число вызова деинициализаторов было велико. Ну и повторы кода на каждом условии.
Как вариант, люди использовали некую булеву переменную для понимания, что инициализации идут хорошо, каждая новая инициализация обкладывалась условием на эту переменную. В конце эта переменная проверялась, если false, то проверялись опять же все хендлы на валидность, и делалась деинициализация.
Мне кажется, мой код проще и нагляднее, быстро расширяется, можно не бояться забыть, что что-то пропустил.
Жду: критику, доработку, идеи
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.