Какие преимущества от NVI шаблона?
От: Аноним  
Дата: 06.04.07 11:58
Оценка:
Вот классическая реализация

public class Base
{
  public void DoWork()
  {
    CoreDoWork();
  }
  protected virtual void CoreDoWork() 
  {
    Console.WriteLine( "Base.DoWork()" );
  }
}
public class Derived : Base
{
  protected override void CoreDoWork() 
  {
    Console.WriteLine( "Derived.DoWork()" );
  }
}
//Применение шаблона NVI
public class EntryPoint
{
  static void Main() 
  {
    Base b = new Derived();
    b.DoWork();
  }
}



Чем такая реализация лучше этой?
public class Base
{
  public virtual void DoWork() 
  {
     Console.WriteLine( "Base.DoWork()" );
  }
}
public class Derived : Base
{
  public override void DoWork() 
  {
    Console.WriteLine( "Derived.DoWork()" );
  }
}
public class EntryPoint
{
  static void Main() 
  {
    Base b = new Derived();
    b.DoWork();
  }
}
Re: Какие преимущества от NVI шаблона?
От: bnk СССР http://unmanagedvisio.com/
Дата: 06.04.07 12:25
Оценка:
Здравствуйте, Аноним, Вы писали:

В вашем случае — ничем.
А например если вот так, тогда становится понятно:

А>
А>public class Base
А>{
А>  public void DoWork()
А>  {
А>    DoSomethingBeforDoingCoreWork();

А>    if (SomeTrickyCondition())
А>       CoreDoWork();

А>    DoSomethingAfterDoingCoreWork();
А>  }
А>  protected virtual void CoreDoWork() 
А>  {
А>    Console.WriteLine( "Base.DoWork()" );
А>  }
А>}
А>public class Derived : Base
А>{
А>  protected override void CoreDoWork() 
А>  {
А>    Console.WriteLine( "Derived.DoWork()" );
А>  }
А>}
А>//Применение шаблона NVI
А>public class EntryPoint
А>{
А>  static void Main() 
А>  {
А>    Base b = new Derived();
А>    b.DoWork();
А>  }
А>}
А>
Re[2]: Какие преимущества от NVI шаблона?
От: Аноним  
Дата: 06.04.07 12:56
Оценка:
bnk>В вашем случае — ничем.
bnk>А например если вот так, тогда становится понятно:

Так это уже тогда Template Method
Re[3]: Какие преимущества от NVI шаблона?
От: bnk СССР http://unmanagedvisio.com/
Дата: 06.04.07 13:36
Оценка:
Здравствуйте, Аноним, Вы писали:

bnk>>В вашем случае — ничем.

bnk>>А например если вот так, тогда становится понятно:

А>Так это уже тогда Template Method


Тогда извиняюсь... Не очень силен в терминологии...
Я тоже наверное тогда не знаю зачам такое может понадобиться...
Какой смысл делать метод, которрый только и делает что вызывает другой метод?
По-моему это совершенно бессмысленно
Re: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 06.04.07 13:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Чем такая реализация лучше этой?


Вообще-то во второй реализации имеется возможность вызвать DoWork базового класса, даже если мы работаем с ссылкой на Derived.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Какие преимущества от NVI шаблона?
От: Dufrenite Дания  
Дата: 07.04.07 14:42
Оценка:
Здравствуйте, Аноним.

Для понимания преимуществ этого паттерна надо перейти на более высокий уровень абстракции. В данном случае мы имеем преимущество сокрытия информации о внутреннем устройстве иерархии Base, Derived.
Я думаю это решение можно применять в областях кода, чреватых частыми изменениями. Для примера, возьмём ситуацию, когда было принято решение отказаться от виртуальности метода DoWork(), или о сворачивании иерархии в один класс. Мне кажется, что первое решение очень сильно облегчит рефакторинг кода.
Re[2]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 07.04.07 18:55
Оценка:
Мне тоже в свое время хотелось узнать об преимуществах NVI , особенно в свете того что некоторые авторы советуют его применять ВСЕГДА когда есть виртуальная функция.

К сожалению , внятной аргументации я тогда не получил.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 15:04
Оценка: +1 :)
Здравствуйте, minorlogic, Вы писали:

M>Мне тоже в свое время хотелось узнать об преимуществах NVI , особенно в свете того что некоторые авторы советуют его применять ВСЕГДА когда есть виртуальная функция.


M>К сожалению , внятной аргументации я тогда не получил.


using System;

namespace Lib
{
    public class Base
    {
        public virtual void Hello()
        {
            Console.WriteLine("Base::Hello()");
        }
    }

    public class Derived : Base
    {
        public override void Hello()
        {
            Console.WriteLine("Derived::Hello()");
        }
    }
}


// Program.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace Lib;

int main(array<System::String ^> ^args)
{
    Derived^ derived = gcnew Derived();
    derived->Base::Hello();
    return 0;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 08.04.07 16:44
Оценка:
Наверное я очень туп но я опять не понял , что вы мне пытались продемонстрировать ? Или ошиблись веткой ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 16:57
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Наверное я очень туп но я опять не понял , что вы мне пытались продемонстрировать ? Или ошиблись веткой ?


Я пытался продемонстрировать, что пудличные виртуальные функции есть зло, т.к. перекрытую функцию можно "обойти".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 08.04.07 17:18
Оценка:
Меня опять это не убедило.

Это очень хорошо , точ ее можно обойти. Это в дизайне языка и идеалогии программирования на С++.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[6]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 08.04.07 17:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


M>>Наверное я очень туп но я опять не понял , что вы мне пытались продемонстрировать ? Или ошиблись веткой ?


L>Я пытался продемонстрировать, что пудличные виртуальные функции есть зло, т.к. перекрытую функцию можно "обойти".


С подобной агрументацией я вообще могу сказать что программировать плохо , потому что ошибиться можно. А уж как плохо программировать на C++ если там разрешены статический касты произвольных типов!!!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 17:44
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Меня опять это не убедило.


M>Это очень хорошо , точ ее можно обойти.


Как правило, человек, перекрывающий какой-либо метод расчитывает на то, что тот, кто использует экземплр его класса работает через перекрытый метод, а не через базовый метод.

M>Это в дизайне языка и идеалогии программирования на С++.


В этом-то и причина появления NVI
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 17:48
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>С подобной агрументацией я вообще могу сказать что программировать плохо , потому что ошибиться можно. А уж как плохо программировать на C++ если там разрешены статический касты произвольных типов!!!


Если есть способ избежать ошибки, то по-моему глупо им не воспользоваться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 08.04.07 17:53
Оценка:
Но вы же явно указали что надо вызвать ?
Base::Hello();
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 17:59
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Но вы же явно указали что надо вызвать ?

M>Base::Hello();

по твоей логике выходит, что запрещать обращение к приватным членам тоже не нужно — ты же сам явно обратился к приватному члену.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Какие преимущества от NVI шаблона?
От: minorlogic Украина  
Дата: 08.04.07 18:04
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


M>>Но вы же явно указали что надо вызвать ?

M>>Base::Hello();

L>по твоей логике выходит, что запрещать обращение к приватным членам тоже не нужно — ты же сам явно обратился к приватному члену.


C++ запрещает обращаться к приватным членам. Ты пример написла вообща для какого языка ? я так понял для C# ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[11]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 08.04.07 18:11
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>>>Но вы же явно указали что надо вызвать ?

M>>>Base::Hello();

L>>по твоей логике выходит, что запрещать обращение к приватным членам тоже не нужно — ты же сам явно обратился к приватному члену.


M>C++ запрещает обращаться к приватным членам.


Вах, а зачем? Ты же явно указываешь, что надо вызвать

M>Ты пример написла вообща для какого языка ? я так понял для C# ?


Там смесь из C#-а и плюсов. В C# необходимость использования protected virtual методов еще менее очевидна, т.к. сам C# не позволяет вызвать метод базового класса в обход метода наследника. В то же время .Net этого не запрещает, что я и продемонстрировал на примере C++.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Какие преимущества от NVI шаблона?
От: afurmanov Россия  
Дата: 09.04.07 00:14
Оценка:
public class Base
{
  public void Work()
  {
    DoWork();
  }
  protected virtual void DoWork() 
  {
    Console.WriteLine( "Base.Work()" );
  }
}
public class Derived : Base
{
  public void Job()
    {
    }
  protected override void DoWork() 
  {
    Console.WriteLine( "Derived.Work()" );
  }
}


Читатель класса Derived понимает, что DoWork() — специализирует Work(), в то время как Job() — расширяет набор операций базового класса. Иными словами DoWork() определяет специфику поведения операции Work() сохраняя инварианты присущие базовому классу, тогда как Job() — операция не присущая базовому классу, эта операция расширяет набор допустимых действий. Сравниваем с

public class Derived : Base
{
  public virtual void Job() 
  {
     Console.WriteLine( "Derived.Job()" );
  }
}


Читателю класса не понять: Job() — расширяет или специализирует поведение? Т.е. надо посмотреть а что оно там в Base.



А>//Применение шаблона NVI

А>public class EntryPoint
А>{
А> static void Main()
А> {
А> Base b = new Derived();
А> b.DoWork();
А> }
А>}
А>[/c#]


А>Чем такая реализация лучше этой?

А>
А>public class Base
А>{
А>  public virtual void DoWork() 
А>  {
А>     Console.WriteLine( "Base.DoWork()" );
А>  }
А>}
А>public class Derived : Base
А>{
А>  public override void DoWork() 
А>  {
А>    Console.WriteLine( "Derived.DoWork()" );
А>  }
А>}
А>public class EntryPoint
А>{
А>  static void Main() 
А>  {
А>    Base b = new Derived();
А>    b.DoWork();
А>  }
А>} 
А>
Re[2]: Какие преимущества от NVI шаблона?
От: Lloyd Россия  
Дата: 09.04.07 09:17
Оценка:
Здравствуйте, afurmanov, Вы писали:

A>Читатель класса Derived понимает, что DoWork() — специализирует Work(), в то время как Job() — расширяет набор операций базового класса. Иными словами DoWork() определяет специфику поведения операции Work() сохраняя инварианты присущие базовому классу, тогда как Job() — операция не присущая базовому классу, эта операция расширяет набор допустимых действий. Сравниваем с


A>
A>public class Derived : Base
A>{
A>  public virtual void Job() 
A>  {
A>     Console.WriteLine( "Derived.Job()" );
A>  }
A>}
A>


A>Читателю класса не понять: Job() — расширяет или специализирует поведение? Т.е. надо посмотреть а что оно там в Base.


Пример некорректен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.