Re[2]: Преимущества NVI в C++ (non virtual interface)
От: minorlogic Украина  
Дата: 29.04.06 18:18
Оценка: 6 (1)
Здравствуйте, IROV.., Вы писали:

IRO>Здравствуйте, minorlogic, Вы писали:


M>>1. Неубедительная мотивация для использование NVI.


IRO>Для меня убедительная..


IRO>сравним.


IRO>это:

IRO>
IRO>class A
IRO>{
IRO>    virtual void Foo()
IRO>    {
IRO>        if(enable ==  false)
IRO>        { 
IRO>            Log << "Blah-Blah" << endl;
IRO>        }

IRO>        //TODO:

IRO>    }
IRO>};

IRO>class B
IRO>    : public A
IRO>{
IRO>    void Foo()
IRO>    {
IRO>        if(enable ==  false)
IRO>        { 
IRO>            Log << "Blah-Blah" << endl;
IRO>        }

IRO>        //TODO:
IRO>    }
IRO>};
IRO>

IRO>с вот этим:
IRO>
IRO>class A
IRO>{
IRO>    void Foo()
IRO>    {
IRO>        if( enable ==  false)
IRO>        { 
IRO>            Log << "Blah-Blah" << endl;
IRO>        }

IRO>        _Foo();
IRO>    }

IRO>    virtual void _Foo()
IRO>    {
IRO>        //TODO:
IRO>    }
IRO>};

IRO>class B
IRO>    : public A
IRO>{
IRO>    void _Foo()
IRO>    {
IRO>        //TODO:
IRO>    }
IRO>};
IRO>



IRO>+ Возможность создания префикса и постфикса к функции

IRO>+ Легко менять(сопровождать) префикс/постфикса при этом не боясь забыть гдето поменять.
IRO>+ Меньше кода! а значит меньше проблем на сопровождение.
IRO>+ Помогает избежать ошибок (забытые юзером проверки), если нужна обязательная валидация.

IRO>— Ущемляет права юзера на ликведацию пре/пост-фикса (может это и к лучему)


IRO>P.S. знаю _Foo писать не безопастно (чертов STL ).. просто для наглядности



а так ???

class A
{
public:
    virtual void Foo() //интерфейс
    {
        if( enable ==  false)
        { 
            Log << "Blah-Blah" << endl;
        }

        _Foo();
    }
protected:
    virtual void _Foo() //реализация
    {
        //TODO:
    }
};

class B
    : public A
{
protected:
    void _Foo()
    {
        //TODO:
    }
};


Это же очевидно , что если есть повторяющиеся действия , то необходимо выделить в отдельную функцию .

Но в последнем варианте , мы даем разработчику отнаследованному от нас и возможность исменить поведение как _Foo() так и Foo(), то есть больше свободы , то есть больше универсальности.

И опять же вопрос , ведь Сатер рекомендует это использовать не для часных случаев где это может понадобиться , а как общее правило.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.