LINUX.ORG.RU
Ответ на: комментарий от monk

Если произвольный предикат на множестве — это параметризация, то да.

вот и договорились)

anonymous
()
Ответ на: комментарий от monk

Я не вижу проблем. Надо просто унаследвать эти классы от Number, в контексте сравнения и других операций все будет работать.

somequest
()
Ответ на: комментарий от monk

С того, что объект создаётся конструктором класса.

Никто не запрещает создать объект, а уже затем назначить родителей.

И конструкторы разных классов не могут вернуть равные объекты.

А почему они должны быть равные? Речь шла о том, от кого они наследуют, а не об их равности. Один класс тоже порождает разные объекты.

somequest
()
Ответ на: комментарий от monk

Почти так и есть. a и b — произвольные предикаты (функции от одного аргумента, возвращающие boolean),

Нет не так. a и b вообще не обязаны быть предикатами, единственное условие — чтобы они возвращали объеты булевого типа. Даже (or true false) вполне годное выражение.

(and? a b) тоже возвращает предикат.

Нет, он, как правило, тоже возвращает булево значение. Не уверен, что ты правильно понимаешь слово предикат. Предикатом тут является как раз сам and. В общем случае, предикат — это функция, которая производит проверку на истинность.

Суть в том, что если некое значение удовлетворяет двум предикатам, то один из предикатов должен быть супертипом для другого, иначе для этого значения метод не определён.

ЯННП

somequest
()
Ответ на: комментарий от Legioner

Потому что полиморфизм это частный случай мультиметодов для одного объекта.

Я не совсем понял, что ты имеешь в виду. Мультиметоды — это всего лишь сахар, полиморфизм как был так и остался. Мультиметоды тривиально выражаются в нормальных языках без мультиметодов. Сами же мультиметоды семантически, вряд ли можно назвать Ъ, поскольку нарушается семантика. В ООП объект сам должен решать, как ему обрабатывать то или иное сообщение, а с мултиметодами это вуалируется.

somequest
()
Ответ на: комментарий от somequest

Мультиметоды тривиально выражаются в нормальных языках без мультиметодов

Ну если «тривиально», это запилить свой вариант CLOS, то да.

Сами же мультиметоды семантически, вряд ли можно назвать Ъ, поскольку нарушается семантика

Сам-то понял, что сказал?

В ООП объект сам должен решать

После того как сообщение к нему попадёт. А вот к какому объекту иерархии попадёт данное сообщение, решает диспетчер.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

хватит поддерживать в моём треде высеры anonimous!!!

Debasher ★★★★★
() автор топика

Ключевыми особенностями ООП являются:

  • обобщение множества параметров в подмножества (состояние);
  • обобщение состояний по какому-либо признаку;
  • обобщение функций по какому-либо признаку;
  • сопоставление подмножества состояний с подмножеством функций;
  • хотя бы одна функция должна использовать хотя бы один параметр состояния для которого она вызывается.

Если ты можешь сказать: «вот этот набор функций предназначен для работы вот с этими состояниями» - то это ООП. Если ты не можешь вычленить подмножество состояний, или не можешь вычленить подмножество функций, или не можешь сопоставить подмножество функций и подмножество состояний, то это не ООП.

special-k ★★★★
()
Ответ на: комментарий от somequest

Речь шла о том, от кого они наследуют, а не об их равности.

Если у меня уже есть сформированный набор чисел (через new Number или литералы) и я создают подтип Even или Primes, то те числа, которые удовлетворяют предикату подтипа автоматически становятся относящимися к новому подтипу. Если же то же самое с классами, то мне надо для каждого числа вручную проставить список родителей.

monk ★★★★★
()
Ответ на: комментарий от somequest

Не уверен, что ты правильно понимаешь слово предикат.

Предикат — это функция от одного аргумента, возвращающая булево значение

Предикатом тут является как раз сам and

Сам and? имеет произвольное количество аргументов и возвращает предикат.

ЯННП

(and? a b) является потомком a и потомком b. (or? a b) является предком a и предком b.

monk ★★★★★
()
Ответ на: комментарий от monk

хватит поддерживать высеры anonimous в моём треде!!!!

Debasher ★★★★★
() автор топика
Ответ на: комментарий от somequest

Мультиметоды тривиально выражаются в нормальных языках без мультиметодов.

Давай для нормального языка:

(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"

monk ★★★★★
()

ооп-ооп-ооп чида ооп, а я спеваю...

st4l1k ★★
()
Последнее исправление: st4l1k (всего исправлений: 2)
Ответ на: комментарий от special-k

На любом языке можно писать в ООП стиле.

точнее, ооп это просто сборная солянка из других идей
поэтому всё им можно назвать
бесполезный термин

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

поэтому всё им можно назвать

Нечёткость термина не даёт возможности назвать им «всё». Это примерно как термин «человек». Определим как «двуногое без перьев»? А одноногий инвалид — человек? Определим как «мыслящее», а искуственный интеллект? И т.д.

Так и с ООП. Стиль ООП подразумевает, что задача выражается в терминах объектов и их взаимодействия. Это не единственный стиль: из других можно выделить таблицу состояний (задача выражается в состояниях всей системы и переходах между ними) и функциональный (задача выражается в виде функций получающих и возвращающих некие значения).

ООП языки — языки, имеющие синтаксическую поддержку ООП.

Ещё можно вспомнить термин «процедурное программирование». Сейчас другого почти не бывает, а когда-то поддержка на уровне языка GOSUB/RETURN или ENTER/LEAVE была не везде. И также в любом ассемблере можно было писать процедурно, вручную запоминая и восстанавливая стек.

monk ★★★★★
()
Ответ на: комментарий от monk

ООП языки — языки, имеющие синтаксическую поддержку ООП.

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

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

это всего-лишь ещё одно абсолютно бесполезное для этого мира определение

Почему? Оно простое, строгое (либо есть хоть одна синтаксическая конструкция, либо нет), легко проверяется. Или бесполезное для каких целей?

monk ★★★★★
()
Ответ на: комментарий от monk

Почему?

тут надо начинать с доказательства полезности например, а не доказывать что чёрное не белое

Оно простое, строгое (либо есть хоть одна синтаксическая конструкция, либо нет), легко проверяется

ну это ясно, т.е. смотри, если у нас ast-базед язык, ну лишпы какие-нибудь, то они по умолчанию все 'не-ооп'?

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

если у нас ast-базед язык, ну лишпы какие-нибудь, то они по умолчанию все 'не-ооп'

Common Lisp — OOP (глава 7 стандарта ANSI описывает синтаксис работы с объектами и классами). PicoLisp — OOP (http://www.software-lab.de/doc/ref.html#oop, http://www.software-lab.de/doc/refD.html#dm)

Scheme, Clojure — не OOP.

monk ★★★★★
()

Что делает ООП - ООП?

Если повезёт, то заставляет в муках понять, что является не более чем распиаренной техникой проектирования, цель которой состоит в описании решения задачи в терминах классов и методов. :-) Яйцеголовые теоретики-«промоутеры» тебе будут лить в уши про «повторное использование», про «красоту» наследования, будут кормить «красивыми» UML-диаграммами, будут повторять про легкость в сопровождении, будут рассказывать про необходимость изучения паттернов проектирования, и будут тебе подсовывать библиотеки в которых «всего то лишь» нужно реализовать ту или иную MVC-модель, и что остальную работу сделает фрэймворк. :-) Ну и т.д. На практике, сия «великая» техника, если она является единственной в арсенале горемыки-программиста, выкрутит ему руки и обеспечит бедолаге настоящий геморрой, особенно, если будет возвеличена в ранг догмы :-)

anonymous
()
Ответ на: комментарий от anonymous

вот я щас примерно такого мнения и придерживаюсь

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

это просто сборная солянка из других идей

Идей основанных на работе с объектами, да.
Вполне себе конкретный термин, во всяком случае он отрицает отсутствие каких-либо идей.
Если тебе удалось воспользоваться хотя бы одной из идей ООП, то ты его используешь.
Не пойму по какому поводу боль.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

Идей основанных на работе с объектами, да.

вот это ещё очень большой вопрос, 'да' ли

Debasher ★★★★★
() автор топика
Ответ на: комментарий от special-k

Если тебе удалось воспользоваться хотя бы одной из идей ООП, то ты его используешь.
Не пойму по какому поводу боль.

у ооп нет своих идей. я же говорю, это просто солянка из того что было до появления этого термина

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

Нету ни одного лиспа с синтаксисом аля то что ты указал.

anonymous
()
Ответ на: комментарий от Debasher

откуда тут какое-то ооп?

Пипец...

anonymous
()
Ответ на: комментарий от Debasher

из того что было до появления этого термина

До появления этого термина было процедурное программирование, функциональное программирование, логическое программирование, машина состояний. Отдельно концепция модулей. Структуры данных.

Только в ООП появилась идея, что любой алгоритм можно представить не в виде последовательности преобразований, а в виде последовательности передачи сообщений между объектами и алгоритм обработки сообщения должен зависеть от объекта.

monk ★★★★★
()
Ответ на: комментарий от monk

ладно. ок. я просто посыпаю голову пеплом в знак непонимания. не осилил ооп. смиряюсь.

Debasher ★★★★★
() автор топика
Ответ на: комментарий от monk

Давай для нормального языка:

Легко

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

И вообще, код элементарный, нахрен тут вообще мультиметоды, хз. Тут и ООП то никакого нет.

somequest
()

инверсия управления, обмен сообщениями. я прошёл собеседование?

anon1984
()
Последнее исправление: anon1984 (всего исправлений: 1)
Ответ на: комментарий от somequest

И вообще, код элементарный

Он неверный.

Судя по коду, на

foo(c clone, b clone, 2)

будет «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)
monk ★★★★★
()
Ответ на: комментарий от Joe_Bishop

За жизнь написал где-то больше 100 000 строк. Никогда не приходилось использовать один и тот же класс в разных проектах. Доктор, я болен? Что со мной не так?!

bs1988
()
Ответ на: комментарий от Joe_Bishop

Бесит в программирование являние «моды». «А ты знаешь что такое скрам?», «скрам тренер». Потому что все делают, и это относиться к бабкам. И мне потом приходиться рвать шаблонпукан когда узнаешь, что где-то в корпорации X не знают ни про какой скрам и даже про ООП. И гребут бабло. При желании можно придумать 9000 стратегий и тактик. Ну например, по 3 человека садить за ЭВМ, а потом менять их каждые 3 часа, и каждый из них по очереди отчитывается за тройку каждые две недели. Или, например, пОгромисты садятся друг другу на шею в стоячем положении с двумя вертикальными мониторами, и каждый из них пишет верхнюю и нижнюю часть строк. Один сверху-вниз, другой наоборот. И назову это «Срам».

Срам™ — это шаг в будущее! Приходи сейчас! Скидка 5% для новичков до 25 декабря!

bs1988
()
Ответ на: комментарий от Debasher

ну я конкретно про 'программную сущность' если можно так выразиться

Кажется ещё в школе преподаватель по информатике задал алгоритм позволяющий отличать кошек от собак. Не в коде а просто описать порядок действий, как если бы ты пытался объяснить это инопланетянину. Оказалось что вещь доступную практически каждому ребёнку практически невозможно формализовать. Мне кажется что сейчас ты занимаешься тем же самым.

Как найти ту тонкую грянь которая разделит ОО-код от иного?

Нет этой грани. Это всё равно что искать формальные отличия между хорошими и плохими шутками.

ya-betmen ★★★★★
()
Ответ на: комментарий от Debasher

Математика тоже занимается формализацией тем не менее с определениями числа, прямой, точки и пр. напряжёнка.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Математика тоже занимается формализацией тем не менее с определениями числа, прямой, точки и пр. напряжёнка.

да, и эти понятия нужные и полезные, тогда как 'класс' в программировании под вопросом

Debasher ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

А если молчит (фотка например), да и чем лай отличается от мяуканья?

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

Debasher ★★★★★
() автор топика
Последнее исправление: Debasher (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.