LINUX.ORG.RU

В смоллтоке нет классов

 , ,


0

2

Как-то раз, услышав про то, что в смолтоке есть классы, я подумал, что автор языка выбрал ошибочное направление. Где то в википедии, я читал, что селф перенял у смолтока идеи объектов, но выкинул классы, и я подумал, что тру — это селф, а смолток ушел с праведного пути. Однако я ошибался. Оказывается в смолтоке не было никаких классов, то, что там называлось классами, по-факту есть прототипы. То есть в смолтоке не было классов. Вообще. Это просто терминологическое недоразумение.

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

«То, что мы рассмотрели, не отвечает на главный вопрос: как объект, получивший сообщение, находит метод, который надо выполнить? Остановимся подробно на механизмах поиска по сообщению необходимого метода и его выполнения. Итак, как уже отмечалось, выполнение любого действия в системе Смолток осуществляется с помощью посылки объекту сообщения. Получив сообщение, получатель ищет метод с соответствующим сообщению шаблоном, начиная поиск обычно со своего класса. Если объект — класс, то метод ищется среди методов класса, а если объект — экземпляр класса, то среди методов экземпляра класса. Если метод с соответствующим шаблоном находится в классе получателя, то он выполняется, и как результат его выполнения обязательно возвращается некоторый объект, который информирует того, кто послал сообщение, что выполнение метода завершилось с содержащимся в возвращаемом объекте результатом. А если метода с нужным шаблоном нет в классе? Тогда к работе подключается иерархия классов, а точнее, цепочка суперклассов для класса объекта-получателя. Если в классе подходящего метода нет, метод ищется в ближайшем его суперклассе. Если нужного метода нет в суперклассе, то поиск продолжается в следующем по иерархии суперклассе и так далее, пока не доберемся до класса Object.»

Таким образом, в JS реализована точная копия смолтока. Семантически, JS — это и есть смолток, правда с ненужными шлюхами. Странно, почему об этом все молчат в тряпочку.

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

Не кричат об этом только потому, что кому надо, тот найдет. Минусов у JS от подобной реализации немного, т.к. в нем на производительность обычно не обращают внимания. Тогда как в том же перле, за $obj->{date} = $datetime вне реализации методов класса в каком-нибудь ООП-проекте надо давать по рукам. Однако не делают по той простой причине, что надежд возлагают больше и вызов функции дороже присвоения значения. В классическом ООП это нарушение базовой концепции, а значит не может называться православным чистым ООП.

Иными словами никаких классов в таких языках нет, как нет и ООП К. счастью, неразборчивые люди любят все модное, а ООП это модно и молодежно, не преступай черту и будут у тебя почти настоящие классы. Если же кричать, что в JS нет ООП, то все напугаются и разбегутся :)

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

Я за то, чтобы скинуться на киллера.
Бан против такого класса энтузиастов не поможет, как пример — «Царь».
На худой конец надо менять правила ЛОРа таким образом, чтобы была возможность коллективно проголосовать за запрет на создание тем.

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

классическом ООП

Тут «классическом», тоже следовало бы употреблять с осторожностью, не забывая о корнях:

I invented the term object-oriented, and I can tell you that C++ wasn't what I had in mind

Это, устоявшиеся мартышечьи штампы, к сожалению.

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

Твое мнение конечно интересно всему миру :)

Говно или нет, критическое мышление это отказ от разумного. «Классовое» ООП удобно и понятно, а когда используешь лишь его части и комбинируя с другими техниками/подходами, то получается код понятный только тебе. Исправляется это комментариями, конечно. Только вот зачем использовать части ООП, когда лучше обходится вообще без него?

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

Я так понял тебе нравится функциональщина, так возьми хаскель :)

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

Я так понял тебе нравится функциональщина, так возьми хаскель :)

Ты плохо понял:

Все ЯП, в конечном итоге, делятся на 2 категории Ъ — интерпретация и динамика и говно — статика, алгебраические быдлотипы и компиляция.

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

Я так понял тебе нравится функциональщина, так возьми хаскель

Нет, мне не нравится ФП, хаскель особенно. Мне нравиться как раз модель смолтока и ранних лиспов, рефлексия и мета. Что касается ФП vs OOP, это очередной штамп, ничего общего с реальностью не имеющее. В определенном смысле, класс-ООП это и есть ФП. В них обоих нет динамики, это их роднит как ничто другое. Это братья-близнецы-уродцы, там разница только в сахаре, по большому счету. Если взять нечистое ФП, например схему, это и есть ООП без сахара. Никакой разницы вообще нет. Ну а хаскель — это терминальный случай кастрации (почти терминальный, для гурманов есть еще строгое ФП)

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

писать на яве и поймешь, какой кайф

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

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

Он хотя бы разберается в том о чем пишет. Это не anonimous, который нахватал баззвордов из руССкой википедии.

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

Ой лол. Ты один из тех, кто никогда не фиксит баги. Не поддерживает код. И работает в команде таких же безбашенных как ты :) Всегда пишешь только свежий код. Тоннами.

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

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

Твой же пример тому доказательство: В смоллтоке нет классов (комментарий)

Что это? ООП? :)

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

Что это? ООП?

Кстати, да, Ъ ООП на этом принципе строиться.

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

Что это? ООП?

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

(define-macro (my-or x y) (or (eval x) (eval y)))
(print (my-or 1 (print 'foo))); 1
(my-if false (print 'foo)); foo

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

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

Выше я писал, что такой подход адекватен, когда ты один, либо вся команда принимает такой стиль. А теперь задумайся как этот стиль будет воспринят посторонними людьми со всего мира, ну, у тебя опенсорс-проект. Неверный ответ: это опенсорс, детка, не нравится — делайте форк. Верный ответ: это говнокод, который надо приводить к принятым нормам. Как минимум придется написать введение в комментариях почему данная техника выигрывает по всем статьям любой принятый шаблон проектирования.

P.S. Ладно. Делай как знаешь, все равно не станешь понимать о чем я толкую :)

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

Первое, метод наследуется всем объектам: нужным и ненужным.

Это не проблема, сразу для пачки объектов можно переопределить родителя

mkob=function(ob){ob.__proto__={byName: undefined}; return ob}
ob=mkob({foo: "bar"})
console.log(ob.byName)//undefined
ob={foo: "bar"}
console.log(ob.byName)//functiom
Дальше хоть штампуй mkob, хоть наследуй от ob

По коду придется грепать в поисках объектов, где этот метод задействован

ничего грепать не нужно.

for (i in global) {if (i["byName"]) console.log(i)}
Это грубо, в реале поаккуратней конечно можно все организовать, наследовать не от самого корня иерархии, но проблем тут нет. Если надо, можно рекурсивный обход сделать.

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

Анонимусу (не ТС), высказавшему предположение, что ТС "и есть хакер"

Поскольку ту цепочку удалили, отвечу таким образом:

Ты про каких-то других хакеров пишешь. Суть хакерства — колоссальный энтузиазм; желание сделать то, чего никто не делал; улучшить что-то, что уже было; на худой конец, показать какой ты крутой в своем деле (для чего, как правило, надо сделать что-то из двух перечисленных ранее). Заниматься открытием Америк — немного не то, не находишь?)

Virtuos86 ★★★★★
()

Да ты же не понимаешь этих америк. Из твоих комментов не видно этого понимания. Ты тычешь базвордами, и все. По делу ты ничего не сказал, ты пришел рисануться.

anonimous
() автор топика

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

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

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

да

Ты же призываешь вливаться в толпу и писать как все.

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

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

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

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

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

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

Ооп головного мозга, простите за резкость.

Называй как хочешь, я не против. Здесь вся фишка в читаемости.

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

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

И получим очередной хабр.

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

Мне известен только один Хабрахабр. И не факт, что он плох. Да и идиотизм это. Хочешь сказать, ЛОР такой прям торт? Ну я написал, что думаю о топикстартере, он написал, что думает о том, что я думаю о нем :-). Итог — удалили нашу переписку и чуть подрезали скор. А толку: темы будут появляться, недовольные тоже никуда не денутся. Игнор я не рассматриваю как решение, потому что у меня претензии не к человеку, а к тому, что он делает. Те, к кому есть личные претензии, уже давно в игноре.

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

Достаточно высказать мнение, отличающееся от каноничного, и сразу вся стая, повинуясь стадному инстинкту, заклюет не разбираясь. Мне, например, хватило раз усомниться в комментариях в святости С++, так сразу слили карму голосов на 30. В результате мы имеем поголовное кармодрочерство. То же касается и ЛОРа: подумай сколько людей мечтало бы перевести в read-only тех же Reset, mv, true_admin, тебя, меня etc.

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

Гм, я высказался не за полный R/O. Ну да ладно. Как и обычно, с разумным человеком мне спорить не хочется. Допускаю, что могу упускать какие-то нюансы, связанные со своеобразной уникальностью ЛОРа.

Virtuos86 ★★★★★
()

Глупый вахтер пока я спал дропнул полтреда, тред вырос вдвое. Не опускась до обсуждения действий валенка, скажу тебе, это вин :D

arturpub ★★
()

Класс в рубях можно манкипатчить. Где ваш (удалённый) бог теперь?

Deleted
()

Ох лол, да это же файл написанный мною выросший из темы про смаллталк в споре с yoghurt'om.

https://yadi.sk/i/P6mofKC6UXeG3

А цитата из книги: Кирютенко Ю.А., Савельев В.А. - Объектно-ориентированное программирование. Язык Smalltalk - 2006

Я тогда выложил не на ЛОР, а сразу на хабр. Публика не оценила юмора, но инвайт дали. Вообще там надо 90% текста переписать на человеческий, но мне лень.

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

Публика не оценила юмора, но инвайт дали.

Хабр во многом похож на ЛОР.
Там не понимают о чем речь, но на всякий случай плюсуют.
Тут не понимают о чем речь, но на всякий случай не банят.

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

В небольшом плюсе статья была, но и минусов было достаточно.

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