Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 213 214 [215] 216 217 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3211
,
|
|
|
|
|
Сообщ.
#3212
,
|
|
|
|
Цитата Qraizer @ вот нужен ли тебе в качестве удобной обёртки вокруг простой CRITICAL_SECTION аж полиморфный guard с RTTI и метаклассом, создающийся и разрушающийся не одной сотней инструкций и лежащий в хипе? Это при том, что EnterCriticalSection() и LeaveCriticalSection() укладываются от силы в пару десятков, когда нет конкуренции. 1. RTTI можно отключить 2. метакласс один на все экземпляры 3. а тебе не по барабану, сколько он создаётся/разрушается? время жизни CS = времени жизни защищаемого ресурса и в большинстве случаев создаётся при старте приложения и уничтожается при завершении 4. ну расположи его не в хипе, какие проблемы то? 5. и какая связь между созданием/разрушением класса и входом/выходом из CS? |
|
Сообщ.
#3213
,
|
|
|
|
Она полностью достаточна и даже больше. Птолемеева система тоже более развита, сколько колец там было на тело? Птолемей сделал два - одно вокруг Земли, и по нему второе, уже с телом. Но говорят, перед Коперником уже до семи доходило. Вот оно, развитие.
Цитата DesweR @ Нужен. Только его не будет в объектном коде.А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса? ![]() ![]() class CT { CRITICAL_SECTION& ct; public: CT(CRITICAL_SECTION& src): ct(src) { EnterCriticalSection(&ct); } ~CT() { LeaveCriticalSection(&ct); } }; CRITICAL_SECTION ct; int main() { CT guard(ct); } ![]() ![]() _TEXT SEGMENT _main PROC ; COMDAT ; Line 16 push OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A ; ct call DWORD PTR __imp__EnterCriticalSection@4 ; Line 17 push OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A ; ct call DWORD PTR __imp__LeaveCriticalSection@4 xor eax, eax ret 0 _main ENDP _TEXT ENDS ![]() ![]() _guard$ = -4 ; size = 4 _main PROC ; File d:\disk_f\work\q\q1.cpp ; Line 15 push ebp mov ebp, esp push ecx ; Line 16 push OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A ; ct lea ecx, DWORD PTR _guard$[ebp] call ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z ; CT::CT ; Line 17 lea ecx, DWORD PTR _guard$[ebp] call ??1CT@@QAE@XZ ; CT::~CT xor eax, eax mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS EXTRN __imp__EnterCriticalSection@4:PROC ; Function compile flags: /Odtp ; COMDAT ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z _TEXT SEGMENT _this$ = -4 ; size = 4 _src$ = 8 ; size = 4 ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z PROC ; CT::CT, COMDAT ; _this$ = ecx ; Line 8 push ebp mov ebp, esp push ecx mov DWORD PTR _this$[ebp], ecx mov eax, DWORD PTR _this$[ebp] mov ecx, DWORD PTR _src$[ebp] mov DWORD PTR [eax], ecx mov edx, DWORD PTR _this$[ebp] mov eax, DWORD PTR [edx] push eax call DWORD PTR __imp__EnterCriticalSection@4 mov eax, DWORD PTR _this$[ebp] mov esp, ebp pop ebp ret 4 ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z ENDP ; CT::CT _TEXT ENDS EXTRN __imp__LeaveCriticalSection@4:PROC ; Function compile flags: /Odtp ; COMDAT ??1CT@@QAE@XZ _TEXT SEGMENT _this$ = -4 ; size = 4 ??1CT@@QAE@XZ PROC ; CT::~CT, COMDAT ; _this$ = ecx ; Line 9 push ebp mov ebp, esp push ecx mov DWORD PTR _this$[ebp], ecx mov eax, DWORD PTR _this$[ebp] mov ecx, DWORD PTR [eax] push ecx call DWORD PTR __imp__LeaveCriticalSection@4 mov esp, ebp pop ebp ret 0 ??1CT@@QAE@XZ ENDP ; CT::~CT _TEXT ENDS Цитата DesweR @ Если она проще и не дороже вот такого:P.S. А реализация RAII в Delphi гораздо проще, чем тебе кажется, нужен только интерфейсный объект. ![]() ![]() struct S { /* ... */ S& operator= (const S& s) { int* ptr = new int; delete ptr1; ptr1 = ptr; *ptr1= *s.ptr1; return *this; } }; struct SS : S { /* ... */ SS& operator= (const SS& s) { S tmp; // Вообще-то по-нормальному это делается tmp = s; // конструктором копии, конечно. int* ptr = new int; delete ptr2; ptr2 = ptr; *ptr2= *s.ptr2; ptr = tmp.ptr1; // tmp.ptr1 = ptr1; // А это - перегрузкой std::swap() для S. ptr1 = ptr; // return (*this); } }; Цитата DesweR @ Суждения не из-за этого, суждения с ваших же слов. О монолитности, о неявлении себя базовым классом при наследовании, о полном контроле базовых классов производным, о вмешательстве базовых классов в дела производных итп. Сведений более чем достаточно. Сами по себе виртуальные столько воды из одного лишь суждения, что в Delphi, что ни конструктор - то обязательно с виртуальными методами, а что ни виртуальный метод - то обязательно с говнокодом |
|
Сообщ.
#3214
,
|
|
|
|
Цитата D_KEY @ scala нацелена на мультипарадигмальность, на тесную интеграцию разных подходов(не только функционального и ОО, там есть попытки реализации различных идей).Даже алгебраические типы данных сделаны через специальный механизм так называемых case-классов нет, не нацелена, на мультипарадигменность нацелен CL. и реализация алгебраических типов судя по твоем описанию похож скорее на костыль, хотя судя по описания в инете, вроде все довольны. гибкость и удобство в управлении поведением объектной системы Добавлено Цитата Shaggy @ 2. метакласс один на все экземпляры на самом деле нет, определение "классовых методов" как раз фактически описывает новый метакласс |
|
Сообщ.
#3215
,
|
|
|
|
Цитата DesweR @ Как в кривом зеркале, ей богу. С высоты полёта (над обоими языками) дельфийская модель видится более развитой. А можешь подвести краткие итоги, и рассказать, на основании чего ты сделал такой вывод? Первое что на ум пришло, даже не думая: Вам приходится вручную следить за созданием объекта и его разрушением, чуть что не так, забыл проверить в Цитата DesweR @ А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса? Впрочем это тоже проходили. Этот гард из класса, при необходимости, пишется ровно за 30 секунд закрытыми глазами. А вот представь что в делфи отсуствовали бы try/finaly, можешь привести пример кода, или класса, или еще чего, что у вас там есть, что вполне так же безопасно и легко могло бы заменить эти блоки кода? А заодно рассккажи как часто вы их юзаете? |
|
Сообщ.
#3216
,
|
|
|
|
|
Сообщ.
#3217
,
|
|
|
|
Цитата DesweR @ Как в кривом зеркале, ей богу. С высоты полёта (над обоими языками) дельфийская модель видится более сложной и запутанной. Fixed. Добавлено Не, серьзно зачем C++ с развитой системой шаблонов метаклассы? |
|
Сообщ.
#3218
,
|
|
|
|
Нет. С "высоты полета" более развитое ООП у ruby, python, scala, etc. Цитата Цитата Qraizer @ Заодно, предупреждая очередное недоумение: с RAII та же картина - либо оно им не нужно, иначе не было б столько try/finally, либо бесполезно объяснять, что это такое, реализовать сам Дельфи не даст, как я понял. Вернее, даст, но... вот нужен ли тебе в качестве удобной обёртки вокруг простой CRITICAL_SECTION аж полиморфный guard с RTTI и метаклассом, создающийся и разрушающийся не одной сотней инструкций и лежащий в хипе? Это при том, что EnterCriticalSection() и LeaveCriticalSection() укладываются от силы в пару десятков, когда нет конкуренции. Ну, да, можно не классом, а рекордом или обджектом, только тогда автоматизации тоже не будет, и опять вернёмся к try/finally. Всё это тоже проходили. А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса? Впрочем это тоже проходили.Нет никакого "легковестного" try/finally. Исключение обрабатывается не в месте возникновения и часто даже не на один уровень выше, поэтому наличие лишних блоков try/finally ради освобождения ресурсов всегда только запутывает код, не принося ничего хорошего. Механизм деструкторов или "менеджеры контекста"(with в питоне, using в C#) позволяют решать проблемы работы с ресурсами гораздо лучше, а блоки try появляются только тогда, когда они нужны - для обработки исключений. Добавлено Цитата korvin @ Цитата D_KEY @ scala нацелена на мультипарадигмальность, на тесную интеграцию разных подходов(не только функционального и ОО, там есть попытки реализации различных идей).Даже алгебраические типы данных сделаны через специальный механизм так называемых case-классов нет, не нацелена Цитата Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages http://www.scala-lang.org/ Цитата Scala is object-oriented Scala is a pure object-oriented language in the sense that every value is an object. Types and behavior of objects are described by classes and traits. Classes are extended by subclassing and a flexible mixin-based composition mechanism as a clean replacement for multiple inheritance. Scala is functional Scala is also a functional language in the sense that every function is a value. Scala provides a lightweight syntax for defining anonymous functions, it supports higher-order functions, it allows functions to be nested, and supports currying. Scala's case classes and its built-in support for pattern matching model algebraic types used in many functional programming languages. Furthermore, Scala's notion of pattern matching naturally extends to the processing of XML data with the help of right-ignoring sequence patterns. In this context, sequence comprehensions are useful for formulating queries. These features make Scala ideal for developing applications like web services Основное направление - интеграция ОО и функциональных подходов. Но если почитать документацию, то видны и другие интересные идеи. Цитата И каким образом это доказывает "ненацеленность" на это других языков?на мультипарадигменность нацелен CL. Цитата и реализация алгебраических типов судя по твоем описанию похож скорее на костыль, хотя судя по описания в инете, вроде все довольны. В чем костыль? A Tour of Scala: Case Classes ![]() ![]() abstract class Term case class Var(name: String) extends Term case class Fun(arg: String, body: Term) extends Term case class App(f: Term, v: Term) extends Term Цитата Я спросил, что это дает на практике, а ты мне все те же общие слова... гибкость и удобство в управлении поведением объектной системы |
|
Сообщ.
#3219
,
|
|
|
|
Цитата D_KEY @ ... ни в одной из приведенных тобою цитат нет ни слова о мультипарадигменности Добавлено Цитата Мяут-Настоящий @ Не, серьзно зачем C++ с развитой системой шаблонов метаклассы? выведи типы параметров шаблона, список всех экземпляров шаблона в рантайме, измени инстансы шаблона в рантайме при смене параметра шаблона Добавлено Цитата D_KEY @ В чем костыль? A Tour of Scala: Case Classes ![]() ![]() abstract class Term case class Var(name: String) extends Term case class Fun(arg: String, body: Term) extends Term case class App(f: Term, v: Term) extends Term в отсутствии абстракции и использовании классов не по назначению. не ты ли тут утверждал, что публичные поля классов -- зло? |
|
Сообщ.
#3220
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ ... ни в одной из приведенных тобою цитат нет ни слова о мультипарадигменности Иногда поиск по ключевому слову не самый лучший способ понять, о чем речь Цитата Зачем это делать в рантайме?Цитата Мяут-Настоящий @ Не, серьзно зачем C++ с развитой системой шаблонов метаклассы? выведи типы параметров шаблона, список всех экземпляров шаблона в рантайме, измени инстансы шаблона в рантайме при смене параметра шаблона Цитата Цитата D_KEY @ В чем костыль? A Tour of Scala: Case Classes ![]() ![]() abstract class Term case class Var(name: String) extends Term case class Fun(arg: String, body: Term) extends Term case class App(f: Term, v: Term) extends Term в отсутствии абстракции и использовании классов не по назначению. не ты ли тут утверждал, что публичные поля классов -- зло? А причем тут публичные поля ?"Отсутствие абстракции" - что это значит? Классы используются по назначению. Иерархия классов в таком виде мало отличается от алгебраического типа данных. Вернее, алгебраические типы данных могут быть представлены или как C-style union + теги, или же в виде иерархии классов. |
|
Сообщ.
#3221
,
|
|
|
|
Цитата D_KEY @ Я спросил, что это дает на практике, а ты мне все те же общие слова... прозрачная обобщенная реализация "особых" классов: синглтонов, классов проецирующихся на таблицы БД, классы, хранящие таблицу своих экземпляров, классы описывающие группу классов, например: класс funcallable выступает классом метаклассов "вызываемых" объектов, каждый метакласс которого описывает определенную группу классов: классы обычных функций, классы generic-функций, и т.п. грубо говоря, метакласс standard-class описывает структуру класса: список суперклассов, список слотов, список методов, список субклассов. а метакласс oo-class описывает свойства метакласса standard-class: наследование, полиморфизм, инкапсуляция. Добавлено Цитата D_KEY @ Иногда поиск по ключевому слову не самый лучший способ понять, о чем речьиногда стоит говорить по теме Добавлено Цитата D_KEY @ Зачем это делать в рантайме? что именно? с получением списка методов в рантайме С++-ники уже обломались один раз Добавлено Цитата D_KEY @ А причем тут публичные поля ?а при том, что единственный способ работать с алгебраическими типами ланных -- сопоставление с оброзцом, а для этого нужно знать структуру типа. |
|
Сообщ.
#3222
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Я спросил, что это дает на практике, а ты мне все те же общие слова... прозрачная обобщенная реализация "особых" классов: синглтонов, классов проецирующихся на таблицы БД, классы, хранящие таблицу своих экземпляров, классы описывающие группу классов, например: класс funcallable выступает классом метаклассов "вызываемых" объектов, каждый метакласс которого описывает определенную группу классов: классы обычных функций, классы generic-функций, и т.п. Не вижу, зачем здесь метаклассы. Синглитоны в той же scala описываются просто с помощью object, Active Record(например, в Ruby) чудесно справляется без метаклассов, с хранением таблицы экземпляров справится объект-синглетон(или просто static-член класса), для вызываемых объектов достаточно интерфейса или просто соглашения об использовании оператора(как в С++ или питоне). Цитата грубо говоря, метакласс standard-class описывает структуру класса: список суперклассов, список слотов, список методов, список субклассов. а метакласс oo-class описывает свойства метакласса standard-class: наследование, полиморфизм, инкапсуляция. Это круто, конечно, но есть ли какая-то в этом необходимость? |
|
Сообщ.
#3223
,
|
|
|
|
Цитата D_KEY @ "Отсутствие абстракции" - что это значит? это значит "я его слепила из того, что было", только кишками наружи выставила Добавлено Цитата D_KEY @ Классы используются по назначению. Иерархия классов в таком виде мало отличается от алгебраического типа данных. Вернее, алгебраические типы данных могут быть представлены или как C-style union + теги, или же в виде иерархии классов. только технически, но это полностью противоречит сути классов |
|
Сообщ.
#3224
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Иногда поиск по ключевому слову не самый лучший способ понять, о чем речьиногда стоит говорить по теме http://en.wikipedia.org/wiki/Scala_(programming_language) |
|
Сообщ.
#3225
,
|
|
|
|
Цитата D_KEY @ Синглитоны в той же scala описываются просто с помощью object дык потому что там нет метаклассов Добавлено Цитата D_KEY @ просто static-член класса это уже работа на уровне метакласса |