Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Когда ООП не ООП


Автор: DENNN 2.3.2006, 11:49
Попалась в сети маленькая статья. Думаю кому-то будет интересно:
http://www.itk.ru/article/oo_paul.shtml

Автор: setq 2.3.2006, 13:12
Интересно посмотреть на этот CLU

Автор: Exception 2.3.2006, 15:15
Несогласен со многими утверждениями. Тем более, статья устарела.

Автор: LSD 2.3.2006, 15:20
Цитата(Exception @ 2.3.2006, 15:15 Найти цитируемый пост)
Тем более, статья устарела.

Потому что .NET не рассматривается? smile

Автор: DENNN 2.3.2006, 15:32
Цитата(Exception @ 2.3.2006, 15:15 Найти цитируемый пост)
Несогласен со многими утверждениями. Тем более, статья устарела.

поподробнее пожалуйста smile. Меня например многие помеченные особенности зацепили.

Автор: Exception 2.3.2006, 16:30
LSD smile
Для начала, в Яве уже есть дженерики aka параметризованные типы aka шаблоны. Потом я совершенно не вкурил, что там аффтар писал про "сохранение доступности" и необходимость использования public-членов в Яве. Затем, меня удивило, что "в новых версиях С++ появились шаблоны...". Я думал, они были еще давным-давно smile . Потом еще уж слишком мягко сказано о поддержке исключений в С++. Они чрезвычайно неформализованны. К примеру, одни функции стандартной библиотеки кидают исключение, другие возвращают -1, WinAPI вообще Бог знает что возвращает. В Java/.NET это куда более формализовано. Затем, удивила фраза "типы "первого" сорта нельзя описать средствами языка (это относится и к С++)". Покажите мне язык, где самому можно написать int.

Автор: LSD 2.3.2006, 17:04
Цитата(Exception @ 2.3.2006, 16:30 Найти цитируемый пост)
Для начала, в Яве уже есть дженерики aka параметризованные типы aka шаблоны.

Генерики, это не шаблоны.


Цитата(Exception @ 2.3.2006, 16:30 Найти цитируемый пост)
Потом я совершенно не вкурил, что там аффтар писал про "сохранение доступности" и необходимость использования public-членов в Яве.

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

Такими ограничениями являются: отказ от средств определения классов, отказ от статического контроля типов, поддержка во время выполнения контроля типов и классов памяти объектов, изменение структуры программы c "классово-ориентированной" на "модульно-ориентированную".

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

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

Ну просто один в один Windows Scripting.


Цитата(Exception @ 2.3.2006, 16:30 Найти цитируемый пост)
Покажите мне язык, где самому можно написать int.

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

Автор: Exception 2.3.2006, 17:42
Хм. А чем дженерики отличаются от шаблонов в Сцы++?

Автор: LSD 2.3.2006, 17:49
Цитата(Exception @ 2.3.2006, 17:42 Найти цитируемый пост)
Хм. А чем дженерики отличаются от шаблонов в Сцы++?

Не порождают дополнительный код, это только опция языка. Что-то типа autoinboxing, чуть удобней писать код, но ничего принципиально нового нет. Код с генериками запросто можно скомпилировать для выполнения в JVM версий младше 1.5.

Автор: Exception 2.3.2006, 18:06
[offtop]
Ладно, другой вопрос smile
Чем дженерики в Java отличаются от дженериков в .NET?
Цитата(LSD @ 2.3.2006, 18:49 Найти цитируемый пост)
Код с генериками запросто можно скомпилировать для выполнения в JVM версий младше 1.5.

Как это smile
[/offtop]

Автор: LSD 2.3.2006, 18:36
Цитата(Exception @ 2.3.2006, 18:06 Найти цитируемый пост)
Чем дженерики в Java отличаются от дженериков в .NET?

Я не знаком с генериками в .NET.

Цитата(Exception @ 2.3.2006, 18:06 Найти цитируемый пост)
Как это

Борландовский компилятор это умеет. Там нет ничего такого, что требавало бы поддержки со стороны JVM.

Автор: Void 2.3.2006, 19:34
Цитата(LSD @ 2.3.2006, 20:36 Найти цитируемый пост)
Чем дженерики в Java отличаются от дженериков в .NET?

В Java, как сказал LSD, это не более чем синтаксический сахар. В .NET дженерики напрямую поддерживаются рантаймом, и JIT создает для value-типов более эффективные специализации — без boxing/unboxing.
Цитата(Exception @ 2.3.2006, 18:30 Найти цитируемый пост)
К примеру, одни функции стандартной библиотеки кидают исключение, другие возвращают -1, WinAPI вообще Бог знает что возвращает. В Java/.NET это куда более формализовано.

Хм... «Формализовано» — это, пожалуй, не совсем удачный термин в данном контексте. Никакого математического формализма за повсеместным применением исключений в Java/.NET не стоит. Просто их фреймворки навязали стиль “exceptions everywhere”, и им предпочитают пользоваться, хотя «индусам» от программирования это не помеха. Что до C++, то как раз в стандартной библиотеке используются только исключения.

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

Автор: chipset 2.3.2006, 21:24
Цитата(Exception @ 2.3.2006, 06:30 Найти цитируемый пост)
WinAPI вообще Бог знает что возвращает. В Java/.NET это куда более формализовано.

А ну, попробуй обратиться к Win32Api функциям из C#? Неужто тоже выбрасывают исключения? :O
Задолбало уже ассоциирование С++ c MFC или, того хуже, Win32Api. C++ это STL и Boost.

А теперь критика статьи.
Цитата

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

Я так полагаю аффтар немного недоучил C++. Если выделять C++ методы в .cpp файл то не надо никакой перекомпиляции.
Цитата
1.1.3. Язык CLU

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


Если вы такие умные то почему вы такие бедные? Я про этот CLU в первый раз вообще слышу, судя по тому что статья старая, он так и остался "идеальным" языком.
Цитата

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

Аффтар не читал никогда Александреску.

---
Со всем остальным я согласен.

Автор: Void 2.3.2006, 21:39
Цитата(chipset @ 2.3.2006, 23:24 Найти цитируемый пост)
Я так полагаю аффтар немного недоучил C++. Если выделять C++ методы в .cpp файл то не надо никакой перекомпиляции.

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

Цитата(chipset @ 2.3.2006, 23:24 Найти цитируемый пост)
Со всем остальным я согласен.

И с трехуровневой моделью тоже? По мне так это overkill во многих случаях.

Автор: maxim1000 2.3.2006, 23:54
Цитата(chipset @ 2.3.2006, 20:24 Найти цитируемый пост)
Я так полагаю аффтар немного недоучил C++. Если выделять C++ методы в .cpp файл то не надо никакой перекомпиляции.

Цитата(Void @ 2.3.2006, 20:39 Найти цитируемый пост)
Я так полагаю, речь идет об изменении сигнатур private-методов. Тогда от перекомпиляции уже не отвертишься, хотя по идее это не меняет контракт класса, и клиентам должно быть все равно.

да, частенько это неприятно, прчина простая - чтобы выделить объект в стеке надо знать его размер

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

в том-то я приятность C++ - в нем много чего не встроено (как элемент языка), но это можно сделать
Добавлено @ 23:55
ну или privat-часть выделить в отдельный объект, а в основном оставить на нее указатель, это уж кому как нравится...

Автор: tishaishii 5.3.2006, 14:00
http://www.softcraft.ru

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)