Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
Zloxa
Дата 20.5.2013, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 4
Всего: 161



Цитата(serger @ 20.5.2013,  11:02)
Akella, зачем они во view? на экран сколько строк влазит? Чел сколько строк может просмотреть за час?

Цитата(Zloxa @  20.5.2013,  10:57 Найти цитируемый пост)
Я тоже майкрософту говорил, гооврил, мол 65536 строк в экселе - за глаза достаточно.  

Хранить или выводить?

Всякие дуровы-цукерберги тоже идиоты наверно, что пытаются отказаться от бестейшей практики постраничного вывода.
Помню яндекс с этим эксперементировал.
Сомневаюсь - а не гугл ли эти упражнения начал?

Вобще в самом деле я тоже такой вопрос часто задаю бизнесс-пользователям, не помню что они мычат в ответ, но пока им не отдашь набор 100500 столбцов о 100500 строк, они, падлы, приемку не подписывают.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
serger
Дата 20.5.2013, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Zloxa, ну что могу сказать...
Видать, у нас тут, в провинции, люди не настолько продвинутые - тысячи сообщений читать подряд не успеваем...  smile 

Да и форум винградовский слабоват, однака.  smile 


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
diadiavova
Дата 20.5.2013, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Именно. Нужно или передавать как аргумент, или кастовать после вызова. В случае с dynamic это делать ненужно.

Я понял о чем ты. Ты невнимательно посмотрел мой код. Тот метод расширяет класс Object, то есть доступен для всех типов и возвращает он тот же тип, а стало быть у возвращаемого значения снова можно вызвать этот метод. А о джинерик-параметре я сказал к тому, что если понадобится выражение писать дальше, то неплохо иметь подсказки интеллисенс, для динамических типов это в принципе невозможно.
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
А ты попробуй. Гарантирую, будет не хуже "менеджера памяти" от Белтара. 

С помощью апи пространства Microsoft.VisualBasic.CompilerSevices это будут не такие уже и монстры. Все равно будет одна строка. 
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Можешь кинуть примитивный код на VB.NET с утиной типизацией, компилирующийся в .NET ранее 4-й версии? А то я язык не знаю.

Да без проблем
Код

    Sub Main()
        'Объявляем переменную типа Object. Тип можно не указывать, поскольку в этом случае по умолчанию он будет объявлен как Object
        Dim testobject
        ' Инициируем переменную строкой, над которой начнем эксперименты
        testobject = "Hello "
        testobject += "Anthary"
        Console.WriteLine("Конкатенация строк с помощью оператора +=")
        Console.WriteLine(testobject)
        testobject = testobject.Replace("Anthary", "World")
        Console.WriteLine("Замена слова в строке с помощью метода String.Replace")
        Console.WriteLine(testobject)
        Console.WriteLine("Передаем тестируемому объекту число 4")
        testobject = 4
        Console.WriteLine("Прибавляем 5")
        Console.WriteLine(testobject + 5)
        Console.WriteLine("Присваиваем объект DirectoryInfo")
        testobject = New System.IO.DirectoryInfo("c://")
        Console.WriteLine("Каталог C://. Папок {0}, каталогов {1}", testobject.GetDirectories().Length, testobject.GetFiles().Length)
        Console.WriteLine("Создаем объект ActiveX")
        testobject = CreateObject("Scripting.FileSystemObject")
        Dim cfolder = testobject.GetFolder("C://")
        Console.WriteLine("Каталог C://. Папок {0}, каталогов {1}", cfolder.SubFolders.Count, cfolder.Files.Count)
        Console.ReadKey()
    End Sub


Вот как это выглядит в декомпилированном на C# виде
Код

[STAThread]
public static void Main()
{
    object testobject = "Hello ";
    testobject = Operators.AddObject(testobject, "Anthary");
    Console.WriteLine("Конкатенация строк с помощью оператора +=");
    Console.WriteLine(RuntimeHelpers.GetObjectValue(testobject));
    testobject = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(testobject, null, "Replace", new object[]
    {
        "Anthary",
        "World"
    }, null, null, null));
    Console.WriteLine("Замена слова в строке с помощью метода String.Replace");
    Console.WriteLine(RuntimeHelpers.GetObjectValue(testobject));
    Console.WriteLine("Передаем тестируемому объекту число 4");
    testobject = 4;
    Console.WriteLine("Прибавляем 5");
    Console.WriteLine(Operators.AddObject(testobject, 5));
    Console.WriteLine("Присваиваем объект DirectoryInfo");
    testobject = new DirectoryInfo("c://");
    Console.WriteLine("Каталог C://. Папок {0}, каталогов {1}", RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(testobject, null, "GetDirectories", new object[0], null, null, null), null, "Length", new object[0], null, null, null)), RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(testobject, null, "GetFiles", new object[0], null, null, null), null, "Length", new object[0], null, null, null)));
    Console.WriteLine("Создаем объект ActiveX");
    testobject = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("Scripting.FileSystemObject", ""));
    object cfolder = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(testobject, null, "GetFolder", new object[]
    {
        "C://"
    }, null, null, null));
    Console.WriteLine("Каталог C://. Папок {0}, каталогов {1}", RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(cfolder, null, "SubFolders", new object[0], null, null, null), null, "Count", new object[0], null, null, null)), RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(cfolder, null, "Files", new object[0], null, null, null), null, "Count", new object[0], null, null, null)));
    Console.ReadKey();
}



Вот что  выдает этот код
Код

Конкатенация строк с помощью оператора +=
Hello Anthary
Замена слова в строке с помощью метода String.Replace
Hello World
Передаем тестируемому объекту число 4
Прибавляем 5
9
Присваиваем объект DirectoryInfo
Каталог C://. Папок 14, каталогов 5
Создаем объект ActiveX
Каталог C://. Папок 14, каталогов 5


Проект прилагаю, работает под 2-ым фреймворком. Архив в аттаче.


Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Как будешь реализовывать выбор лучшей перегрузки метода?

У метода GetMethod, ЕМНИП, 4 перегрузки. Там есть и такие, где можно передать собственный биндер. Изучи внимательнее.
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
И вопрос на засыпку: ты сможешь добиться быстродействия, сопоставимого с динамическими вызовами? А то Reflection на несколько порядков (!) медленнее, чем CallSite.

Не знаю, не пробовал. Если тебе не влом протести сам. Но в любом случае, ты сильно преувеличиваешь критичность производительности и сложного биндинга перегрузок в таких сценариях. Я сколько пользуюсь поздним связыванием и могу сказать, что наиболее часто оно нужно для работы с ком объектами, например, из того же веббраузера можно вытащить ком-объекты и получить полных доступ к возможностям DOM, там нет никаких джинериков и прочего и там вполне сработает тот метод, который я привел, равно как и в подавляющем большинстве реальных примеров использования позднего связывания.
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Попробуй написать Enumerable.Join без использования генераторов. (Я писал. На PHP. Вспоминать страшно.)

Генератор можно реализовать в виде объекта. Кстати я встречал библиотеку на яваскрипте, реализующую линк, в описании было сказано, что там используются ленивые вычисления(как в дотнете). Что меня удивило, так это то, что библиотека весила 26 кб что ли. Так что кода там совсем немного. Но дело совсем не в этом. Итераторы в языке для работы линка не нужны. В шарпе они появились 8 лет назад и тот факт, что не смотря на это ты в принципе на можешь объяснить для чего они нужны (я уже не говорю о том, на сколько порядков они могут увеличить эффектвность Злохи), сам по себе говорит о том, насколько эта фича востребована, по крайней мере в твоей практике.

Ну и каков итог в плане того, кто и как объясняет фичи.
Я привел тебе достаточно монструозный код с использованием Enumerable, показал, как конвейер делает с подобными вещами то же, что делает линк и далее на более простом числовом примере показал, что это работает для любых функций. Тебе этот пример показался недостаточно наглядным. 
Ты, в свою очередь, продемонстрировал какими должны быть наглядные примеры, на примере аргументов против дельфы. Из четырех пунктов мы получили следующее:
1. Необходимость в динамических типах ты обосновал возможностью позднего связывания. Отрадно, конечно, что в шарпе, наконец-то, спустя восемь лет после появления языка на свет, появилось позднее связывание, но хвалиться этим тоже надо смотреть перед кем, поскольку в дельфах, насколько я понял из этого топика, позднее связывание есть и динамические типы для этого не нужны.
2. Необходимость в генераторах, которые ты представил как архиважную фичу, ты не смог обосновать более убедительно, чем привести в пример другую фичу, где они были использованы. Особенно интересно здесь то, что итераторы появились в шарпе в 2005, линк и в шарпе и в бейсике - в 2008, а итераторы в бейсике - в 2012. Как-то не очень похоже, что это вообще как-то связано. 
3. Решарпер может и имеет кучу полезностей, но это все-таки внешний инструмент, каковые есть и у дельфы, да и пользуются им не все.
4. Использование кода на других языках, в том числе скриптовых, возможно и там, как реализовано - не знаю, но подозреваю, что вполне юзабельно.
 Как-то неубедительно smile 
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Рекурсию желательно объяснять на том, где она нужна.

Если человек знает что это, то конечно.
Цитата(Athari @  20.5.2013,  03:38 Найти цитируемый пост)
Да числа Фибоначчи в конце концов (и хрен с ней с производительностью).

Ты о вычислении "наивным" способом? На 40-м члене функция будет вызвана более триллиона раз. Ниче так да? smile 

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  LateBinding.rar 47,62 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Athari
Дата 20.5.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Akella

Цитата
Я думаю, что как-то можно. Ведь с объектами MS Office работают ведь из Delphi. Только свой объект зачем передавать в скрипт? Что скрипт будет делать с моим самопальным классом? Или что имеется ввиду?

Скрипт может запрашивать у игры информацию о юнитах, зданиях и других объектах; вызывать на них какие-то методы, передавать данные об изменениях в интерфейсе и т.д. и т.п. В общем, нужно полноценное взаимодействие.


Всё не так просто:

Plugins and host created using different development platforms can communicate seamlessly using custom interfaces you can define, and Hydra's IDE integration in Delphi and Visual Studio lets you seamlessly port these interface definitions between the two platforms.

You can define your custom interfaces in Delphi code, and let Hydra's toolchain parse the code to generate the necessary interface definitions in C#, VB, Oxygene or any other .NET language. Or you can define your interfaces in .NET and let Hydra import them into your Delphi project.


Взаимодействие сводится к "плагинам" и "хосту", которые общаются через создаваемые вручную, а потом генерируемые зеркальные интерфейсы. Нельзя просто взять и вызвать что-то, нужно городить кучу кода для каждого чиха, а потом перегенеривать часть кода. И это удовольствие ещё за $500.

В дотнете ты бесплатно можешь положить в один солюшен проекты на разных языках и просто использовать их, как будто они написаны на одном языке.


Ага. Прямо на главной странице: "Как раз сейчас производится подготовка к очередной большой доработке проекта (в т.ч. поддержка Unicode, Delphi >= 2009)." Если пользуешься средой пятилетней давности и никогда не локализуешь приложения -- да, зашибись. А если нет? smile 

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

Цитата
этот энертпрайз, который ты называешь "г#вно", прекрасный и прибыльный сектор

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

Цитата
Это не овноклассники, в организации поменьше народу, однозначно, и запрос тоже поменьше, значительно.

Значит, и сервер не на 256 ГБ оперативы. То есть свалится из-за фрагментации памяти всё равно.

@serger

Цитата
... Я вот одно не понимаю, зачем в таблицу вытаскивать миллион строк?!

Дык если контрол поддерживает такое извращение, то можно же просто его влепить при отключенном мозге и радоваться жизни, пока конечные юзеры чертыхаются и матерятся, пытаясь понять, как пользоваться этим непотребством. Идиллия г#внокодерства. smile 

@diadiavova

Цитата
Я понял о чем ты. Ты невнимательно посмотрел мой код. Тот метод расширяет класс Object, то есть доступен для всех типов и возвращает он тот же тип, а стало быть у возвращаемого значения снова можно вызвать этот метод.

Мне не нужен вызов, в моём изначальном примере возвращалось число.

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

Если динамически вызывать методы прямо из определяющего их класса, то решарпер проверяет вызовы. (Это может звучить странно, но через dynamic красиво реализуются шаблон Visitor, мульти-методы и другое.)

Цитата
Вот как это выглядит в декомпилированном на C# виде

В итоге testobject = testobject.Replace("Anthary", "World") превращается в монстра:
Код

    testobject = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(testobject, null, "Replace", new object[]
    {
        "Anthary",
        "World"
    }, null, null, null));

Что, собственно, и требовалось доказать.

Цитата
У метода GetMethod, ЕМНИП, 4 перегрузки. Там есть и такие, где можно передать собственный биндер. Изучи внимательнее.

Биндер для шарпа есть? Потому что, если его нет, ты его на коленке не напишешь.

Я знаю, что есть биндеры для шарпа и басика, которые работают с CallSite. Наверное, если бы был биндер для шарпа в отражениях, его не реализовывали бы по новой?

Да и вообще, мы говорим о дельфи. Дельфовая RTTI и рядом не стояла с дотнетовыми отражениями, ЕМНИП.

Цитата
насколько я понял из этого топика, позднее связывание есть и динамические типы для этого не нужны

Неправильно понял. Для дельфи есть минимальный proof-of-concept на Variant. Скрипты как через dynamic вызывать не выйдет.

Цитата
Решарпер может и имеет кучу полезностей, но это все-таки внешний инструмент, каковые есть и у дельфы, да и пользуются им не все.

Для дельфи нет сравнимых аналогов. Отсутствие решарпера удорожает разработку софта, поэтому не ставить его -- глупо.

Цитата
Использование кода на других языках, в том числе скриптовых, возможно и там, как реализовано - не знаю, но подозреваю, что вполне юзабельно.

Неправильно подозреваешь. Вон, в топике уже сколько ссылок всплыло: или работающее только под старую анси дельфи, или требующее кучу дополнительного кода и с перезапуском генератора кода после каждого изменения, причём за 500 баксов, или голые биндинги к страшному и ужасному API... Нет ничего сопоставимого.

Цитата
Ты о вычислении "наивным" способом? На 40-м члене функция будет вызвана более триллиона раз. Ниче так да?

Мы ж демонстрацией занимаемся, не?
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
diadiavova
Дата 20.5.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Мне не нужен вызов, в моём изначальном примере возвращалось число.

Это утверждение нуждается в пояснении. Насколько я понимаю, все вызовы динамических членов возвращают такие же динамические объекты. Что там внутри - другой вопрос, но без приведения типов нормально работать с ними не получится. Аналогичная фигня получается и в моем примере, то есть метод возвращает Object, который на самом деле будет того или иного типа. Так что я тебя не понял.
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Если динамически вызывать методы прямо из определяющего их класса, то решарпер проверяет вызовы. 

Зачем? При чем тут решарпер? Разве мы говорили о вызове из определяющего класса? По твоему поведение динамических типов под решарпер заточено что ли?
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Это может звучить странно, но через dynamic красиво реализуются шаблон Visitor, мульти-методы и другое.)

Почему странно? Я приводил примеры интересного поведения динамических типов, зря ты их не посмотрел.
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
В итоге testobject = testobject.Replace("Anthary", "World") превращается в монстра:
    testobject = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(testobject, null, "Replace", new object[]
    {
        "Anthary",
        "World"
    }, null, null, null));

Что, собственно, и требовалось доказать.

Ну не такой уже и монстр. Это одна строчка кода, упакуй ее в приведенный мной выше метод и наслаждайся. Я уже не говорю, что отсутствие позднего связывания - проблема шарпа старых версий и не более того.
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Биндер для шарпа есть? Потому что, если его нет, ты его на коленке не напишешь.

Биндер нужен для сложных случаев и написать его вполне реально, а в основном, озвученная тобой проблема сложной привязки высосана из пальца.
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Я знаю, что есть биндеры для шарпа и басика, которые работают с CallSite. Наверное, если бы был биндер для шарпа в отражениях, его не реализовывали бы по новой?

Почему для шарпа и васика нужны разные биндеры? Регистронезависимость для васика указывается флажками, а так там есть дефолт биндер, обычно он используется в случае, если биндер не передан, а свой может понадобиться если надо сделать уже что-то ну совсем необычное.
Цитата(Athari @  20.5.2013,  13:26 Найти цитируемый пост)
Мы ж демонстрацией занимаемся, не? 

И чем фибоначчи лучше факториала?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Akella
Дата 20.5.2013, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(serger @ 20.5.2013,  10:02)
Akella, зачем они во view? на экран сколько строк влазит? Чел сколько строк может просмотреть за час?

Цитата(Zloxa @  20.5.2013,  10:57 Найти цитируемый пост)
Я тоже майкрософту говорил, гооврил, мол 65536 строк в экселе - за глаза достаточно.  

Хранить или выводить?

нет, не просматривать
обрабатывать программно
например отсортировать, сгруппировать
да фиг знает, что там можно делать
ну если реализовали, то не зряведь, значит нужно было
PM MAIL   Вверх
serger
Дата 20.5.2013, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Цитата(Akella @  20.5.2013,  16:30 Найти цитируемый пост)
нет, не просматривать
обрабатывать программно
например отсортировать, сгруппировать
да фиг знает, что там можно делать
ну если реализовали, то не зряведь, значит нужно было 


Но во view-то зачем тянуть?!



--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Beltar
Дата 20.5.2013, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

В дотнете ты бесплатно можешь положить в один солюшен проекты на разных языках и просто использовать их, как будто они написаны на одном языке.


На языках .NET т. е.?

Цитата

Опен-сорсные проекты в подавляющем большинстве или заброшенные, или недоделанные, или кривые.


Что вообще типично для опен-соурса на всех без исключениях языках.

Цитата

Отсутствие решарпера удорожает разработку софта


Вывод, VS - УГ.



Блин, попробовал конвертнуть под 2009+ хотя бы на уровне правильных typecast'ов. В итоге уперся в одну просто замечательную конструкцию. Где сначала класс TLua передается как const, потом от него берется проперти без write, которое аж object, и члену этого обджекта делается присваивание. Х) Блин, я не знаю, как это должно компилироваться в D7, но в XE3 в ситуации когда свойство возвращает структуру, или объект, присвоить что-то их полям нельзя, сеттера нету. Можно сделать методы для доступа к полям, это будет компилироваться, но я сам недавно нарвался на такую ситуацию, и не сразу въехал в чем дело, вроде все правильно, все верно, но раз структуры и обджекты передаются по значению, то метод присваивания с локальной копией и будет работать. В общем надо или класс, или указатель. Х)
Хотя думаю, что сам автор за день-два бы это перевел, нужно по сути выкинуть все обджекты, заменив на структуры, или классы, переделать ф-ии работающие со строками, возможно, лишь на уровне их заголовков. И что-то сделать с одной замечательной таблицей символов LowerChars, которую я бы просто заполнил двумя строчками кода в Initialization и такой дурью не страдал. Ну и замечательные ассемблерные вставки нафиг.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Athari
Дата 20.5.2013, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



Цитата
Это утверждение нуждается в пояснении. Насколько я понимаю, все вызовы динамических членов возвращают такие же динамические объекты. Что там внутри - другой вопрос, но без приведения типов нормально работать с ними не получится.

Любой тип приводится к dynamic и из dynamic без явного преобразования типа.
Код

    dynamic a = foo(bar, baz);
    int b = a;

В этом примере, если foo вернёт не int, то будет исключение в рантайме.

Цитата
Почему странно? Я приводил примеры интересного поведения динамических типов, зря ты их не посмотрел.

Какие примеры?

Цитата
Ну не такой уже и монстр. Это одна строчка кода, упакуй ее в приведенный мной выше метод и наслаждайся.

Моя позиция: упаковать все фичи языка в один красивый метод -- невозможно. Если бы это было возможно, как ты думаешь, авторы дотнета изобретали бы таких монстров? Отмечу, что такие монстры у них получились уже пять раз минимум:

1. System.Reflection -- отражения;
2. VisualBasic.CompilerServices -- утиная типизация VB;
3. Runtime.CompilerServices.CallSite и др. -- общие классы для динамического типа;
4. Microsoft.CSharp.RuntimeBinder и др. -- динамический тип для шарпа;
5. Microsoft.VisualBasic.RuntimeBinder и др. -- динамический тип для басика.

Авторы этой части дотнета -- не индусы, которые пилят WPF, а самые высококлассные программисты, некоторые со всемирной известностью.

Цитата
Биндер нужен для сложных случаев и написать его вполне реально

По-моему, ты совсем не осознаёшь сложности языка.

1. Открой файл C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033\CSharp Language Specification.docx (также спецификация доступна в виде HTML)
2. Перейди к разделу 7.5.3 Overload resolution (стр. 152)
3. Прочитай полностью

Цитата
Почему для шарпа и васика нужны разные биндеры?

Потому что это разные языки, и правила выбора методов у них разные.

1. Открой файл C:\Program Files (x86)\Microsoft Visual Studio 11.0\VB\Specifications\1033\Visual Basic Language Specification.docx (также спецификация доступна для скачивания онлайн)
2. Перейди к разделу 11.8.1 Overloaded Method Resolution (стр. 238)
3. Прочитай полностью

Цитата
И чем фибоначчи лучше факториала?

Тем, что это не "линейная" рекурсия, а "ветвистая".

Обращу внимание ещё раз: C# -- это исторически очень "засахаренный" язык с тьмой фич и желанием его авторов сохранить в языке лаконичность. В нём даже грамматика -- за гранью добра и зла, потому что новые ключевые слова часто делаются контекстно-зависимыми, чтобы не ломать обратную совместимость. Например, можно объявить классс "var", переменную "var" класса "var", при этом ключевое слово "var" станет недоступно. У дженериковых методов не нужно указывать аргументы-типы, если они могут быть хоть как-то выведены из аргументов ("хоть как-то" -- это с разбором всех логических выводов из доступных типов аргументов, и выведение типа одного аргумента по частичной информации из другого аргумента). Таких вещей -- море. Всё это делается ради того, чтобы сам язык был максимально кратким, понятным, логичным, без "сюрпризов". Но спецификация и тем более реализация языка превращается в сущий кошмар.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
diadiavova
Дата 20.5.2013, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
Любой тип приводится к dynamic и из dynamic без явного преобразования типа.

Ну что тут можно сказать... C# в этом смысле вообще проблемный язык, в бейсике, если отключить Option Strict (а по умолчанию она и так отключена), то явные преобразования придется выполнять только тогда, когда это действительно критично(например в случае сужающих преобразований). Тип Object тоже можно неявно к чему угодно приводить. То есть это опять-таки проблема конкретно языка C#. Я вот совсем недавно писал немного кода на C#, там надо было создать замыкание и вдруг узнал, что оказывается неявно типизированные переменные нельзя инициировать лямбда-выражениями. Почему нельзя? В бейсике можно, я всегда так делаю, прекрасно выводится тип. Почему в шарпе вдруг нельзя? И таких вариантов туева хуча. Поэтому, не смеши лучше, рассказывая о том, какие чудеса начали происходить с появлением динамических типов. Правда смешно. smile 

Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
Какие примеры?

Которые ты как всегда окрестил абстрактными. smile 
Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
Моя позиция: упаковать все фичи языка в один красивый метод -- невозможно.

Упакуй то, что тебе нужно. И чем по-твоему являются динамические типы, как не упаковкой подобных "монстров"?
Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
По-моему, ты совсем не осознаёшь сложности языка.

А ты создаешь проблему на ровном месте. Те случаи, когда требуется сложный биндинг - единицы, с которыми можно вообще никогда не столкнуться. Я лично, придумать такие вряд ли вообще сумею (не знаю, возможно у тебя получится). В тех единичных сложных ситуациях можно и написать немного ручного кода, для всего остального есть мастеркард  простое решение, которое будет работать безотказно.
В бейсике позднее связывание работает прекрасно, я ни разу не сталкивался с проблемой вызова не того метода например, этот вариант можно экспортировать в шарп и не париться, но нет же тебе надо выдумывать себе проблемы. Тебе видимо и C# нравится больше бейсика именно потому, что он более проблемный smile 
Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
Тем, что это не "линейная" рекурсия, а "ветвистая".

И как она улучшает показательные возможности примера?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Athari
Дата 20.5.2013, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Beltar

Цитата
На языках .NET т. е.?

Да. Их всего лишь 36 штук: http://en.wikipedia.org/wiki/List_of_CLI_languages

Для JVM ещё больше: http://en.wikipedia.org/wiki/List_of_JVM_languages

Есть приёмы для взаимодействия Java и .NET (конвертация в IL в частности), так что при большом желании удалять гланды через анус можно использовать любой язык из этих списков.

Цитата
Цитата
Опен-сорсные проекты в подавляющем большинстве или заброшенные, или недоделанные, или кривые.
 Что вообще типично для опен-соурса на всех без исключениях языках.

smile

Linux, Firefox, Chrome, MySQL, PostgreSQL, Eclipse, OpenOffice, Apache, Android, Webkit, Python, Perl, Git, Hg, Nginx, Node.js, WordPress, Drupal, jQuery, Ruby on Rails -- не слышал?

Ну и по части шарпа: ASP.NET MVC (веб по-правильному), Rx/Ix (асинхронность), Mono (кросс-платформенный .NET), MonoGame (кросс-платформенная разработка игр), Json.net (такая сериализация тебе не снилась), log4net, NAnt, WiX, NUnit, Simple.Data, Paint.net, AutoMapper, CsQuery, IronPython, IronRuby...

Цитата
Вывод, VS - УГ.

Мы это уже проходили. Студия делает дельфи одной левой в любой весовой категории. С решарпером студия повалит дельфи на лопатки, нечаянно чихнув.

Цитата
Хотя думаю, что сам автор за день-два бы это перевел, нужно по сути выкинуть все обджекты, заменив на структуры, или классы, переделать ф-ии работающие со строками, возможно, лишь на уровне их заголовков. И что-то сделать с одной замечательной таблицей символов LowerChars, которую я бы просто заполнил двумя строчками кода в Initialization и такой дурью не страдал. Ну и замечательные ассемблерные вставки нафиг.

То есть переписывать некому. Ч. и т. д.

Ассемблерные вставки, кстати, могут быть и не от хорошей жизни, а из-за необходимости.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
diadiavova
Дата 20.5.2013, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
 Например, можно объявить классс "var", переменную "var" класса "var", при этом ключевое слово "var" станет недоступно.

Вар - это костыль, изобретенный из-за того, что все декларации начитаются с имени типа. В бейсике нет ни вара ни динамика при том, что все фичи с ними связанные есть, они реализованы на тех возможностях языка, которые в нем и так были.
Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
. У дженериковых методов не нужно указывать аргументы-типы, если они могут быть хоть как-то выведены из аргументов ("хоть как-то" -- это с разбором всех логических выводов из доступных типов аргументов, и выведение типа одного аргумента по частичной информации из другого аргумента). 

Как я уже показал, вывести тип делегата при неявной типизации замыкания шарп не может и это не единственная странность. А вот если бы ты  ознакомился с  возможностями выведения типов в F#, то понял бы, что то что есть в шарпе и васике - уг по сравнению с этим.
Цитата(Athari @  20.5.2013,  17:02 Найти цитируемый пост)
 Таких вещей -- море. Всё это делается ради того, чтобы сам язык был максимально кратким, понятным, логичным, без "сюрпризов". 

По этому показателю шарпу до васика ой как далеко. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LSD
Дата 20.5.2013, 16:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Дельфи отстой, пруфы во всех постах Beltar, инфа 100% smile 


Цитата(Beltar @  17.5.2013,  19:23 Найти цитируемый пост)
А у меня завод на 10000 чел. Сколько компов не знаю. Возможно что больше, чем у всех ваших клиентов вместе взятых. Еще меряться будем?

У нас организация с ~100к сотрудников, десктопов где-то ~120к, плюс виртуалки. Так вот что я вам имею сказать по поводу организации этого всего безобразия: все компы в домене, на всех компах стоит софт для централизованной установки ПО и системных апдейтов, софт для удаленного администрирования и антивирус. Права админа на локальный комп даются по специальному запросу. Свой комп в общую сеть воткнуть нельзя. Админов я вижу только если надо железо менять (не научились они пока через RDC это делать smile ). Винда и офис лицензированна целиком на всю организацию.


Цитата(Zloxa @  20.5.2013,  11:08 Найти цитируемый пост)
Вобще в самом деле я тоже такой вопрос часто задаю бизнесс-пользователям, не помню что они мычат в ответ, но пока им не отдашь набор 100500 столбцов о 100500 строк, они, падлы, приемку не подписывают.

Плохо уговариваете, мы своих продавили 1000 строк и все, иначе please refine search criteria.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Athari
Дата 20.5.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@diadiavova

Цитата
Я вот совсем недавно писал немного кода на C#, там надо было создать замыкание и вдруг узнал, что оказывается неявно типизированные переменные нельзя инициировать лямбда-выражениями. Почему нельзя?

Авторы языка объяснили, что данная фича слишком проблемная, а пользы от неё мало. Простая реализация (предполагание Func<> и Action<>) не решает все случаи (out/ref аргументы, в частности).

Это мелочь на самом деле. Меня гораздо больше достаёт, что переменной типа void delegate() нельзя присвоить значение Action -- типы "не совпадают". Так как раньше Func/Action не было, то в дотнете куча кода с явно именованными делегатами. И их просто так не попередаёшь.

Надеюсь, что эту глупость всё-таки исправят. Вон, ко-/контр-вариантность одолели же.

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

Как особенности вывода "var" соотносятся с преобразованием результатов динамического вызова? Твоя фраза звучит как "в этом вашем шарпе деление байта на байт не даёт байт, поэтому отсутствие сборки мусора в дельфи -- не проблема". Абсолютно столько же логики.

Цитата
Упакуй то, что тебе нужно. И чем по-твоему являются динамические типы, как не упаковкой подобных "монстров"?

Они в языке выглядят красиво, потому что поддерживаются компилятором. По той же причине выглядят красиво yield return/break или await/async, хотя внутри происходит кошмар. Компилятор этот кошмар скрывает с глаз долой.

У тебя такой возможности в дельфи -- нет. Твой метод находится в рамках языка дельфи, у тебя нет доступа к преобразованию исходного кода.

В шарпе, кстати, compiler as service пилят. Так что такая магия станет доступной. (Не знаю, в каком объёме -- ещё не пробовал беты.)

Цитата
А ты создаешь проблему на ровном месте. Те случаи, когда требуется сложный биндинг - единицы, с которыми можно вообще никогда не столкнуться.

Всё используется, и очень часто.

Console.WriteLine -- multiple overloads, params parameter
Dictionary<K,V>.TryGetValue -- out parameter, generic type
Enumerable.Select<S,R> -- overloads, generic method, lambda type inference
WebResponse.Dispose -- explicit interface implementation
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
Athari
Дата 20.5.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@diadiavova

Цитата
Вар - это костыль, изобретенный из-за того, что все декларации начитаются с имени типа. В бейсике нет ни вара ни динамика при том, что все фичи с ними связанные есть, они реализованы на тех возможностях языка, которые в нем и так были.

Как можно создать объект какого-то типа, явно не указывая тип, если не пользоваться каким-то встроенным синтаксисом для данного конкретного типа (списки, словари, множества, кортежи во многих языках) и не вызывать метод, который возвращает объект данного типа? Ну вот как ты в басике создашь Tuple<Dictionary<int, List<string, Nullable<int>>>, ISet<double>>, не произнеся эту конструкцию?

Цитата
Как я уже показал, вывести тип делегата при неявной типизации замыкания шарп не может и это не единственная странность.

Я тебе про Фому, ты мне про Ерёму. По кругу. Ты невыводимый в var делегат будешь в каждый аргумент в споре вставлять? smile 

Цитата
Как я уже показал, вывести тип делегата при неявной типизации замыкания шарп не может и это не единственная странность. А вот если бы ты  ознакомился с  возможностями выведения типов в F#, то понял бы, что то что есть в шарпе и васике - уг по сравнению с этим.

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

Цитата
По этому показателю шарпу до васика ой как далеко.

Примеры? Мне, вообще говоря, пофиг, потому что на VB писать не буду, но всё равно любопытно.

И фшарп -- это, конечно, интересный язык, но пока для него нет поддержки, аналогичной сишарпу и басику, я его рассматривать не буду.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1291 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.