LINUX.ORG.RU

Что такое ООП

 ,


1

2

тут недвно был тред, что такое ооп, чем оно отличается от не-ооп, бла-бла-бла. Так ничего и не выяснилось толком.

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

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

Потому что ответ лежит на поверхности, поэтому его никто не видит.

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

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

Простой пример. Возьмем подстановочную модель, ака ФП. Центральным объектом данной парадигмы является функция. С точки зрения ООП, функция — это актор. Например, у нас есть функция, которая имеет такой вид sum(1, 2) // 3 Мы могли бы выразить это как-то так

Sum = new Function
Sum.code = a + b
theSum = new Sum 
theSum.setArguments(a: 1, b: 2)
theSum.call

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

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



Последнее исправление: somequest (всего исправлений: 1)

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

Тебе конкретный вопрос задали про состояние функции суммы. Как ты изменил состояние функции суммы? Изменив диспетчеризацию, вызывая функцию вычитания при получении символа «+»? Как от этого изменилось состояние или поведение функции суммы?

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

разуй глаза, то был ответ на вопрос о состоянии объекта 5

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

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

Методы: применить функцию к аргументам, частично применить к аргументам, проверить применима ли функция к данному количеству / типам аргументов.

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

Про плюс - моей пост выше.

Про 5 - это вырожденный объект, у которого состояние это его же значение и оно неизменяемо. Собственно в смолтолке так и есть.

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

Есть фунции — они детерминированные. (Например Date() и Rnd() функциями не являются, т.к. возвращают каждый раз другое значение.)

Если мы говорим в терминах CS, то Date и Rnd это самые настоящие функции, но не чистые.

И есть методы/сообщения — нечто меняющее (или не меняющее) у объекта его внутренне состояние.

Именно, вот например у объекта `5' просто нет методов, меняющих его состояние. Если не брать в расчет приведенный выше пример с изменением самих методов, но тут вопрос, относить ли методы и объектную метаинформацию к состоянию? Но это в текущей дискуссии не важно совсем.

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

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

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

Теперь ты добавил h для NumberList. Идёшь в системную библиотеку и исправляешь на

В обычном ООП типа плюсов, джавы, питона все именно так, и это действительно больно. Но в нормальном ООП можно переопределять методы не только в месте определения класса (даже в Go так сделали со структурками), а в качественном это можно делать даже в рантайме.

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

`5' просто нет методов, меняющих его состояние. Если не брать в расчет приведенный выше пример с изменением самих методов

Это про мой пример чтоли? Тот же setSlot — это метод меняющий состояние объекта типа «Number». Вообще, не знаю как в смолтоке, но в Io числа — полноценные объекты. От них даже наследовать можно


five := 5 clone do(
   foo := "bar"
)

writeln( five + 1 )  // 6 
writeln( five ?foo ) // bar
writeln( 5 ?foo )    // nil

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

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

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

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

числа — полноценные объекты. От них даже наследовать можно

Наследуются от классов, знаток ООП)

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

В прототипном ООП классы ничем не отличаются от объектов

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

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

просто это ветвление абстрагировано от тебя в алгоритме диспатчинга сообщений

ИМХО в диспатчинге лукапы, а не ветвления. А процедурное программирование — это частный случай ООП, как и любое другое, а не наоборот.

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

Тот же setSlot — это метод меняющий состояние объекта типа «Number»

Вот тут спорно, в твоем IO просто объект является классом, а значит содержит в себе все методы, поэтому ты считаешь что меняется состояние объекта. В ООП где есть конечные объекты, которые не классы, вся эта инфа содержится в классе, а у объекта только стейт, и в этом случае твой setSlot не поменяет объект `5', а поменяет слоты в его классе.

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

в общем случае

В каком это общем? Класс-ориентированное ООП — это частный случай ООП, а не общий. А если говорить о более общем подходе, то прототипный подход тут как раз более общий, классовое ООП содержит ограничение, а подход с ограничениями не может претендовать на общность. К примеру, прототипное ООП с ограничениями на наследование от инстансов — это частный случай прототипного ООП, и как раз является классовым. Так что не надо тут про общесть.

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

а значит содержит в себе все методы

Нет не содержит, он их наследует. Хотя может и содержать, при желании. Но это все детали реализации, они нас волновать не должны.

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

Интересно, а я все представил наоборот, что прототипное ООП это как классовое ООП с отрезанным классо-объектным уровнем и оставленным метаобъектным уровнем, метаобъекты создают метаобъекты, наследуют друг друга и тд.

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

Но это все детали реализации, они нас волновать не должны.

Теюе уже говорили, что ты являешься ярким примером типичного говнокодера? Хоть книгу пиши на основе твоих мессаджей.

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

Но это все детали реализации, они нас волновать не должны

Именно, а по твоему коду выходит что идеологически он содержит методы, ведь у five появился метод foo, а у `5' нет.

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

Это неверное представление, и тому есть простое доказательство.

Может ли классовое ООП быть прототипным? — Нет

Может ли прототипное ООП быть классовым? — Да. Для этого нужно просто ввести ограничения.

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

Какие именно методы? метод setSlot они оба нследуют делегированием от Object по дефолту. foo есть только у five, это его личное свойство, а 5 является родителем five.

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

Ну, как бы, в теории это возможно, наверное, если в качестве инстансов всегда использовать только сабклассы, но я не думаю, что это технически возможно в реальных ЯП. Поэтому, by design.

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

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

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

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

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

Если вызвать у five setSlot на setSlot - он ведь изменится только у five?

В смысле изменить метод setSlot у five? Да, тогда у five будет свой собственный setSlot. Это справедливо для любого объекта.

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

а говорим о дефолтных системах

Ну так лол, чтобы в прототипное ООП добавить объекты от которых нельзя наследоваться надо тоже это реализовать.

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

Если уж ты заводишь речь об «что есть частный случай чего», то наименьший знаменатель для любого вычислителя — это Машина Тюринга.

А от всё остальное — это сахар и частный случай. Включая PP, OOP, FP ... и уйму других P.

Т.ч. твой любимый OOP — это частный случай BrainF*ck. ;) Deal with it.

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

А вообще, я думаю, такая «реализация» займет пару строк. Надо просто инициализировать кастрированные инстансы, с отрубленными методами clone, appendProto и prependProto.

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

Ок, не наследоваться и правда можно. Но есть еще изменение методов у класса, которое должно изменить поведение всех его объектов. В твоем IO это сработает?

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

somequest Презумпция невиновности, несмотря на его тупак, он не находится в списке persona non grata Pinkbyte ★★★★★ (27.11.2015 14:12:17) 09.12.2015 7:51:03

Расслабься :-).

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

это Машина Тюринга

Машина тьюринга — частный случай модели Акторов. Я как раз эту тему в соседнем треде про мультиметоды раскрыл, можешь почитать, если интересно.

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

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

Если рассматривать CLOS, то надо учитывать его относительно (одиночногог диспатчинга) низкую производительность. А если производительность не важна, то можно рассмотреть GLS: там обобщенные функции есть, а классов нет (и других ограничений CLOS типа конгруэнтности методов тоже нет):

(defgeneric foo)

(add-method
 foo
 (method ((x (and? integer? even?)))
	 (cl-format #t "foo on even int, (~a)~%" x)))

(add-method
 foo
 (method ((x (and? integer? odd?)))
	 (cl-format #t "foo on odd int, (~a)~%" x)))

(add-method
 foo
 (method ((x integer?))
          (y (lambda (y) (> y 0)))
	 (cl-format #t "~a~%" (+ x y))))

(foo 2) ;; печатает "foo on even int, (2)"
(foo 3) ;; печатает "foo on odd int, (2)"
(foo 1 2) ;; печатает "3"

Это тоже, что-ли, ООП?

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

В твоем IO это сработает?

Да, не вижу препятствий. Список родителей то у него останется.

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

моде́ль а́кторов представляет собой математическую модель параллельных вычислений

ref: https://ru.wikipedia.org/wiki/Модель_акторов

Машина тьюринга — частный случай модели Акторов. Я [..] эту тему [..] раскрыл

Что ты там раскрыл мне читать откровенно лень. Но и так ясно, что ты сравниваешь тёплое с мягким.

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

почему теплое с мягким? И то и другое — вычислительные матмодели, почему бы их не сравнить. И, собственно сравниваю даже не я, а Карл Хьюитт, который в одной из своих бумаг показал, что существуют алгоритмы нереализуемые в МТ, но реализуемые в Модели Акторов. То есть тезис Черча-Тьюринга опровергнут.

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

С точки зрения ООП, функция — это актор

Дальше не читал и не понимаю, почему вообще дочитал до этого момента

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

Скаежем так, МТ не является *актор-полной* моделью, поэтому является частным случаем, но не наооборот.

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

то можно рассмотреть GLS

А что это? Гуглится только гай стил.

Это тоже, что-ли, ООП?

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

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

Почему же? Под актором тут имеется ввиду объект. Во всяких рубях функции и методы являются вполне себе объектами.

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

Потому что утиная типизация (ага, оно выглядит как актор и, кажется, ведет себя как актор, значит оно — актор!) тут неуместна

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

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

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

Я употребляю это слово, потому что слово объект во-первых скомпрометировано всякими плюсами и прочим Г, во-вторых, потому что слово объект плохо отражает суть, так как объект в ООП не пассивен. Концептуальной разницы между объектами в ООП и акторами нет, обе идеи развивались под общим влиянием, и актор вполне может обобщить понятие объекта. Если ты видишь принципиальную разницу между этими понятиями, то назови ее.

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