Почти так и есть. a и b — произвольные предикаты (функции от одного аргумента, возвращающие boolean),
Нет не так. a и b вообще не обязаны быть предикатами, единственное условие — чтобы они возвращали объеты булевого типа. Даже (or true false) вполне годное выражение.
(and? a b) тоже возвращает предикат.
Нет, он, как правило, тоже возвращает булево значение. Не уверен, что ты правильно понимаешь слово предикат. Предикатом тут является как раз сам and. В общем случае, предикат — это функция, которая производит проверку на истинность.
Суть в том, что если некое значение удовлетворяет двум предикатам, то один из предикатов должен быть супертипом для другого, иначе для этого значения метод не определён.
Потому что полиморфизм это частный случай мультиметодов для одного объекта.
Я не совсем понял, что ты имеешь в виду. Мультиметоды — это всего лишь сахар, полиморфизм как был так и остался. Мультиметоды тривиально выражаются в нормальных языках без мультиметодов. Сами же мультиметоды семантически, вряд ли можно назвать Ъ, поскольку нарушается семантика. В ООП объект сам должен решать, как ему обрабатывать то или иное сообщение, а с мултиметодами это вуалируется.
обобщение множества параметров в подмножества (состояние);
обобщение состояний по какому-либо признаку;
обобщение функций по какому-либо признаку;
сопоставление подмножества состояний с подмножеством функций;
хотя бы одна функция должна использовать хотя бы один параметр состояния для которого она вызывается.
Если ты можешь сказать: «вот этот набор функций предназначен для работы вот с этими состояниями» - то это ООП. Если ты не можешь вычленить подмножество состояний, или не можешь вычленить подмножество функций, или не можешь сопоставить подмножество функций и подмножество состояний, то это не ООП.
Речь шла о том, от кого они наследуют, а не об их равности.
Если у меня уже есть сформированный набор чисел (через new Number или литералы) и я создают подтип Even или Primes, то те числа, которые удовлетворяют предикату подтипа автоматически становятся относящимися к новому подтипу. Если же то же самое с классами, то мне надо для каждого числа вручную проставить список родителей.
Мультиметоды тривиально выражаются в нормальных языках без мультиметодов.
Давай для нормального языка:
(defmethod foo ((a a) b c)
"First arg is a")
(defmethod foo (a (b b c)
"Second arg is b")
(defmethod foo (a b (c c))
"Third arg is c")
;;;; работает так
(foo (new a) 1 2) ; => "First arg is a"
(foo 1 (new b) 2) ; => "Second arg is b"
(foo 1 2 (new c)) ; => "Third arg is c"
(foo (new a) (new b) (new c)) ; => "First arg is a"
;;;; и так тоже
(defclass d (c) ())
(foo 1 2 (new d)) ; => "Third arg is c"
Нечёткость термина не даёт возможности назвать им «всё». Это примерно как термин «человек». Определим как «двуногое без перьев»? А одноногий инвалид — человек? Определим как «мыслящее», а искуственный интеллект? И т.д.
Так и с ООП. Стиль ООП подразумевает, что задача выражается в терминах объектов и их взаимодействия. Это не единственный стиль: из других можно выделить таблицу состояний (задача выражается в состояниях всей системы и переходах между ними) и функциональный (задача выражается в виде функций получающих и возвращающих некие значения).
ООП языки — языки, имеющие синтаксическую поддержку ООП.
Ещё можно вспомнить термин «процедурное программирование». Сейчас другого почти не бывает, а когда-то поддержка на уровне языка GOSUB/RETURN или ENTER/LEAVE была не везде. И также в любом ассемблере можно было писать процедурно, вручную запоминая и восстанавливая стек.
ООП языки — языки, имеющие синтаксическую поддержку ООП.
это всего-лишь ещё одно абсолютно бесполезное для этого мира определение, как и тясячи других определений ооп (они могут быть верными, но они бесполезны)
Если повезёт, то заставляет в муках понять, что является не более чем распиаренной техникой проектирования, цель которой состоит в описании решения задачи в терминах классов и методов. :-)
Яйцеголовые теоретики-«промоутеры» тебе будут лить в уши про «повторное использование», про «красоту» наследования, будут кормить «красивыми» UML-диаграммами, будут повторять про легкость в сопровождении, будут рассказывать про необходимость изучения паттернов проектирования, и будут тебе подсовывать библиотеки в которых «всего то лишь» нужно реализовать ту или иную MVC-модель, и что остальную работу сделает фрэймворк. :-) Ну и т.д.
На практике, сия «великая» техника, если она является единственной в арсенале горемыки-программиста, выкрутит ему руки и обеспечит бедолаге настоящий геморрой, особенно, если будет возвеличена в ранг догмы :-)
Идей основанных на работе с объектами, да.
Вполне себе конкретный термин, во всяком случае он отрицает отсутствие каких-либо идей.
Если тебе удалось воспользоваться хотя бы одной из идей ООП, то ты его используешь.
Не пойму по какому поводу боль.
До появления этого термина было процедурное программирование, функциональное программирование, логическое программирование, машина состояний. Отдельно концепция модулей. Структуры данных.
Только в ООП появилась идея, что любой алгоритм можно представить не в виде последовательности преобразований, а в виде последовательности передачи сообщений между объектами и алгоритм обработки сообщения должен зависеть от объекта.
foo := method(
call message arguments foreach (i, x,
if(x asString findSeq(" clone"),
if(i == 0, "First arg is a" println; return)
if(i == 1, "Second arg is b" println; return)
if(i == 2, "Third arg is c" println; return)
)
)
)
foo(a clone, 1, 2) // First arg is a
foo(1, b clone, 2) // Second arg is b
foo(1, 2, c clone) // Third arg is c
foo(a clone, b clone, c clone) // First arg is a
d := Object clone
foo(1, 2, d clone) // Third arg is c
И вообще, код элементарный, нахрен тут вообще мультиметоды, хз. Тут и ООП то никакого нет.
будет «First arg is a», а должно быть «First arg is b», так как c не наследник a.
И в твоём примере «d := Object clone» должен давать для foo(1, 2, d clone) — нет метода. А «Third arg is c» только если «d := c clone»
У меня появилось впечатление, что ты не очень понимаешь, что такое мультиметод.
Мультиметод — это метод, который диспатчится по классам всех аргументов, а не только первого.
То есть, для одного класса я могу написать foo := method(x, y, x foo y) И для одного класса могу по мере необходимости переопределять метод foo и вызов f(a, b) будет зависеть от метода foo в объекте a.
Для мультиметода необходима возможность указать метод для комбинации классов. То есть должно быть что-то вроде
(a, Object, Object) foo := method ("First arg is a" println)
(Object, b, Object) foo := method ("First arg is b" println)
(Object, Object, c) foo := method ("First arg is c" println)
За жизнь написал где-то больше 100 000 строк. Никогда не приходилось использовать один и тот же класс в разных проектах. Доктор, я болен? Что со мной не так?!
Бесит в программирование являние «моды». «А ты знаешь что такое скрам?», «скрам тренер». Потому что все делают, и это относиться к бабкам. И мне потом приходиться рвать шаблонпукан когда узнаешь, что где-то в корпорации X не знают ни про какой скрам и даже про ООП. И гребут бабло. При желании можно придумать 9000 стратегий и тактик. Ну например, по 3 человека садить за ЭВМ, а потом менять их каждые 3 часа, и каждый из них по очереди отчитывается за тройку каждые две недели. Или, например, пОгромисты садятся друг другу на шею в стоячем положении с двумя вертикальными мониторами, и каждый из них пишет верхнюю и нижнюю часть строк. Один сверху-вниз, другой наоборот. И назову это «Срам».
Срам™ — это шаг в будущее! Приходи сейчас! Скидка 5% для новичков до 25 декабря!
ну я конкретно про 'программную сущность' если можно так выразиться
Кажется ещё в школе преподаватель по информатике задал алгоритм позволяющий отличать кошек от собак. Не в коде а просто описать порядок действий, как если бы ты пытался объяснить это инопланетянину. Оказалось что вещь доступную практически каждому ребёнку практически невозможно формализовать. Мне кажется что сейчас ты занимаешься тем же самым.
Как найти ту тонкую грянь которая разделит ОО-код от иного?
Нет этой грани. Это всё равно что искать формальные отличия между хорошими и плохими шутками.
А если молчит (фотка например), да и чем лай отличается от мяуканья?
ну, перед тем как определить кто это наверное надо сначала формализовать объект, т.е. привести кошку/собаку к структуре данных описывающию их характеристики и уже отталкиваться от этого