Здравствуйте, kuj, Вы писали:
kuj>Здравствуйте, DOOM, Вы писали:
G>>>2)Отсутствие интерфейсов и множественного наследования. (наследие паскаля)
DOO>>Зато были делегаты (нет необходимости в интерфейсах), виртуальные конструкторы (вроде, сам уже плохо помню) и еще много чего.
kuj>С какой радости делегаты отменяют необходимость в интерфейсах???
Подход в проектировании — дельфист делал объект, многие методы которого определял в рантайме — таким образом из одного класса получались объекты с различным поведением. С++'ник делал базовый объект + объекты-интерфейсы (соответственно абстрактные), в которых уже (статично) определялось конкретное поведение объекта. Т.е. тут однозначно делегаты удобнее и дают большую гибкость, хотя ярые C++'ники такой вариант вообще понять не могли — для них изменение поведения объекта в рантайме было чем-то из ряда вон выходящим.
Disclaimer: описанный подход C++'ника не мой. Это из моих древних споров с одногруппником в универе (он был ярый C++'ник, да и на самом деле профессионал своего дела), спор был на тему, если не ошибаюсь, а на кой ляд вообще нужно множественное наследование...
P.S. К Disclaimer'у — сам я ни с C++, ни с дельфи не имел дела уже много лет, просто этот спор разбудил древние инстинкты Это я заранее к тому, что могу что-то уже не знать в новейших достижениях ООП или банально что-то забыть.
G>>>3)Отсутствие Generic типов или шаблонов любого вида. (наследие паскаля) DOO>>Шаблон — это скорее развитый препроцессор. Препроцессор отношения к языку не имеет (что мне мешает взять и мои исходники на дельфях обработать препроцессором того же gcc?).
kuj>Ой ли?
А что нет что ли? Ноги-то откуда растут? Понятно, что со временем это обрастало фичами, появилась обратная связь с компилятором и т.п. Но идея абсолютно "макросной" природы — готов поспорить, что изначально это и реализовывалось исключительно препроцессором.
Здравствуйте, DOOM, Вы писали:
W>>>Какие проблемы и как делать инкремент\декремент без объявления типа указателя (фактически задавая размер памяти, адресуемой указателем)? W>>>В Delphi нет пост/прекрементов, но это не напрягает и имхо это вообще наследие архитектуры PDP-11, где пост/прекременты поддерживались на уровне системы команд процессора.
kuj>>
kuj>>int x = 3;
kuj>>x += x++;
kuj>>
kuj>>Вопрос: чему равен x?
DOO>Ой, сейчас разойдусь... Perl cо своим криптосинтаксисом тут всех уделает
Я о том, что пост и пре инкременты и декременты к сожалению в ряде случаев понижают читабельность кода.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, kuj, Вы писали:
kuj>>
kuj>>int x = 3;
kuj>>x += x++;
kuj>>
kuj>>Вопрос: чему равен x?
G>И часто такой код в проектах видели?
Не часто. Точнее совсем не видел. К счастью, не доводится работать с кодом индусов...
G>Вообще-то никто не сомневается что C++ занимает первое место по чису Undefined behavior, но разве кто-то заставляет так писать?
G>Раньше это было как раз актуальней, т.к. существовал большой парк мэйнфреймов со своими ОС, более разнообразных рабочих станция (не только под Юниксами), на писюках попадались другие системы, например, OS/2. По-моему, это сейчас проблема переносимости не так остра. Прежле всего, разнообразие систем уменьшилось, + какая-никакая стандартизация со временем принесла плоды.
Вот скажи мне как программист программисту: какая процессорная архитектура и операционная система нынче самые распространённые. После ответов на эти вопросы ты определённо пересмотришь своё мнение.
Здравствуйте, DOOM, Вы писали:
G>>>>2)Отсутствие интерфейсов и множественного наследования. (наследие паскаля)
DOO>>>Зато были делегаты (нет необходимости в интерфейсах), виртуальные конструкторы (вроде, сам уже плохо помню) и еще много чего.
kuj>>С какой радости делегаты отменяют необходимость в интерфейсах???
DOO>Подход в проектировании — дельфист делал объект, многие методы которого определял в рантайме — таким образом из одного класса получались объекты с различным поведением. С++'ник делал базовый объект + объекты-интерфейсы (соответственно абстрактные), в которых уже (статично) определялось конкретное поведение объекта. Т.е. тут однозначно делегаты удобнее и дают большую гибкость, хотя ярые C++'ники такой вариант вообще понять не могли — для них изменение поведения объекта в рантайме было чем-то из ряда вон выходящим.
Э-э, батенька, ты явно путаешься в понятиях.
Во-первых, делегаты прекрасно реализуются в C++ в виде указателей на функцию.
Во-вторых, интерфейсы нужны для понижения взаимозависимостей от фактической реализации.
Благодаря DI мой ClassA зависит только от IInterfaceB, который реализуется классами ClassB1, ClassB2 и ClassB3. В любой момент времени я могу открыть конфигурацию IoC и сменить байндинг с ClassB1, например, на ClassB2, совсем не затрагивая при этом ClassA. Да, в Delphi и C++ для этого используется паттерн фабрика, НО появляется зависимость ClassA, от фабрики! Вот такие пироги с капустой...
Ну конечно и плюшки типа interceptors благодаря IoC/DI контейнеру конечно тоже имеют большое значение в ряде случаев.
DOO>Disclaimer: описанный подход C++'ника не мой. Это из моих древних споров с одногруппником в универе (он был ярый C++'ник, да и на самом деле профессионал своего дела), спор был на тему, если не ошибаюсь, а на кой ляд вообще нужно множественное наследование...
В .Net от множественного наследования сразу отказались.
G>>>>3)Отсутствие Generic типов или шаблонов любого вида. (наследие паскаля) DOO>>>Шаблон — это скорее развитый препроцессор. Препроцессор отношения к языку не имеет (что мне мешает взять и мои исходники на дельфях обработать препроцессором того же gcc?). kuj>>Ой ли? DOO>А что нет что ли? Ноги-то откуда растут? Понятно, что со временем это обрастало фичами, появилась обратная связь с компилятором и т.п. Но идея абсолютно "макросной" природы — готов поспорить, что изначально это и реализовывалось исключительно препроцессором.
Ну почитай про то, как реализованы generics в .Net Узнаешь много нового
Здравствуйте, DOOM, Вы писали:
DOO>Здравствуйте, gandjustas, Вы писали:
G>>Короче := и = — исключительно дело вкуса.
DOO>А если еще учесть, что за 10 лет школы человек привыкает, что "=" означает сравнение, то для оператора присваивания ему логично увидеть новое обозначение,
Всегда в школе считал, что "=" это равно, а значение присвоить или сравнение имеет исключительно в зависимости от контекста. При чем в львином ряде случаев = означает таки присвоить.
x+1 = y
y = 5
-----
x = 4
Угу?
DOO>а для сравнения оставить прежнее
Мне нужно нажать только =, в то время как тебе в Delphi — зажать shift, нажать 6, отжать shift, нажать = и это для, пожалуй, наиболее используемого оператора...
Здравствуйте, iiice, Вы писали:
I> I>Вот скажи мне как программист программисту: какая процессорная архитектура и операционная система нынче самые распространённые. После ответов на эти вопросы ты определённо пересмотришь своё мнение.
Если говорить абстрактно, то не знаю, ибо есть мобилы, интеллектуальные пылесосы и крылатые ракеты. Лично на моем огороде все пожрал жук писюк.
Здравствуйте, DOOM, Вы писали:
DOO>← — присвоение
См. например Haskell Вполне себе поддерживает Unicode символы в исходном коде в таком качестве. Более того — деструктивное присваивание суть ересь и ее использование должно быть ограничено минимумом. Так что <- или ← — в самый раз. А := лишено смысловой нагрузки.
Здравствуйте, DOOM, Вы писали:
DOO>Я думаю, тут куча народу бы стала спорить — кто там и для каких скриптов хорош (по-любому, нашлись бы противники питоновской фичи по смешиванию оформления кода и задания границ синтаксических конструкций) DOO>Можно ведь сказать, что "Delphi — объективно хороший язык/IDE для создания настольных приложений" Вот только ни фига это не будет объективно
Споров про плохость и хорошесть я и пытаюсь избежать. Объективных высказываний тоже .
DOO>>>Во-вторых, одного взгляда на C++ должно хватать, чтобы понимать какими агли хаками шел переход от C до C++ (есть где-то в недрах gcc C++ препроцессор — т.е. преобразование программы на C++ в программу на C — все конструкции С++ раскрываются как макросы).
G>>Язык и реализация его компилятора — разные вещи. DOO>Бесспорно, просто это демонстрация — C++ разрабатывался именно, как надстройка над C, который, по-любому, когда-то был не более, чем набор удачных макросов для какого-нибудь ассемблера (вон я в универе делал из NASM'а эдакий Basic ). Вот все это и тянется в финальном языке.
Да вроде как С++ придумывался как отдельный язык по подходу. Видимо синтаксис C хорошо ложится на большинство программистских мозгов, вот и был взят. На той же Java и C# С и С++ тоже повалялись.
... DOO>Ну сколько процентов программистов 10 лет назад в России писали программы для мэйнфреймов? Еще лучше вопрос — сколько мэйнфреймов было в России 10 лет назад
Сей ужас был в основном пораньше, > 10 лет назад. Из-за этого, в частности, многие вещи, совершенно не вычислительные, когда-то даже писали на FORTRAN IV, это был едва ли не единственный общий знаменатель. Потом им стал С. Сужу по своим давним похождениям в нескольких конторах. Временами мне приходилось писать одновременно под 3 платформы, а я не столь уж древен. А под 2 так можно сказать часто: на писюке отлаживаешь алгоритмы (удобная IDE), а потом на Юниксе уже "внедряешь".
Здравствуйте, gandjustas, Вы писали:
H>>Видимо. И не только мне. На форумах обсуждалось неоднократно с последующими советами понавставлять по коду GC.Collect G>Мда... Перечитайте лучше форумы.
Мне-то это зачем? У меня таких проблем нет и небыло никогда...
G>>>А как еще можно было сделать динамические строки и массивы, но не нагружать программиста вызовами Free? H>>Ну так это же плюс. Чего ты его охаял? G>Это не плюс, это необходимость. Плюс был бы если бы можно было врубать GC для всех объектов.
Для тебя это плюс? Для меня нет. Ну и? У кого больше?
H>>Под Delphi я и имел ввиду компилятор (а что же еще-то может за этим следить...). G>В .NET следит рантайм.
Мы не о .Net тут говорим, если я не ошибаюсь.
H>>Семантика для работы с интерфейсными классами и с обычными может быть одинаковой (см. TComponent). Но все это тонкости дающие большую гибкость. И необъяснимые глюки это может вызвать только там, где программист работает сам незная с чем (или не до конца понимая механизм). G>В C# люди работают, не зная с чем, и баги не возникают почему-то.
уморил.
H>>2005/6 имеют Code Templates. Штука очень приятная и расширяемая. G>Мда... в 2005 году уже студия 2005 есть.
Ты сравнивай тогда первую версию Delphi...
Придирки, и не более того. G>Я ловил сотни ошибоки из-затого что люди забывали/не_знали_что_надо вызывать Free. В Управляемых средах вообще таких проблем нет. Придирки вполе по делу. Вы просто не понимаете, потому что не работали с этим.
Если люди чего-то там не знали/забывали, это характеризует только их, но не инструмент. Если выражаться простым языком: не можешь срать -- не мучай жопу. В управляемых средах, таки, есть место ручной очистке (пусть даже семантически скрываемой) для объектов владеющих ресурсами. Что начнется, когда человек, который работает не зная с чем (с твоих же слов), будет следовать навязываемой идеологии...
H>>Какая разница кто-кого догоняет или откуда заимствуются те или иные фичи? Ты тут о минусах говорил, я же тебе на плюсы указываю. G>Эти плюсы не перекрывают минусы. А в других языках и платформах минусов поменьше.
В других платформах есть тормоза неизвестно откуда появляющиеся, но теория их существование отрицает
G>Мда... Посмотри функционал iostream в C++, TextWriter в .NET (в Java есть аналогичные классы) — побогаче будет. G>Типы text, file of ... — вообще ужас. Поганейшее наследие паскаля. G>Если вы не знаете других способов, то это на значит что delphi в чем-то удобен.
Дава,й в конкретику ударяйся уже. Демагогия запарила.
H>>В нативной 2006 точно есть. Может и в 2005 было, я не помню. G>Смешно даже. STL для C++ сущесвует гораздо раньше, в .NET изначально было (c 2001 года), в Java еще раньше. G>Delphi тут сильно отстает.
Мы тут, что С++ обсуждаем или Java? Ты сказал, что в Delphi чего-то нет. Я тебе говорю, что есть (может оно и в семерке уже было, я не помню).
Здравствуйте, kuj, Вы писали:
kuj>Всегда в школе считал, что "=" это равно, а значение присвоить или сравнение имеет исключительно в зависимости от контекста. При чем в львином ряде случаев = означает таки присвоить.
Кстати в SQL = означает как присваивание, так и сравнение. Так что спор ни о чем. Чисто дело вкуса.
Здравствуйте, goto, Вы писали:
G>>>И шо? И у Дельфи есть ниша.
kuj>>Была. Уже нету. Занята .Net
G>И хорошо, по-моему . Только образование обладает инетрностью, продолжают учить Дельфям. Масштабов и соотношений не знаю.
Это так к сожалению. Вообще любой программист в первую очередь должен уметь самообучаться. Преподаватели в ВУЗах редко когда имеют высокую квалификацию. Те, кто кроме преподавания занимаются еще и практическими вопросами на другом месте работы — редкость. Вот и учат по конспекту лекций, составленному хез в какие годы.
Базу конечно дадут, но без самообучения далеко с ней не уедешь.
Здравствуйте, gandjustas, Вы писали:
kuj>>Всегда в школе считал, что "=" это равно, а значение присвоить или сравнение имеет исключительно в зависимости от контекста. При чем в львином ряде случаев = означает таки присвоить. G>Кстати в SQL = означает как присваивание, так и сравнение. Так что спор ни о чем. Чисто дело вкуса.
А в PL/SQL присваивание — оператор :=
Сам по себе SQL имеет очень строгий синтаксис. Например, UPDATE table SET column = value — SET явно указывает, что в данном контексте = оператор присваивания, а в SELECT * FROM table WHERE column = value — WHERE явно указывает, что в данном контексте = оператор сравнения.
Здравствуйте, kuj, Вы писали:
H>>Видимо. И не только мне. На форумах обсуждалось неоднократно с последующими советами понавставлять по коду GC.Collect
kuj>Ссылки в студию.
Я их не коллекционирую. На хоботе было обсуждение написанного прокси у которого именно фризы и лезли после долгостояния Тут тоже где-то в веб-программировании было нечто подобное.
H>>Это с возвратом созданного объекта чтоль? Ну и в чем проблема? Вот GetMem/VirtualAlloc тоже сырую память отдают и ее возвращать нужно. Не смущает? На самом деле ни какой проблемы в этом нет, объекты, как правило создаются для хранения в каких-либо коллекциях/списках и прочих. И уж точно нет ни какого напряга дернуть Free. Придирки, и не более того.
kuj>Ты забываешь о человеческом факторе.
Человеческий фактор отмазка хорошая Кто-то заставляет работать с такими представителями рода человеческого? Delphi 2006 благодаря новому менеджеру памяти исправно сигналит обо всех утечках.
H>>Уж не про LINQ ли ты говоришь Ну в 2008 или 2009 обещают анонимные методы добавить еще.
kuj>Lambda, linq, implicitly typed variables (я, правда, несколько негативно к идеи применения var отношусь, но это тема для отдельного разговора), extension methods, annonymous types, auto properties, type inference, object и collection initializers...
И правда, тут об этом не стоит О Delphi таки говорим.
H>>>>Списки (различные), стеки, очереди, бит-контейнеры, ассоциативные массивы. Мало? G>>>Это оно когда появилось? Случаем не в Delphi.NET ? H>>В нативной 2006 точно есть. Может и в 2005 было, я не помню. kuj>Только без generic`ов ОЙ как плохо.
Не сильно, если честно Для Delphi 2006 есть неофициальный тул (по сути препроцессор) который реализует много чего: и дженерики, и case по строкам, и exit с возвратом результата. В общем кому нужно -- тот найдет.
Здравствуйте, kuj, Вы писали:
H>>И неконтролируемая... Из-за которой, порой, возникают прелесные фризы на ровном месте.
kuj>Не может быть никаких фризов. Сборщик муссора ведь не в главном потоке приложения выполняется.
Суслика видишь? Нет. А он есть (c) ДМБ. А сборщику не нужно лочить кучу, чтоб дефрагментацию делать? А процы уже у всех поголовно двух/четырех головые?
H>>Да ты что? Управляемая (читай контролируемая) сборка мусора это недостаток?
kuj>В общем случае это таки недостаток. Особенно, когда нет в наличии generic smart pointer`ов (прерогатива C++).
Так в чем недостаток-то?
kuj>Без полноценного DI в Delphi толку от интерфейсов куда как меньше.
Чего-то не улавливаю связи...
G>>>3)Отсутствие Generic типов или шаблонов любого вида. (наследие паскаля)
H>>Дженерики есть в 2007 под .Net.
kuj>Думаю тут речь не шла о .NET Delphi. Иначе спор деградировал бы до: какой язык — Delphi.Net или X лучше.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, hattab, Вы писали:
K>>>6. Несовместимость разных версий IDE
H>>А зачем мне совместимость IDE? Чего там совмещать?
L>Видимо имелось в виду то, что формат dfm-а время от времени перестает пониматься более новой версией IDE.
Если мне не изменяет память, это было один раз при смене формата .dfm. Так и то, в поставку была включена утиль для конвертирования.