Корректность ООП решений
От: varenikAA  
Дата: 24.06.21 04:24
Оценка:
Код C#.
Имеем модульную архитектуру с базовой реализацией модуля(0 вариант(:
        public virtual void Start()
        {
           Log($"{Name} Started.");
        }


В основном коде приложения
foreach(var module in modules)
{
    module.Start();
}

В реализации модуля
   public override void Start()
        {
        base.Start(); // <= логично вызвать вначале базовый, не так ли?        
        Do(); // <= но тут может что-то пойти не так.
        }



может так(1 вариант(:
foreach(var module in modules)
{
    module.Start();
    Log($"{module.Name} Started.");
}


или так(2 вариант(:

    protected abstract void OnStart();
        public void Start()
        {
       OnStart();    
           Log($"{Name} Started.");
        }
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Корректность ООП решений
От: Буравчик Россия  
Дата: 24.06.21 05:16
Оценка: 2 (1) +1
Здравствуйте, varenikAA, Вы писали:

AA>Код C#.


Вопрос-то в чем? Что ты подразумеваешь под корректностью?

AA>Имеем модульную архитектуру с базовой реализацией модуля(0 вариант(:

AA>может так(1 вариант(:
AA>или так(2 вариант(:

Как минимум есть еще вариант вообще без использования наследования.
interface IModule:
  def start()

class Module implements IModule:
  start()

fun main(modules: List[IModule]):
  for m in modules:
    m.start()
    log('start')


См. template method vs strategy, inheritance vs aggregation

Как развитие этого подхода — можно написать адаптер, превращающий обычный модуль в логированный модуль.
class LoggedModule implements IModule:
  def constructor(module: IModule):
    ...

  def start():
    module.start()
    log('start')
}
Best regards, Буравчик
Re[2]: Корректность ООП решений
От: varenikAA  
Дата: 24.06.21 05:23
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

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


AA>>Код C#.


Б>Вопрос-то в чем? Что ты подразумеваешь под корректностью?

в оригинале, я могу вызвать базовый метод до, после или не вызывать вообще.
проблема в неопределенности поведения наследников.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Корректность ООП решений
От: Буравчик Россия  
Дата: 24.06.21 08:29
Оценка: 4 (1)
Здравствуйте, varenikAA, Вы писали:

Б>>Вопрос-то в чем? Что ты подразумеваешь под корректностью?

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

В варианте 2 эта проблема у тебя решена.

И он же — переходный вариант к устранению наследования вообще.
Осталось только выделить OnStart в отдельный интерфейс
Best regards, Буравчик
Re: Корректность ООП решений
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.21 09:30
Оценка: 4 (1) +2
Здравствуйте, varenikAA, Вы писали:
ак(2 вариант(:

AA>
AA>    protected abstract void OnStart();
AA>        public void Start()
AA>        {
AA>       OnStart();    
AA>           Log($"{Name} Started.");
AA>        }

AA>

Поздравляю, вы изобрели паттерн template method.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.