вторник, 14 июля 2015 г.

Ссылка. Правильно ли понимаю полиморфизм?

https://toster.ru/answer?answer_id=456447#answers_list_answer

Ну что сказать?

Всё вроде так...

А вот если автомойка может помыть "самолёт"? Что будем делать?

Вводить интерфейс "что-то что можно помыть"? Типа и "самолёт можно помыть", и "машину можно помыть".

Или делать "фабрику моек"? Типа "машина дай мне свою мойку" или "самолёт дай мне свою мойку"?

Или делать Service Locator? Типа "дайте мне тех, кто может помыть самолёт или тех кто может помыть машину".

Или Duck-typing?

Или что-то ещё?

А если ещё бывают не только автомойки, но и ещё и "мастерские по смене колёс"?

Тут как?

Интерфейс?

Фабрика?

Service Locator?

Duck-typing?

А если ещё кроме моек бывают "мастерские по смене масла"?

Ну это всё конечно "теоретические вопросы"...

А вот например - ТАНК.

Помыть - МОЖНО, а колёса поменять - НЕЛЬЗЯ.

Можно поменять ГУСЕНИЦЫ.

А масло поменять - можно.

А есть ещё "колёсные танки" - им и колёса можно поменять.

А ГУСЕНИЦЫ - НЕЛЬЗЯ.

ServiceLocator?

Или Visitor?

А вот есть ещё танки, которым МАСЛО менять НЕЛЬЗЯ. Только сразу двигатель. Сняли и выкинули. И поставили НОВЫЙ.

Может вообще анемичная модель? :-)

Или всё же ServiceLocator?

Или - "вот тебе нечто" и дай мне "инструмент, который может обрабатывать это нечто". Причём полиморфно.

Фабрика фабрик?

У меня есть свой ответ - Ни о чём. Про "бесконечно" рекурсивный парсинг кода и структур данных.

Но он не всем понравится.

P.S.

"Основаные цели при использовании полиморфизма:
  • уменьшение дублирования в коде
"

Не совсем так...

А предположим ещё бывают "плавающие танки" и "плавающие машины" и плавающие самолёты".

Что тогда?

АОП?

9 комментариев:

  1. я вот кстати вместо одного метода
    Помыть(Автомобиль автомобиль)
    иногда нарочно делаю два метода
    ПомытьЖелтуюЛадуКалину(ЖелтаяЛадаКалина автомобиль)
    и
    ПомытьЧернуюВолгу(ЧернаяВолга автомобиль)

    Причём мне сложно сформулировать словами, почему в одном случае я выбираю универсальный метод, а в другом - несколько конкретных (которые в свою очередь вызовут один универсальный, но уже приватный метод).

    ОтветитьУдалить
    Ответы
    1. Я кстати тоже иногда подобным "грешу".

      Удалить
    2. "которые в свою очередь вызовут один универсальный, но уже приватный метод"

      Видимо в одном случае нам неважно кто и как вызывает метод, а в другом - мы "стараемся разделить зоны ответственности".

      Формально. На уровне компилятора.

      Удалить
    3. Николай, а на другие вопросы ответов не созрело?

      Или вопросы не интересны?

      Удалить
    4. Да как бы... надо просто уметь пользоваться инструментарием и не городить огород. И если ваши UML и кодогенераторы позволяют в любой момент одно подменить другим - это супер.

      Удалить
    5. "надо просто уметь пользоваться инструментарием и не городить огород."

      Согласен :-)

      Пост примерно об этом и был.

      "И если ваши UML и кодогенераторы позволяют в любой момент одно подменить другим - это супер."

      И с этим согласен. И об этом частично пост был. В какой-то мере - позволяют.

      Ставим "галочку на модели" и получаем "другое решение". Понятное дело, что "из списка возможных".

      Удалить
  2. > Или вопросы не интересны?
    Вопросы интересны, и мне интересно смотреть на Ваш ход мыслей. (Делаю в голове пометки, иногда они в рабочем процессе всплывают.)

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

    ОтветитьУдалить
    Ответы
    1. "мне интересно смотреть на Ваш ход мыслей"

      После:
      http://programmingmindstream.blogspot.ru/2015/07/todo-exports.html
      http://programmingmindstream.blogspot.ru/2015/07/todo_10.html
      http://programmingmindstream.blogspot.ru/2015/07/todo_9.html
      http://programmingmindstream.blogspot.ru/2015/07/blog-post_10.html

      - дело пойдёт :-)

      Удалить