G>Уж не знаю, насколько это страшно , но перечисленые языки (Haskell, CLOS и OCaml) поддерживают ООП . Даже в простом, интуитивном смысле, хотя это легко и проверить формально по классическому определению. Что говорит о плохо составленом определении Кея — оно недостаточно общо, настолько, что не работает на целом классе языков.
Открыл тут книжку "Developing application with Objective Caml", на главе "Object-Oriented Programming". В первом же абзаце:
A method is invoked by sending a message to an object. When an object receives a message, it performs the action or the computation corresponding to the method specified by the message.
Кстати, если я не ошибаюсь, в OCaml объекты _имеют_ состояние: в определение класса входят instance variables. Интересно, в других функциональных языках из перечисленных выше такая же ситуация?
Здравствуйте, serg_mo, Вы писали:
_>Здравствуйте, Gaperton, Вы писали:
G>>Уж не знаю, насколько это страшно , но перечисленые языки (Haskell, CLOS и OCaml) поддерживают ООП . Даже в простом, интуитивном смысле, хотя это легко и проверить формально по классическому определению. Что говорит о плохо составленом определении Кея — оно недостаточно общо, настолько, что не работает на целом классе языков.
_>Открыл тут книжку "Developing application with Objective Caml", на главе "Object-Oriented Programming". В первом же абзаце:
Респект!
_>
_>A method is invoked by sending a message to an object. When an object receives a message, it performs the action or the computation corresponding to the method specified by the message.
Ну да, про OCaml так можно сказать, т. к. там "методы" полиморфны по одному (неявному) аргументу — адресату "сообщения". Это, кстати, не снимает других "но" — OCaml строго типизирован, и там далеко не каждому объекту можно отправить любое сообщение. Т. е. объект не "сам решает", как его обработать . Но ладно, будем считать это придиркой и закроем на это глаза.
Есть пример поинтереснее. Попробуй придумать, как можно выразить в терминах сообщений вызов мультиметода (CLOS. Вызов, "виртуальный" по всем аргументам). Кому отправляется "сообщение"? Кто обрабатывает "сообщение"?
_> Кстати, если я не ошибаюсь, в OCaml объекты _имеют_ состояние: в определение класса входят instance variables.
Здесь необходимо пояснить. Наличие instance variables само по себе не означает наличие "состояния". Состояние предполагает наличие изменяемых членов класса, т. е. возможность их модификации. Суть же функциональных языков состоит в отсутствии у функций побочных эффектов (referential transparency), что отрицает возможность модификаций (destructive updates) — вместо этого объект пересоздается заново.
Но. OCaml не является "чистым" (pure) функциональным языком , и включает в себя полный набор императивных возможностей. В частности, в OCaml ты можешь объявить переменные класса как mutable, вот тут-то у объекта и появится состояние. Так что ты отчасти прав - объекты OCaml могут иметь состояние. Но программисту рекомендуется пользоваться этим мотивировано и как можно реже — только когда по другому нельзя или слишком сложно (рекомендация общая для всех ФЯ с побочными эффектами). Если же ты будешь пренебрегать этой рекомендацией, встает вопрос — зачем тогда вообще писать на OCaml с его функциональными возможностями. С# (ну или Smalltalk ) в руки — и вперед.
_>Интересно, в других функциональных языках из перечисленных выше такая же ситуация?
В CLOS — возможно, так как он тоже допускает побочные эффекты. Но там зато там есть мультиметоды , и это плюс одна причина, по которой он не подходит под определение Кея.
Наиболее интересны с этой точки зрения Haskell и Clean. Эти языки принципиально не допускает побочных эффектов — они "чисты". То есть там у объектов не может быть состояния даже в порядке исключения. И там есть поддержка ООП.
Если уж у тебя хватило духа отрыть мануал по OCaml, то могу посоветовать к чтению вот этот документ:
A Gentle Introduction to Haskell 98 http://www.haskell.org/tutorial/haskell-98-tutorial.pdf
Посмотри их систему типов, в частности type classes. Этот документ написан очень интересно, просто и понятно. Ты возможно, поймешь, о чем это я здесь, и (я почти уверен) получишь удовольствие от прочтения. Он действительно хорош — одно из лучших чтив на тему Computer Science. Советую читать подряд .
Здравствуйте, Sinclair, Вы писали:
S>Именно из этих трех групп появились секции private, protected и public. Ребята, они не от бога даны. Это всего лишь отражение структуры конкретного языка. Не было бы наследования — не было бы protected.
А в Delphi, вообще-то, их не три, а четыре. Еще есть published — это ой-ой-ой что такое!!! Если метод объявляется как published то информация о нем доступна в run-time, то есть во время выполнения программы этот метод можно вызвать по его имени, а не по индексу в таблице функций. Метаинформация, однако. На использовании этой метаинформации построена сама среда Delphi — там в design-time когда кидаешь на форму компоненты — они же все "живые", в смысле скомпилированы и их код запущен на выполнение, а как поиметь доступ к скомпилированному коду без метаинформации? Никак. В .NET метаинформация хранится для всего-перевсего, а в среде Delphi — только для того кто объявлен как published. Borland когда делала C++ Builder, то ей пришлось внести добавку в сам язык С++ — в него тоже было добавлено слово published, иначе VCL к С++ притянуть невозможно было. В последней версии Borland C++ Builder X — позиционирующейся как кроссплатформенная, Borland отказалась от дальнейшей поддержки VCL, я предполагаю именно из-за того чтобы не вносить изменения в язык С++.
Здравствуйте, iZEN, Вы писали:
ZEN>В моём случае мы обязываем будущие классы-наследники объявлять фактически final protected member. Причём мы не уверены, какие классы будут порождаться от нашего, но будем уверены, что member может быть переопределён только в наследниках и нигде больше (с областью видимости final protected, полиморфизм будет заканчиваться на близком наследнике однозначно).
Идея занятная. С точки зрения теории кристалла, такие ситуации являются слишком экзотическими для введения ключевых слов в язык. С другой стороны, мы можем изобрести возможность использовать произвольные критерии для сегрегации кода. В .Net есть специальная Code Access Security, которая выполняет ту же работу. Вот только делает это она динамически, и на основе разрешений, выданных коду администратором при развертывании. Не вижу принципиальной проблемы реализовать промежуточную схему. Например, ввести атрибут, задающий некоторый статически вычислимый предикат, и подшаманить компилятор так, чтобы он этот предикат проверял. Т.е. private превратится в SourceClass==MyClass, public превратится в true, internal превратится в SourceClass.Assembly == MyClass.GetAssembly, а то, что хочешь ты, превратится в SourceClass.BaseType == MyClass.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Gaperton, Вы писали:
G>3) Что остается? Smalltalk , все что на него похоже.
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them.
G>Весь вопрос — зачем. Авторы (и читатели) большинства статей подразумевают под ООП отнюдь не определение Кея. Хотите, чтобы вас понимали правильно? Используйте устоявшуюся терминологию. Подобные подмены терминов ни к чему кроме путаницы не ведут. А утверждения из разряда "С# не поддерживает ООП" (к чему вы придете пользуясь определением Кея) так вообще вызовет у читателей истерику. Вам нужно такое определение?
Как-то некрасиво получается. Кей придумал нечто и назвал его ООП. Тут понабежали всякие разные и давай интерпретировать, кто во что горазд. В конце концов, оказывается что ООП — нечто совсем другое. И что прикажете делать автору?
[q] "Я уверен в том, что я не марксист" — К.Маркс[q]
Трурль wrote:
> Здравствуйте, Gaperton, Вы писали: > > G>3) Что остается? Smalltalk , все что на него похоже. > >
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them.
> > G>Весь вопрос — зачем. Авторы (и читатели) большинства статей подразумевают под ООП отнюдь не определение Кея. Хотите, чтобы вас понимали правильно? Используйте устоявшуюся терминологию. Подобные подмены терминов ни к чему кроме путаницы не ведут. А утверждения из разряда "С# не поддерживает ООП" (к чему вы придете пользуясь определением Кея) так вообще вызовет у читателей истерику. Вам нужно такое определение? > > Как-то некрасиво получается. Кей придумал нечто и назвал его ООП. Тут понабежали всякие разные и давай интерпретировать, кто во что горазд. В конце концов, оказывается что ООП — нечто совсем другое. И что прикажете делать автору? > [q] "Я уверен в том, что я не марксист" — К.Маркс[q]
Все нормально.
Понимающие люди уже перешли на неформальный термин "объектный подход"
вместо "Объектно-недо-Ориентированное Программирование".
Здравствуйте, _vovin, Вы писали:
_>Автором концепии ООП является Алан Кей. Мотивацией создания ООП послужили два основных источника — SketchPad и Simula.
Дай, плиз, ссылку на истиочник данной информации. Почти уверен, что ты путаешь термин ООП и "объектое программирование" которое пропагандировал Кей.
_>Кое-что на эту тему можно прочитать здесь.
Смолток как раз не является ООЯ. Он как раз тот самый объектный. То есть исповедующих похожую, но несколько другую парадигму.
По большому счету языки можно делить на классовые и на прототипные. Но это не принято. А термин ООП на сегодня четко определен и не стоит птыаться его подменять даже от огромной любви к Смолтоку и т.п.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Rumata, Вы писали:
Vi2>
R>>... Кто-то решил, что их должно быть 3, т.к. это "следует из инкапсуляции". Но, т.к. понятие самой инкапсуляции, как я понимаю, само четко не сформулировано, следствия из него имхо строить довольно опасно.
Vi2>Инкапсуляция — это доступность (или сокрытие) того, что имеет объект, для кого-либо, отличного от самого объекта.
Vi2>Количество состояний доступности определяется тремя словами "никому", "одному" и "всем". Если ты сможешь найти еще слово, которое не выражается из этих трех, то тебе будет слава и почет.
легко. например: "васе из трнтьего подьезда и еще пете"
Здравствуйте, Rumata, Вы писали:
R>Сразу просьба: не кидайте тухлыми овощами. =)
R>Пару месяцев назад задался целью узнать, что такое ООП. Максимум, что получилось — вышел на omg. Но там тоже толком ничего нет. Может быть all сможет показать мне четкую формулировку, что же такое этот самый ООП =)
тут ,как по мне, неплохое описание в разделе "Объектно-ориентированное программирование" Однако, следует делать поправку на то, что ресурс посвящен Smalltalk.
Здравствуйте, Rumata, Вы писали:
R>Пару месяцев назад задался целью узнать, что такое ООП. Максимум, что получилось — вышел на omg. Но там тоже толком ничего нет. Может быть all сможет показать мне четкую формулировку, что же такое этот самый ООП =)
Несколько не в тему. Но кто-то говорит, что ООП — это Объектно Озабоченный Программист. После рассмотра результатов некоторых пролетариев умственного труда склонен согласиться.
Здравствуйте, Rumata, Вы писали:
R>Вот например, всем известно, что бывают у объектов эл-ты public, private и protected. А почему только 3? Почему нет какого-нибудь четвертого?
Здравствуйте, Turtle.BAZON.Group, Вы писали:
TBG>Здравствуйте, Rumata, Вы писали:
R>>Вот например, всем известно, что бывают у объектов эл-ты public, private и protected. А почему только 3? Почему нет какого-нибудь четвертого?
TBG>В яве есть еще и default. Особенности реализации.