Реализация полиморфизма
От: RikkiTikkiTavi Россия  
Дата: 06.05.16 12:09
Оценка:
Добрый день!

Хотелось бы освежить себе теорию по части реализации полиморфного поведения классов. А именно, какие паттерны призваны решать нижеописанную (в общем-то, стандартную) задачу:

Какие крайние варианты реализации полиморфизма возможны:
  1. Классы, описывающие сущности, непосредственно сами реализуют интерфейсы для каждой из подсистем. Достоинство: все в одном месте, нет дополнительных классов. Недостаток: жуткая мешанина (мы называем это "колхоз"), жуткая связность.
  2. Реализацию интерфейса для каждой подсистемы можно вынести в отдельный класс. Поскольку наличествует иерархия, и довольно существенная, неизбежно возникает соответствующая иерархия классов реализации. И так для каждой подсистемы. Достоинство: уменьшенная связность, реализация для каждой подсистемы в отдельном файле, уменьшив инклуды сторонних тулкитов.
  3. Реализация интерфейса в отдельном файле через свитчи по типу сущности. Достоинства: несколько проще предыдущего варианта и подходит для относительно просто кода реализации расширения, код для данной подсистемы в одном месте для разных классов.

Собсно, у нас по факту используются и этих способа, и разные степени микса. По сути, определяющим фактором у меня явился размер кода реализации под каждую подсистему и его связка со сторонними библиотеками.

А что говорит теория? Какие паттерны перечитать?
Отредактировано 06.05.2016 12:13 RikkiTikkiTavi . Предыдущая версия .
Re: Реализация полиморфизма
От: · Великобритания  
Дата: 06.05.16 12:13
Оценка: +1
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>А что говорит теория? Какие паттерны перечитать?

Так Visitor же.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Реализация полиморфизма
От: Current  
Дата: 06.05.16 12:42
Оценка:
RTT>
  • Реализацию интерфейса для каждой подсистемы можно вынести в отдельный класс. Поскольку наличествует иерархия, и довольно существенная, неизбежно возникает соответствующая иерархия классов реализации. И так для каждой подсистемы. Достоинство: уменьшенная связность, реализация для каждой подсистемы в отдельном файле, уменьшив инклуды сторонних тулкитов.

    а чем 2 вариант плох?
  • Отредактировано 09.05.2016 21:47 Current . Предыдущая версия .
    Re[2]: Реализация полиморфизма
    От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
    Дата: 06.05.16 13:26
    Оценка:
    Здравствуйте, ·, Вы писали:

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


    RTT>>А что говорит теория? Какие паттерны перечитать?

    ·>Так Visitor же.
    Невероятно, но похоже факт, и эт овторой раз в жизни когда я вижу применение визитора .
    Sic luceat lux!
    Re: Реализация полиморфизма
    От: Sinix  
    Дата: 06.05.16 13:44
    Оценка: 76 (2)
    Здравствуйте, RikkiTikkiTavi, Вы писали:

    RTT>А что говорит теория? Какие паттерны перечитать?

    visitor уже посоветовали?
    Тогда rulebook pattern за компанию.
    У Липперта недавно была серия постов на тему.
    Re[3]: Реализация полиморфизма
    От: · Великобритания  
    Дата: 06.05.16 13:45
    Оценка:
    Здравствуйте, Kernan, Вы писали:

    RTT>>>А что говорит теория? Какие паттерны перечитать?

    K>·>Так Visitor же.
    K>Невероятно, но похоже факт, и эт овторой раз в жизни когда я вижу применение визитора .
    Каждый раз когда видишь "через свитчи по типу сущности" — это оно и есть — double dispatch.
    но это не зря, хотя, может быть, невзначай
    гÅрмония мира не знает границ — сейчас мы будем пить чай
    Re: Реализация полиморфизма
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 10.05.16 09:14
    Оценка: +1
    Здравствуйте, RikkiTikkiTavi, Вы писали:

    RTT>А что говорит теория? Какие паттерны перечитать?

    Теория говорит "решайте реальную задачу". Ваш пример с автомобилями — классика того, как делать не надо.
    Т.е. придумать задачу про автомобили, в которой для грузовиков и для легковых потребуются разные классы, практически невозможно.
    Очень многие проблемы архитектуры возникают не сами по себе, а из-за того, что в самом начале было принято идиотское решение.

    По соседству дали ссылочку на Липперта, где он говорит ровно про то же: "интуитивно очевидный" подход к программированию role-playing game, в котором Wizard и Warrior являются листьями иерархии классов, падает навзничь уже через две итерации проектирования.
    А подход, в котором все персонажи — это один класс, а всё оборудование — другой, прекрасно работает.
    И заодно не требует visitor и прочей наркомании для того, чтобы описать, что происходит, когда Wizard берёт в руки Sword of steel.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re: Реализация полиморфизма
    От: diez_p  
    Дата: 10.05.16 12:19
    Оценка:
    Здравствуйте, RikkiTikkiTavi, Вы писали:
    RTT>А что говорит теория? Какие паттерны перечитать?

    Почитайте Бертрана Мейера, объектно-ориентированный анализ и проектирование.
    Не применяйте паттерны до тех пор пока без них действительно нельзя обойтись.
    Иерархия из 20 классов это лютый аллес.
    На первый взгляд, в вашем коде не хватает гранулярности и когда надо было применить SRP, это не было сделано. Тоноч также что наследование надо применять очень аккуратно.
    Re[4]: Реализация полиморфизма
    От: __SPIRIT__ Россия  
    Дата: 07.06.16 18:22
    Оценка:
    Здравствуйте, ·, Вы писали:

    RTT>>>>А что говорит теория? Какие паттерны перечитать?

    K>>·>Так Visitor же.
    K>>Невероятно, но похоже факт, и эт овторой раз в жизни когда я вижу применение визитора .
    ·>Каждый раз когда видишь "через свитчи по типу сущности" — это оно и есть — double dispatch.

    и это косяк архитектуры. Так как под один интерфейс запихнули плохо связанные сущности. Этот косяк можно поправить, а можно использовать визитор. Косяк само собой никуда не денется(останется и усугубится) но код станет чуть более ООПэшный...
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.