LINUX.ORG.RU

Юзкейсы для объектов, в языках, где все — объект.

 , , ,


0

2

Я имею в виду, что все really — объект, а не как в JS, например, где классы примитивных объектов можно расширять, но функциональностью настоящих объектов примитивные типы не обладают. Например, вот так:

"foo".bar=1
Хрен сделаешь. Также, есть проблемы с наследованием. Короче, не ведут примитивы себя как полноценные объеты.

Слышал, что в смоллтоке все есть объект. Думаю, есть еще несколько языков, где также. Например, в Io тоже все есть объект. Однако, я не могу найти нормальные паттерны проектирования, где это свойство языков используются на полную катушку, не вижу юзкейсов. Где посмотреть? Примеры кода очень приветстуются. Спасибо.

Я немного тупой и поэтому не знаю в тему ли отвечу, но в ruby например интересная фишка, что объявление класса это фактически функция создающая объект класса, которой передается блок с инициализацией. И в этом блоке можно как угодно расширять объект класса, в том числе используя какие-то функции для этого, типа attr_accessor для создания свойств и геттеров/сеттеров к ним.

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

Докажите это. Почему в SICP главы о проектировании систем посвящены исключительно ООП, и авторы заявляют, что FP сосет на таких задачах?

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

В любом языке всё объект. Просто некоторые понимают не все сообщения.

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

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

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

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

А что ты конкретно хочешь увидеть-то?

Ну вот например в смолтоке:

something ifTrue: [self foo] ifFalse: [self bar]

- шлем переменной something (подразумевается, что это Boolean) сообщение ifTrue:ifFalse: с двумя блоками внутри, для объекта True обработчик выполнит первый, для объекта False - второй.

1 to: 3 do: [:each | each printNl]

- шлём объекту 1 сообщение to:do:, указывая вернюю границу интервала и блок кода, который надо выполнить для всех элементов внутри него

(1 to: 10) collect: [:each | each squared]

- создаем сообщением to: объект-интервал, итерируемся по нему, для каждого элемента считаем квадрат, получаем новую коллекцию квадратов (а-ля map).

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

В принципе да, в js тоже можно расширить прототип в конструкторе. Только в ruby можно именно сам класс динамически изменять при объявлении, а не объект этого класса в конструкторе.

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

Метод объекта — функция работающая с мутабельным состоянием объекта.

А функциональное программирование, если не насиловать себе и окружающим мозги книжкой по схеме для студентов-первокуров — есть программирование с использованием функций.

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

искусство демагогии: высший пилотаж:)

Это у Вас какое то свое, особенное, определение ФП.

Метод объекта — функция работающая с мутабельным состоянием объекта.

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

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

Вот тут

http://www.youtube.com/watch?v=7erJ1DV_Tlo

на 22:51 и чуть далее, Карл Хьюитт четко указывает на ограничения ФП. Он тоже насилует нам мозг (вслед за Сассманом и Абельсоном, lol)? Диванные аналитики с лора на порядок умней этих ученых?

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

Ну а что такое объект? Это структура данных с привязанным к ней каким-либо образом набором функций.

И?

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

Большое спасибо! Сделал то же самое на Io


Range

1 to(5) foreach(print)
1 to(5) map(*2)

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

my := Object clone do(
 foo := 1
 bar := 2
)

myTrue := true clone do(
 setProto(my)
)
myFalse := false clone do(
 setProto(my)
)

test := method(object,
 object ifTrue(return (object foo)) ifFalse(return(object bar))
)

test(myTrue) println   # --> 1
test(myFalse) println  # --> 2


>>А что ты конкретно хочешь увидеть-то?
вот что то в этом роде и хотел, еще раз спасибо. Может быть что-нибудь посерьезней, какую-нибудь маленькую модель какой-нибудь системы, чтобы увидеть мощность этих механизмов в действии.
theKingOfJava
() автор топика
Ответ на: комментарий от yoghurt

прошу прощения, закосячил прошлое сообщение

А что ты конкретно хочешь увидеть-то?

вот что то в этом роде и хотел, еще раз спасибо. Может быть что-нибудь посерьезней, какую-нибудь маленькую модель какой нибудь системы, чтобы увидеть мощьность этих ООП-механизмов в действии.

//fixed

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

Может быть что-нибудь посерьезней, какую-нибудь маленькую модель какой нибудь системы, чтобы увидеть мощьность этих ООП-механизмов в действии.

Ну вообще-то это всё есть в любой программе на Смолтоке, в том числе в самом Смолтоке. Поэтому:

1. Качаешь Pharo, запускаешь
2. Открываешь браузер классов
3. ????
4. PROFIT!

yoghurt ★★★★★
()
Ответ на: комментарий от theKingOfJava
1 to(5) foreach(print)
1 to(5) map(*2)

ЕМНИП Не совсем равнозначно моему коду, т.к. у меня в первом случае итерация выполняется объектом числа, а во втором - объектом интервала, созданного из числа (на то и скобки).

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

Спасибо. Мне, честно говоря, не нравиться, что в смолтоке есть классы в явном виде. Я думаю, это, таки, ошибка в дизайне, лишняя абстракция. ИМХО, правильный подход, в этом смысле, в Self, Io, отчасти в JS и Lua, но в последних маловато средств для метапрограммирования. Классом должно становиться все то, что мы считаем классом, так намного легче, язык чище. По этой причине, я надеялся избежать изучения смоллтока и руби, а ограничиться одним Io. Но, для него (как и для селфа), очень мало обучающих материалов, очень маленькое комьюнити. Поэтому, похоже, все таки, придется учить Smalltalk или Ruby.

Eще раз спасибо!

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

Не совсем равнозначно моему коду, т.к. у меня в первом случае итерация выполняется объектом числа, а во втором - объектом интервала, созданного из числа (на то и скобки).

Да, не заметил. Я что-то не понял, там выполнение справа налево что-ли идет? Вы не могли бы разбить это выражение на подвыражения, в соответствии с порядком выполнения, а то, что-то переклинило меня:) не могу распарсить.

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

Вычисляется всегда слева направо, поэтому 2+2*2 = 4

1 to: 3 do: [:each | each printNl]

to:do: - одно сообщение (keyword message) с двумя параметрами - числом 3 и блоком.

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

to:do: - одно сообщение (keyword message) с двумя параметрами - числом 3 и блоком.

Не разрушает ли это гомоиконность?

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

Про гомоиконность <синтаксиса> в смолтоке вроде никто и не говорил :). Это всего лишь форма отправки сообщений, и всего их три - унарные, бинарные, и keyword messages.

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

to:do: - одно сообщение (keyword message) с двумя параметрами - числом 3 и блоком.

тогда вот так наверное будет


Range

Number todo := method(end, bl, bl call(self to(end)))

1 todo(3, block(x, x foreach(print)))

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

Вообще, мне кажется, эти ваши

унарные, бинарные, и keyword messages.

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

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

В смолтоке это действительно сахар, любое сообщение объекту можно отправить сообщением (!) #perform (#perform:with, #perform:with:with, ... #perform:withArgs:),

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