LINUX.ORG.RU

Вопрос по ООП в CL

 , ,


0

3

Много раз слышал, что в CL очень мощная модель ООП. И вот, когда наконец дошли руки почитать об этом подробней, с удивением обнаружил, что в CL НЕ все есть объект. Тогда непонятно, что же в ней сильного? В смолтоке, джаваскрипте, ио, селфе и во многих других языках все есть объект. А в CL, получается, урезанная модель ООП, близкая к плюсовой? А как с этим, кстати, обстоят дела в схемах?

Ответ на: комментарий от holuiitipun

Нет, я о выразительных возможностях и инструментах построения абстракции, а также о гибкости (это все взаимосвязано, на самом деле)

linux-101
() автор топика

урезанная модель ООП, близкая к плюсовой?

и что, в смоллталке есть множественное наследование? а в джаваскрипте ограничения паблик/приват/протектед?

next_time ★★★★★
()
Ответ на: комментарий от linux-101

выразительных возможностях

На cl можно написать нужный тебе dsl - выразительней не бывает.

инструментах построения абстракции

В clos есть классы и объекты, если чего-то не хватает, можно всегда сделать свой adt на списках.

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

в джаваскрипте ограничения паблик/приват/протектед?

В js, кстати, можно эмулировать приватность используя замыкания.

Ну и _ префикс можно использовать, в python же как-то живут)

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

реал «изнутри» — это операция над целыми числами, а не число, а поскольку операция над Х — не является частным случаем Х, то наследовать реал от интежер — некорректно. с другой стороны, общий класс-предок был бы корректным решением — можно определить интежер как операцию над абстрактным целым числом. в общем, как только начинается математика, ООП сливается — поскольку математика функциональна по своей природе. зато, как только начинается гуй (и любой другой юзер интерфейс), сливается уже ф-щина, потому что юзер интерфейсы объектны по своей природе. такие дела.

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

реал «изнутри» — это операция над целыми числами, а не число

Нифига, реал изнутри это маска и мантиса, т.е. фактически два числа.

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

в python же как-то живут)

плюшка питона в том, что он прост. он далеко не образец чистого ООП. кстати, чистое ООП — это плохо, потому что эти наши компьютеры внутри ни о каких объектах не подозревают.

В js, кстати, можно эмулировать приватность используя замыкания.

костыль же. а топикстартеру — высокие материи подавай.

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

я и говорю, операция над двумя целыми числами — умножение X на 10 в степени Y + костыли типа NaN, в силу объектности целого числа в процессоре, тогда как в математике целое число — тоже функция, а не объект.

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

Да неважно, как оно хранится внутри, хоть как 8 чисел и операций. Важно то, что оно реализует тот же интерфейс, что Integer плюс может добавлять свои методы — например, нецелочисленное деление (в Integer сие невозможно, если результат должен быть тоже Integer).

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

Важно то, что оно реализует тот же интерфейс

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

например, нецелочисленное деление

в математике есть деление. эта операция может выполняться с любыми числами, кроме нуля. кстати, 0 — это единственный объект в математике )

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

с точки зрения математики

Мы говорим о программировании.

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

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

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

нецелочисленное деление в Integer сие невозможно, если результат должен быть тоже Integer

i = 3 / (3/4).

оу. получилось 4. как же так, ведь я разделил целое число на дробь.

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

Это две операции. (3/4) не выдаст тебе Integer, а значит и на выходе без приведения типов он не может оказаться. Ну разве что компилятор оптимизирует это до одной операции i = 4

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

Мы говорим о программировании.

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

В пространстве целых чисел не может

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

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

с т.з. математики дробные числа являются операцией, а не объектом.

расскажите этому специалисту про рациональные числа.

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

вы не поверите, но рациональные числа, тоже являются операцией, а не объектом. объектом в математике является только 0. например уже число 2 — это две операции инкремента, произведённые над нулём.

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

если ограничиться школьной арифметикой, то объектом будет ещё как минимум единица

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

В лиспе знак отдельное число. А основание это основание системы счисления, сейчас везде два бывает.

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

Вы не поверите, но операции тоже являются объектами. Объектами в математике является все, но в основном операции.

anonymous
()

И вот, когда наконец дошли руки почитать об этом подробней, с удивением обнаружил, что в CL НЕ все есть объект. Тогда непонятно, что же в ней сильного?

именно это и сильно. у тебя есть вектор для массивов, а не боксинг в объекты. но «неаккуратненько», да.

в CL, получается, урезанная модель ООП, близкая к плюсовой?

нет, в плюсах урезанная модель ООП, близкая к симула-67. и во всех потомках плюсов.

это не гибкая модель. man FBC aka Fragile Base Class problem.

модель на метаклассах как в смоллтоке или на мультиметодах и метаобъектном протоколе, как в CLOS гораздо гибче.

при желании можно подобное реализовать и в C: по ссылке => сайт COS (читай pdf)

если хочешь действительно понять, как устроена объектная система внутри, прочти все pdf с сайта COS.

тогда ты поймешь, что мантра «наследование, инкапсуляция, полиморфизм» ничуть не круче мантры «изоляция, посылка сообщений, метаклассы в смоллток» или «мультиметоды, метаобъектный протокол(MOP), рефлексия в CLOS» или «полиморфизм методов и полиморфизм» или «мультидиспетчеризация сообщений и мудбьтфорвардинг сообщений»

это всё разные способы, механизмы реализации объектной модели.

в этом гибкость языка — ты можешь реализовать любую объектную модель, и такая объектная система будет работать почти так же, как та, что «из коробки» (например смоллтокоподобный Flavors в MacLisp или CLOS в CL или ILOS в ISLISP)

в отличие от, например, жабы или це с решёткой — где прикручено болтами одно-единственное.

А как с этим, кстати, обстоят дела в схемах?

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

правда далее выясняется, что например коллекции тоже должны поддерживать объекты, должны быть интерфейсами а не просто функциями и т.п.

в идеале, более абстрактно красива ООП система как CLOS, только более замкнута, когда «всё есть объект»: goo, Dylan например.

хотя без оверхеда, когда не нужно — в основном, достаточно.

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

а зачем накладывать ООП слой на сущности которые не являются проекциями объектов реального мира?

для онтологии, больше незачем.

И почему если это не делается, то ооп «урезанное»?

потому что гибкие ad-hoc онтологии и фолксономии, фасетные неиерархические сети (ср. фреймовые сети и базы данных) народом воспринимаются более непонятно, чем иерархическая таксономия в стиле Карла Линнея по родам и видам, и библейского ООП : «Аврам (Object) родил Якова, который родил .... ».

так-то вся это «урезанность» это просто иллюзия в голове — ниасиливание неокрепшим мозгом более других фолксономий и онтологий чем библейское ООП. это да.

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

Проекция объектов реального мира — это философия какая то.

ИМЕННО! Bingo, man онтология как раздел философии, философия техники как раздел системной инженерии.

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

Если мы считаем, что в смолтоке оно полноценное, значит это урезанное, а как иначе? Ну читай, ограниченное, или слабое, если так удобней.

оно эквивалентное (правда, с разным оверхедом). не путай ооп язык и реализацию объектной модели посредством ооп языка.

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

дядь, а спецформа и макрос — тоже объект? ;^)

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

и в чём же профит, если можно этого и НЕ ДЕЛАТЬ и не плодить лишние протёкающие абстракции (или обструкции)?

гугли по OOP has failed

если мы строим свои абстракции средствами ООП

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

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

Достаточно отнаследовать от Number и специализировать

зачем «отнаследовать» если можно сразу специализировать?

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

man Interface Passing Style и монады во все поля/

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

там всего-то того синтаксиса: #символ, [ блок ], переменная = значение, объект :посылка_сообщения аргумент сообщения . (точка).

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

А мысль, напомню, была в том, что наследование - это, внезапно, плохо.

наследование — это один из способов построения онтологии, самый жёсткий тип связи. уже полиморфизм гибче, но он использует наследование. программируемый полиморфизм (нечто вроде типов классов или predicate dispatch-инга), то есть, специализация — самый гибкий.

все они нужны на своём месте.

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

ах, да, ещё: |локальная_переменная| тело метода . или [ параметр_лямбды|тело_лямбды_в_виде_блока ]

вот и весь синтаксис.

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

наследовать Real от Integer плохо в любом языке, потому что это онтологически разные сущности. тебе не наследовать надо, а реализовать numerical tower.

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

наследованием же ты задаёшь слишком жёсткий полиморфизм, в духе библейского ООП (как в Яве и FBC).

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

А я, да, смоллток не знаю, но зато знаю, что он спроектирован так, что там все является объектом.

что, по-твоему, это означает? что именно и как именно для этого и где именно «спроектировано» ?

но зато знаю

если на этот вопрос не ответишь, значит, не знаешь.

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

зачем «отнаследовать» если можно сразу специализировать?

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

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

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

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

архитектурное описание есть онтология, нотация и метод описания.

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

наследованием же ты задаёшь слишком жёсткий полиморфизм, в духе библейского ООП (как в Яве и FBC).

Что Вы называете наследованием, в данном случае? В общем случае? Наследование объекта от объекта делегированием, в духе Селфа это наследование по-вашему или нет? Создается ощущение, что Вы называете наследованием исключительно жесткую иерерхию Суперкласс-->Класс-->экземпляр.

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

что, по-твоему, это означает? что именно и как именно для этого и где именно «спроектировано» ?

Это значит, примерно то, что ни одна сущность языка не статична, а бесконечно расширяема динамически. Как то так.

linux-101
() автор топика
Ответ на: комментарий от linux-101

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

Наследование объекта от объекта делегированием, в духе Селфа это наследование по-вашему или нет?

наследование словарей объектов (прототипов), а не самих объектов, тогда уж.

делегирование это один из способов реализации полиморфизма, наследование — другой (полиморфизма типов классов). просто «наследование» считается встроенным способом, но оно реализовано где-то внутри рантайма языка, обычно во время компиляции.

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

другие, менее жёсткие онтологии *других* объектов, с другими отношениями — задают другие, более гибкие полиморфизмы.

а диспетчеризация методов, или специализация — задаёт способ *реализации* этих полиморфизмов в рантайме объектной системы.

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

кластер метапарадигм, ага.

нет, такое описание не годится: оно слишком неоднозначно.

что значит «сущность языка», «бесконечно расширяема», «статична/динамична»?

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

что именно и как именно для этого и где именно «спроектировано» ? Спроектированно тут условно, в контексте основных идей. Я читал, что смолток был написан Аланом Кеем за несколько утр (прямо как JS почти), и вдохновил его на это лисп, лисповские фекспры, насколько я понимаю — это прототип объектов смолтока.

linux-101
() автор топика
Ответ на: кластер метапарадигм, ага. от anonymous

что значит «сущность языка»

сущность языка, это, можно сказать, любая его семантическая единица.

«бесконечно расширяема», «статична/динамична»?

Это значит, что, например, есть объекты, наследующие от класса свойство a=1, и мы прямо в рантайме можем переопределить разом все свойства этих объектов путем изменения класса, типа, экстремально позднее связывание, я так понимамаю со своей колокольни, более четко сформулировать не могу, академиев не кончал:)

linux-101
() автор топика
Ответ на: комментарий от linux-101

а ещё, как пишут в Coders At Work интервью с авторами языка программирования, Дэном Ингалсом (который писал реализацию смоллтока «за несколько утр», сюрприз, НА БЕЙСИКЕ) и в какой-то лекции Алана Кея, его вдохновила биологическая клетка.

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

когда Алан Кей попытался промоделировать «клетку», получился «объект»: некоторая самодостаточная сущность, (клетка/объект) общающаяся с внешней средой (посылающая сообщения, выполняя диспетчеризацию методов) и реагирующая на сообщения (поиск и выполнение метода, или посылка :doesNotUnderstand если нет заложенной реакции).

т.е., «спроектировано» означает не абстрактный «кластер метапарадигм» идей или там «компилируемых фекспров» (объекты как суперкомпилированные фекспры, ога).

а вот такие компоненты, вот такие функции и назначение, вот таким методом объединены.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.