Здравствуйте, 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>>