За задачу номер 1 не брался ввиду её простоты.
Задача 2 имеет разные решения, если выполняются требования, которые есть в примерах:
а) числа (которые узлы) всегда идут с 1 до N без пропусков
б) узлы даются в последовательности неубывания, т.е. если в строке есть «6 7 R», это означает, что узел 6 уже был описан как подветвь другого узла.
В общем случае проще построить дерево полностью (решить в лом), сохраняя тройки в хештаблице, а потом пройтись по дереву. Но тогда не понятна в чем изюминка задачи.
Задача 3 решается через медиану медиан.
Поиск медианы решается за O(n). Медиана медиан гарантированно разбивает неповторяемый набор чисел на 33\67 (в лучшем 50 на 50). За каждую итерацию мы отсеиваем как минимум треть, смотрим в какой кусок после деления попало интересующее нас число, пересчитываем его индекс от конца и рекурсивно повторяем операцию.
Получаем O(n+2n/3+4/9n+8/27n+...), что опять же означает O(3n) или просто O(n) после отброса множителя-константы.
Я эту задачу решил сам, но она однозначно заточена на ЗНАНИЕ алгоритмов, а не на соображение.
В защиту автора.
Я написал свой предыдущий комментарий просто ради полноты и разнообразия точек зрения.
Как я понял автора, он говорил не совсем про это. Если перевести на нормальный русский, то он говорил не про нерешаемые задачи, а про амбициозные задачи.
В этом случае эффект выученной беспомощности не срабатывает, так как изначально человек знает о трудности задачи, и делает на это поправку. Кроме того, если параллельно он решает обычные задачи, видит свой успех, то он не теряет веру в себя. Конечно число нерешенных задач в этом случае растет и портит статистику "% боёв, завершившихся нокаутам", что неприятно. Но серьёзных отрицательных последствий это не имеет.
Мне лично нравится браться за задачи, за которые бояться браться другие. Мне нравятся сложные задачи с одной стороны, и это некий челленж с другой.
Другое дело, что тем людям, которым это надо (созданы для этого), сама природа укажет этот путь. Они нащупают его интуитивно. Тем же, кому это не надо, совет статьи не поможет никак. Каждому своё.
Вроде серьезный человек, даже про бизнес что-то там понимает… И заниматься такой фигней?
После одного случая, когда друган прислал ролик Харламова(или как его там) в Норвегии и в результате около политических споров пролетел целый день (а у меня много планов было на день), я зарекся.
Взял стоимость своего часа работы, перевел дебаты на Харбе по указанному курсы, и мне в конец обидно стало. Поэтому сейчас отписываюсь самую малость.
Мне кажется, что у вас тоже есть чем заняться, и получить не только фан, но и меркантильно-ощутимые ценности.
Компенсировать Хабром недостаток общения тоже смысла не вижу.
Если я вижу, что оппонент сильно отдаляется от темы статьи (пытаясь перевести разговор в русло мне не интересное), то я ухожу от спора.
Если начинаются придирки по терминам, я сразу формально соглашаюсь с критиком и опять ухожу от разговора.
Чтобы не тратить эмоции на то, за что мне потом будет обидно (лучше бы полезное что-то сделал), я задаю себе несколько вопросов:
1) Что мне дает этот разговор?
2) Даст ли спор какие-нибудь созидательные результаты для всех?
3) Стоит ли оно того?
Часто на все 3 вопроса я получаю отрицательный ответ. И поэтому ухожу от разговора мягкими методами.
Из того, чему нас учили в универе по психологии.
Закрываю собаку в клетке, подают ток. Собака мечится по клетке, а выбраться не может. Раз, второй, третий… И потом спокойно лежит на полу клетке, и не реагирует на ток. Затем клетку открывают и опять подают напряжение. Собака по прежнему лежит спокойно, не пытаясь выбраться из клетки.
Это явление называется «выученная беспомощность».
Людям дают задачу, но не говорят о том, что она не решаемая. Они бьются над ней, решить не могут. Затем им дают самые простые задачи. Но и их эти люди осилить не могут.
Как-то так. пруф
Сам к сожалению не участвовал- не смог найти время.
1) Я не понят механику прицеливания. Я думал, что в каждый момент у оружия есть текущий разброс. Если юнит держит его строго горизонтально, то угол вылета пули будет в пределах этого значения. Текущий разброс находится в пределах между минимальным и максимальным значениями. При выстреле текущий разброс увеличивается на величину отдачи, и со временем сокращается. У вас же он зависит от того, меняем угол или не меняем.
2) В этом году конкурс был отменным, задача интересной. Система ранжирования участников многоуровневая (пропустив 1 раунд можно было попасть во второй). Организаторы молодцы.
В каких подобных конкурсах вы принимали или собираетесь принимать участие? Ведь ежегодный конкурс Mail.ru не единственный в мире. Есть ли у вас календарь подобных конкурсов?
В технической обвертке (формулировке) наверное так.
Я бы даже вот так это представляю. Есть 2 потока. Первый поток выполняет argmax( Q(a[],s) ), причем делает это весьма добросовестно, вплоть до попарного рассмотрения элементов массива, чем один лучше другого.
Второй поток бегает по памяти и ищет возможные варианты действий a. При этом он грубо оценивает полезность действия (может быть очень грубо). И если действие проходит фильтр динамически добавляя его в пул первого потока. Может быть не сразу, а помещая их в свой пул, и если ничего не найдено за некоторое время лучше этого, то передается запомненное действие.
Для принятия решения дается минимальное время и максимальное. Если второй поток после истечения минимального времени не смог найти нового кандидата за какой-то период, то он останавливается.
Аналогично, если первый поток после истечения времени за некий период не смог улучшить (некая метрика) приоритет, то останавливается и он. В итоге имеем решение.
Я с вами не спорю. Я выражаю свои мысли, которые могут быть неверные (мне на них укажут), а могут оказаться полезными для читателя (в том числе и для вас). Никакого негатива, попытки кому-то что доказать и тому подобного нет. Простой обмен мыслями.
Если писать ИИ взяв за основу идею ВЫГОДЫ — это получится одна система, хотя в ней будут действия. Если взять за основу ДЕЙСТВИЕ, то получится совсем иная система, хотя в ней тоже будет выгода.
Пока лично мне видится первый вариант более перспективным. Я пытаюсь найти обоснования, чем второй вариант может быть лучше первого, ведь не просто же так вы решили «играть от процессов».
Да, ваши мысли мне близки.
Насчет оптимизатора. Я очень старался найти вариант, когда такой взгляд на вещи был бы плохим. Но у меня не получилось. Оптимизатор — это пока лучшее, что я находил.
Насчет цели и средства. Да большинство цепочек вещей средство-средство-средство-цель заставляет нас считать целью только то, что непосредственно влияет на наши рецепторы удовлетворения, а остальное только средством. Человек покупает машину, и с одной стороны для него это явное средство (катать девочек, быстрее добираться до работы), но на самом деле конкретно ему приятно просто знать, что у него есть машина. И для него это именно цель, даже если она будет просто стоять в гараже и ни разу не будет запущена (не выполнит задачи средства).
Указанные цепочки слишком длинные, чтобы с ними мог работать наш мозг, поэтому он оформляет некоторые средства (элемент цепочки) в качестве цели, и работает с этим именно как с целью, пусть даже объективно эта вещь остается именно средством.
Про первичность. Помните, природу света объясняли отдельно волновой теорией и отдельно корпускулярной? Для одного автора была первичная именно волна, а для второго частицы (хотя про волны он естественно знал, но не считал такой взгляд полезным).
Может быть еда без насыщения и не представляет интереса, но что бы насытится — нужно поесть
На тумбочке лежит яблоко, но обязательно ли его есть? Нет, можно ничего не делать, дождаться пока придет медсестра и поставить капельницу с глюкозой.
Моя мысль заключалась именно в том, что яблоко само по себе бесполезно («выгоду», в вашей терминологии определить нельзя).
Можете применить эти слова к игроку, который нашел непонятный материал? Ведь какое действие он будет делать с этим материалом не понятно, может он нужен чтобы выполнить квест, который игрок уже выполнил другим способом. Ведь выгода уже есть (пусть и на основе старых данных из прошлого), а действия ещё нет. Если конечно не считать саму укладку материала в инвентарь действием.
Я смотрю наоборот: не «действие, как венец выгоды» (действие первично, а выгода вторична), а «действие — это всего лишь путь к выгоде» (выгода первична, действие вторично). Без выгоды само действия не представляет интереса. А выполняя некоторое действие мы думаем не про него само, а о выгоде, которое оно нам принесет.
Что есть выгода? Да, наверное именно метрика, раз мы вынуждены сравнивать её с другой выгодой для формирования приоритетов. Итог? Может быть.
1) Выгода может быть не осознаваемая, например сейчас чтобы подумать на текстом и встал из-за компа и прошелся по комнате. Понятно, что я не осознавал выгоду от этого действия (разгрузить входной канал информации), но тем не менее я это сделал.
2) В идеале у нас есть цель (купить машину), и мы выбираем средства, которые ведут к этой цели. Насколько хорошо мы к цели продвигаемся, такую оценку полезности мы и ставим. НО!!! Не всегда мы понимаем почему это хорошо, и к какой цели это ведет. Но тем не менее это ХОРОШО. Игрок видит в сундуке странный материал, он не знает зачем это. Может быть из него можно выковать супер меч, или с его помощью можно изготовить зелье бессмертия, а может просто продать на рынке за большую сумму. Какой именно итог будет, игрок не знает, но все равно выкидывает из рюкзака пару обычных мечей, и 3 баночки с лечилкой. Он это делает просто потому, что в других играх это приносило пользу.
ПС: В случае с игроком может быть все проще, он забирает материал только потому, что в нем срабатывает древний инстинкт (бери раз дают). А выкидывает другие предметы потому что он знает где их взять и их много, а материал всего один, и найдется ли другой не известно.
Я сначала попридираюсь немного.
Любой ответ ребенка (еда\фрукт) можно привязать к действию.
Да, этим ходом вы дали прочувствовать читателю свой взгляд (и это хорошо), но с точки зрения логического вывода это ничего не значить. Вы ложите перед обезьяной банан, яблоко и грушу. Если каждый раз она выбирает банан, то это что-то значит. Но если она выбирает случайный предмет, и вы говорите «она обязательно выбирает фрукт», то это ничего не значит, так как не фрукт она выбрать не может.
Хоть убейте меня, но я вижу в предметах не процесс, а выгоду. Возмем шкалу вреда-пользы [-10,+10]. Собака: можно погладить (+2), можно быть укушенным (-6), можно испугаться (-2). Вывод: если собака не твоя и не знакомая, то лучше держаться подальше.
Идем по лесу и видим на дереве яблоко. Яблоко — еда (+3), но если есть не мытым есть шанс отравиться (-5 * шанс). В принципе сейчас я есть не хочу, поэтому (+2), но могу съесть потом. В рюкзаке у меня места нет. Ищем самое бесполезное в рюкзаке, вместо чего можно положить яблоко. Пусть это будет книга, книга мне нужна (+5), она для меня имеет большую ценность. Значит яблоко для меня в итоге почти не ценно (всего +1), так как я не могу извлечь из него пользу. И оставляю висеть на дереве.
Помимо всего, более мение объективная польза умножается на коэффициент текущего состояния и потребности. Например если человек голоден, то яблоко может получить пользу уже не +3, а +6. А если он переел, то даже самое вкусное пирожное может получить для него отрицательную ценность.
С конца.
switch в эпоху ООП — это антипатерн. Если вам нужно будет внести новую фигуру в код, представте по скольким операторам switch нужно пройтись…
А что мне помешает просто посмотреть в код?
Простая ситуация, коллега спрашивает меня, «сможет ли код обработать такую ситуацию» или «чтобы будет, если внести такое-то изменение».
Вариант А. У меня все построено по единым правилам, и тогда я в уме могу за 3 секунды прокрутить, и дать коллеге ответ. А потом продолжить свои дела не потеряв мысль.
Вариант Б. Мне приходится вспоминать что на это может повлиять, лезть в код (а это может быть другой проект, не тот, который открыт у меня). В итоге коллега ответ получает. Но я полностью сбит с мысли на своей работой, и мне приходится вспоминать, что я хотел сделать.
Главная проблема программирования для человека — это невозможность удержать в голове большую структуру одновременно, как единое целое. Знаменитое число 7+\-2 объектов памяти. Пока сущность невелика, я могу удержать ей в памяти я генерирую код практически мгновенно. Когда же код разрастается и удержать его невозможно, КПД резко падает. Так вот, единые правила позволяют мне удерживать в уме в разу большие структуры, чем те, у которых есть исключения.
Абстракция — это как раз и есть попытка оградить человеческий ум от ненужной для данного вопроса информацией. Но это работает пока у этой абстракции нет исключений.
Ваш вариант — это не третий, это смесь первого со вторым. Те фигуры, которые имеют общий код будут страдать одними недостатками, а те которые описаны уникальными другими.
Каждый раз, когда вы делаете изменения, вам придется восстанавливать в памяти уникальная ли эта фигура или нет, обращаться к диаграмме этих фигур (если вы догадались ей сделать). И эта одно из причин почему я бы хотел делать или все абстракцией, или все уникальным.
Но дело не столько в этом.
Абстракция пускает корни дальше по коду. Фигуры объедены некой абстракцией Х. И в качестве аргумента дальше вы и передаете эту самую Х. И теперь, Бац, и какая-то фигура перестала вмещаться в абстракцию, и для неё нужен отдельный код. Этакая заплатка, покрывающая уникальность этой фигуры. Отличие фигуры небольшое, меняем абстракцию. Затем изменения нужно внести в другую фигуру, но уже её легче действительно писать уникальной. Получается, что введенная кривость (ради первого изменения) абстракции нас не спасла, и она останется в нашем коде. В итоге код больше походит на набор костылей. На рубашку, которую заплатками и перешейками пытаются превратить в итальянский костюм.
А вот если признаться сразу себе, что никаких абстракций здесь не будет, то результирующий код будет опрятным, хотя и избыточным.
ПС: Хотя я именно так и делаю. Делаю общую абстракцию, и дополняю её специальным классом-заплаткой, который должен запускаться когда код нельзя вместить в базовые ограничения и правила. Если у фигуры этот класс =null запускается обычный обработчик, а если нет, то вместо обычного обработчика запускается класс заплатка.
Задача 2 имеет разные решения, если выполняются требования, которые есть в примерах:
а) числа (которые узлы) всегда идут с 1 до N без пропусков
б) узлы даются в последовательности неубывания, т.е. если в строке есть «6 7 R», это означает, что узел 6 уже был описан как подветвь другого узла.
В общем случае проще построить дерево полностью (решить в лом), сохраняя тройки в хештаблице, а потом пройтись по дереву. Но тогда не понятна в чем изюминка задачи.
Задача 3 решается через медиану медиан.
Поиск медианы решается за O(n). Медиана медиан гарантированно разбивает неповторяемый набор чисел на 33\67 (в лучшем 50 на 50). За каждую итерацию мы отсеиваем как минимум треть, смотрим в какой кусок после деления попало интересующее нас число, пересчитываем его индекс от конца и рекурсивно повторяем операцию.
Получаем O(n+2n/3+4/9n+8/27n+...), что опять же означает O(3n) или просто O(n) после отброса множителя-константы.
Я эту задачу решил сам, но она однозначно заточена на ЗНАНИЕ алгоритмов, а не на соображение.
Я написал свой предыдущий комментарий просто ради полноты и разнообразия точек зрения.
Как я понял автора, он говорил не совсем про это. Если перевести на нормальный русский, то он говорил не про нерешаемые задачи, а про амбициозные задачи.
В этом случае эффект выученной беспомощности не срабатывает, так как изначально человек знает о трудности задачи, и делает на это поправку. Кроме того, если параллельно он решает обычные задачи, видит свой успех, то он не теряет веру в себя. Конечно число нерешенных задач в этом случае растет и портит статистику "% боёв, завершившихся нокаутам", что неприятно. Но серьёзных отрицательных последствий это не имеет.
Мне лично нравится браться за задачи, за которые бояться браться другие. Мне нравятся сложные задачи с одной стороны, и это некий челленж с другой.
Другое дело, что тем людям, которым это надо (созданы для этого), сама природа укажет этот путь. Они нащупают его интуитивно. Тем же, кому это не надо, совет статьи не поможет никак. Каждому своё.
После одного случая, когда друган прислал ролик Харламова(или как его там) в Норвегии и в результате около политических споров пролетел целый день (а у меня много планов было на день), я зарекся.
Взял стоимость своего часа работы, перевел дебаты на Харбе по указанному курсы, и мне в конец обидно стало. Поэтому сейчас отписываюсь самую малость.
Мне кажется, что у вас тоже есть чем заняться, и получить не только фан, но и меркантильно-ощутимые ценности.
Компенсировать Хабром недостаток общения тоже смысла не вижу.
Если начинаются придирки по терминам, я сразу формально соглашаюсь с критиком и опять ухожу от разговора.
Чтобы не тратить эмоции на то, за что мне потом будет обидно (лучше бы полезное что-то сделал), я задаю себе несколько вопросов:
1) Что мне дает этот разговор?
2) Даст ли спор какие-нибудь созидательные результаты для всех?
3) Стоит ли оно того?
Часто на все 3 вопроса я получаю отрицательный ответ. И поэтому ухожу от разговора мягкими методами.
Закрываю собаку в клетке, подают ток. Собака мечится по клетке, а выбраться не может. Раз, второй, третий… И потом спокойно лежит на полу клетке, и не реагирует на ток. Затем клетку открывают и опять подают напряжение. Собака по прежнему лежит спокойно, не пытаясь выбраться из клетки.
Это явление называется «выученная беспомощность».
Людям дают задачу, но не говорят о том, что она не решаемая. Они бьются над ней, решить не могут. Затем им дают самые простые задачи. Но и их эти люди осилить не могут.
Как-то так.
пруф
1) Я не понят механику прицеливания. Я думал, что в каждый момент у оружия есть текущий разброс. Если юнит держит его строго горизонтально, то угол вылета пули будет в пределах этого значения. Текущий разброс находится в пределах между минимальным и максимальным значениями. При выстреле текущий разброс увеличивается на величину отдачи, и со временем сокращается. У вас же он зависит от того, меняем угол или не меняем.
2) В этом году конкурс был отменным, задача интересной. Система ранжирования участников многоуровневая (пропустив 1 раунд можно было попасть во второй). Организаторы молодцы.
В каких подобных конкурсах вы принимали или собираетесь принимать участие? Ведь ежегодный конкурс Mail.ru не единственный в мире. Есть ли у вас календарь подобных конкурсов?
Я бы даже вот так это представляю. Есть 2 потока. Первый поток выполняет argmax( Q(a[],s) ), причем делает это весьма добросовестно, вплоть до попарного рассмотрения элементов массива, чем один лучше другого.
Второй поток бегает по памяти и ищет возможные варианты действий a. При этом он грубо оценивает полезность действия (может быть очень грубо). И если действие проходит фильтр динамически добавляя его в пул первого потока. Может быть не сразу, а помещая их в свой пул, и если ничего не найдено за некоторое время лучше этого, то передается запомненное действие.
Для принятия решения дается минимальное время и максимальное. Если второй поток после истечения минимального времени не смог найти нового кандидата за какой-то период, то он останавливается.
Аналогично, если первый поток после истечения времени за некий период не смог улучшить (некая метрика) приоритет, то останавливается и он. В итоге имеем решение.
Если писать ИИ взяв за основу идею ВЫГОДЫ — это получится одна система, хотя в ней будут действия. Если взять за основу ДЕЙСТВИЕ, то получится совсем иная система, хотя в ней тоже будет выгода.
Пока лично мне видится первый вариант более перспективным. Я пытаюсь найти обоснования, чем второй вариант может быть лучше первого, ведь не просто же так вы решили «играть от процессов».
Насчет оптимизатора. Я очень старался найти вариант, когда такой взгляд на вещи был бы плохим. Но у меня не получилось. Оптимизатор — это пока лучшее, что я находил.
Насчет цели и средства. Да большинство цепочек вещей средство-средство-средство-цель заставляет нас считать целью только то, что непосредственно влияет на наши рецепторы удовлетворения, а остальное только средством. Человек покупает машину, и с одной стороны для него это явное средство (катать девочек, быстрее добираться до работы), но на самом деле конкретно ему приятно просто знать, что у него есть машина. И для него это именно цель, даже если она будет просто стоять в гараже и ни разу не будет запущена (не выполнит задачи средства).
Указанные цепочки слишком длинные, чтобы с ними мог работать наш мозг, поэтому он оформляет некоторые средства (элемент цепочки) в качестве цели, и работает с этим именно как с целью, пусть даже объективно эта вещь остается именно средством.
На тумбочке лежит яблоко, но обязательно ли его есть? Нет, можно ничего не делать, дождаться пока придет медсестра и поставить капельницу с глюкозой.
Можете применить эти слова к игроку, который нашел непонятный материал? Ведь какое действие он будет делать с этим материалом не понятно, может он нужен чтобы выполнить квест, который игрок уже выполнил другим способом. Ведь выгода уже есть (пусть и на основе старых данных из прошлого), а действия ещё нет. Если конечно не считать саму укладку материала в инвентарь действием.
Что есть выгода? Да, наверное именно метрика, раз мы вынуждены сравнивать её с другой выгодой для формирования приоритетов. Итог? Может быть.
1) Выгода может быть не осознаваемая, например сейчас чтобы подумать на текстом и встал из-за компа и прошелся по комнате. Понятно, что я не осознавал выгоду от этого действия (разгрузить входной канал информации), но тем не менее я это сделал.
2) В идеале у нас есть цель (купить машину), и мы выбираем средства, которые ведут к этой цели. Насколько хорошо мы к цели продвигаемся, такую оценку полезности мы и ставим. НО!!! Не всегда мы понимаем почему это хорошо, и к какой цели это ведет. Но тем не менее это ХОРОШО. Игрок видит в сундуке странный материал, он не знает зачем это. Может быть из него можно выковать супер меч, или с его помощью можно изготовить зелье бессмертия, а может просто продать на рынке за большую сумму. Какой именно итог будет, игрок не знает, но все равно выкидывает из рюкзака пару обычных мечей, и 3 баночки с лечилкой. Он это делает просто потому, что в других играх это приносило пользу.
ПС: В случае с игроком может быть все проще, он забирает материал только потому, что в нем срабатывает древний инстинкт (бери раз дают). А выкидывает другие предметы потому что он знает где их взять и их много, а материал всего один, и найдется ли другой не известно.
Любой ответ ребенка (еда\фрукт) можно привязать к действию.
Да, этим ходом вы дали прочувствовать читателю свой взгляд (и это хорошо), но с точки зрения логического вывода это ничего не значить. Вы ложите перед обезьяной банан, яблоко и грушу. Если каждый раз она выбирает банан, то это что-то значит. Но если она выбирает случайный предмет, и вы говорите «она обязательно выбирает фрукт», то это ничего не значит, так как не фрукт она выбрать не может.
Хоть убейте меня, но я вижу в предметах не процесс, а выгоду. Возмем шкалу вреда-пользы [-10,+10]. Собака: можно погладить (+2), можно быть укушенным (-6), можно испугаться (-2). Вывод: если собака не твоя и не знакомая, то лучше держаться подальше.
Идем по лесу и видим на дереве яблоко. Яблоко — еда (+3), но если есть не мытым есть шанс отравиться (-5 * шанс). В принципе сейчас я есть не хочу, поэтому (+2), но могу съесть потом. В рюкзаке у меня места нет. Ищем самое бесполезное в рюкзаке, вместо чего можно положить яблоко. Пусть это будет книга, книга мне нужна (+5), она для меня имеет большую ценность. Значит яблоко для меня в итоге почти не ценно (всего +1), так как я не могу извлечь из него пользу. И оставляю висеть на дереве.
Помимо всего, более мение объективная польза умножается на коэффициент текущего состояния и потребности. Например если человек голоден, то яблоко может получить пользу уже не +3, а +6. А если он переел, то даже самое вкусное пирожное может получить для него отрицательную ценность.
Попробую ответить по другому на вопрос «какой из вариантов лучше?»
— Мне одинаково не нравятся оба варианта.
switch в эпоху ООП — это антипатерн. Если вам нужно будет внести новую фигуру в код, представте по скольким операторам switch нужно пройтись…
Простая ситуация, коллега спрашивает меня, «сможет ли код обработать такую ситуацию» или «чтобы будет, если внести такое-то изменение».
Вариант А. У меня все построено по единым правилам, и тогда я в уме могу за 3 секунды прокрутить, и дать коллеге ответ. А потом продолжить свои дела не потеряв мысль.
Вариант Б. Мне приходится вспоминать что на это может повлиять, лезть в код (а это может быть другой проект, не тот, который открыт у меня). В итоге коллега ответ получает. Но я полностью сбит с мысли на своей работой, и мне приходится вспоминать, что я хотел сделать.
Главная проблема программирования для человека — это невозможность удержать в голове большую структуру одновременно, как единое целое. Знаменитое число 7+\-2 объектов памяти. Пока сущность невелика, я могу удержать ей в памяти я генерирую код практически мгновенно. Когда же код разрастается и удержать его невозможно, КПД резко падает. Так вот, единые правила позволяют мне удерживать в уме в разу большие структуры, чем те, у которых есть исключения.
Абстракция — это как раз и есть попытка оградить человеческий ум от ненужной для данного вопроса информацией. Но это работает пока у этой абстракции нет исключений.
Каждый раз, когда вы делаете изменения, вам придется восстанавливать в памяти уникальная ли эта фигура или нет, обращаться к диаграмме этих фигур (если вы догадались ей сделать). И эта одно из причин почему я бы хотел делать или все абстракцией, или все уникальным.
Но дело не столько в этом.
Абстракция пускает корни дальше по коду. Фигуры объедены некой абстракцией Х. И в качестве аргумента дальше вы и передаете эту самую Х. И теперь, Бац, и какая-то фигура перестала вмещаться в абстракцию, и для неё нужен отдельный код. Этакая заплатка, покрывающая уникальность этой фигуры. Отличие фигуры небольшое, меняем абстракцию. Затем изменения нужно внести в другую фигуру, но уже её легче действительно писать уникальной. Получается, что введенная кривость (ради первого изменения) абстракции нас не спасла, и она останется в нашем коде. В итоге код больше походит на набор костылей. На рубашку, которую заплатками и перешейками пытаются превратить в итальянский костюм.
А вот если признаться сразу себе, что никаких абстракций здесь не будет, то результирующий код будет опрятным, хотя и избыточным.
ПС: Хотя я именно так и делаю. Делаю общую абстракцию, и дополняю её специальным классом-заплаткой, который должен запускаться когда код нельзя вместить в базовые ограничения и правила. Если у фигуры этот класс =null запускается обычный обработчик, а если нет, то вместо обычного обработчика запускается класс заплатка.
8+32+64+128+256 = 488.