Какие пять вещей ты ненавидишь в своем любимом языке? [закрыто]

Вы можете добиться того, чего хотите, используя пользовательскую функцию :

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;

class DateFunction extends FunctionNode
{
    private $arg;

    public function getSql(SqlWalker $sqlWalker)
    {
        return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker));
    }

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->arg = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

Затем зарегистрируйте эту функцию в своем коде:

$em->getConfiguration()->addCustomDatetimeFunction('DATE', 'DateFunction');

И ваш DQL-запрос будет работать!

403
задан 14 revs, 6 users 40% 27 April 2015 в 07:21
поделиться

178 ответов

c #:

1) статические методы должны быть членами класса

2) статические методы расширения могут быть добавлены только к статическим классам

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

Я просто есть 3. Думаю, неплохо.

2
ответ дан 22 November 2019 в 23:35
поделиться

Python:

Я все еще умеренный пользователь Python, так что мои жалобы могут быть связаны с ограничением знаний или неправильным использованием. Комментарии приветствуются. Я действительно люблю этот язык.

  1. Плохая поддержка потоков и GIL. Если вы хотите использовать многоядерную платформу, большинство программистов на Python, вероятно, порекомендуют многопроцессорность или что-то еще, не используйте потоки. Это не дало бы вам ожидаемой производительности.
  2. свойство только для переменной экземпляра. _class_var = property (classmethod (some_method)) просто не сработает. Как я могу получить переменную класса, обернутую свойством?
  3. нет контроля доступа. Все элементы управления доступом представляют собой искажение синтаксиса. Например, private - это __private, protect - это _protected и т. Д. И надеюсь, что все, кто программирует python, следует соглашению об именах. Да ладно, мы можем добиться большего.
  4. Я согласен с философией python, заключающейся в том, чтобы быть простым и понятным синтаксисом, но, на мой взгляд, некоторый простой и понятный синтаксис, который не поддерживается, кажется признаком здравого смысла. Например, a ++, ++ a, a-- и --a, самоудаление / инкремент, что с ними не так? foo = (a> b? a: b) унарная операция, что с ней не так? (Я знаю, что в py2.6 есть что-то подобное, но, учитывая массовую поддержку почти всех других языков для этого простого синтаксиса, зачем изобретать велосипед? почему бы просто не следовать лучшим практикам? Разве хорошая вещь не должна просто оставаться в хорошей «форме»?)
  5. Программа для интерфейса. У Python нет интерфейса или концепции абстрактного класса (в py3k есть что-то под названием abc), все конкретно. Я думаю, что предоставление ключевого слова interface или abstract для построения скелета класса и наследования и расширения охранного класса было бы неплохой идеей. Это помогает при проектировании сверху вниз. В настоящее время мне просто нужно заполнить каждый из методов NotImplementedError, что довольно утомительно.
  6. Я должен добавить это. версия ниже 3.x имеет типы str и unicode. Это настоящий кошмар. Это делает смешивание ascii и un-ascii / unicode с большей вероятностью неудачным (плохо, плохо)

Я видел, как люди жалуются на скорость. Я этого не понимаю. Это язык интерпретации, код не компилируется в машинный код до времени выполнения, такова его природа. Невозможно сравнить скорость интерпретируемого языка с компилируемым. Насколько я могу судить, среди языков интерпретации / сценариев python не медленный.

2
ответ дан 22 November 2019 в 23:35
поделиться

C ++ отсутствие хороших инструментов рефакторинга, отсутствие проверенных исключений

Java отсутствие шаблонов, отсутствие ключевого слова const

2
ответ дан 22 November 2019 в 23:35
поделиться

PHP

  • Почти каждая стандартная функция находится в глобальной области видимости
  • Несогласованный порядок аргументов функции
  • Несогласованное именование функций
  • Функции без учета регистра
  • Скрипт может вести себя по-разному в зависимости от в файле php.ini
  • Возможность использовать неопределенные переменные
  • В некоторых случаях необходимо присвоить результат переменной, прежде чем ее можно будет использовать в функции

И гораздо более субъективно:

  • Динамический ввод
2
ответ дан 22 November 2019 в 23:35
поделиться

Common Lisp

  • Отсутствие стандартных библиотек для более современных функций (сокеты, потоки, ...)
  • Можно использовать стандартизированный пользовательский интерфейс, который отображается на родную оконную систему
  • Способность Scheme назначать лямбда-выражение переменной и использовать переменную напрямую в качестве вызова функции выглядит лучше, чем APPLY для FUNCALL. Побочный эффект наличия нескольких пространств имен, я полагаю
  • Стандартизированная система упаковки исходного кода для библиотек, чтобы их можно было легко использовать в нескольких реализациях

Интересно, на что будет похож строго типизированный lisp

2
ответ дан 22 November 2019 в 23:35
поделиться

C#

  • Отсутствие множественной диспетчеризации, основанной на типе аргументов метода во время выполнения. dynamic должен решить большую часть этой проблемы, но он еще не выпущен.
  • Реализация интерфейса является декларативной, а не структурной. Мне очень нравится, как язык Google Go реализует типы.
  • Асинхронные вызовы методов очень громоздки (и я уверен, что все потоки - это потоки ОС, а не легковесные потоки)
  • Нет системы макросов. Я не говорю здесь о макросах в стиле C; я говорю о макросах в стиле LISP/Scheme.
  • Операторы являются статическими методами, а их сигнатуры слишком ограничены (и вы не можете создавать новые).
  • 2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Erlang

    • не предполагает статических значений набирать текст, как в Haskell. Этот может привести к ошибкам во время выполнения и одному внимательно пишите код или используйте диализатор (1) для обнаружения расхождения. Динамическая типизация также считается медленным;
    • почти неизвестен по сравнению с C, Java и т. д .; модуль
    • lists (3) довольно скудный, иногда Мне не хватает полезных функций для обработки списков (например, как в Data.List в Haskell);
    • заставляет меня помещать , в конец каждого оператора в пункте и . в конце последнего.
    3
    ответ дан 22 November 2019 в 23:35
    поделиться

    Python , еще раз:

    1. Нет ключевого слова переключателя. И НЕТ, словарь ему не заменяет. Ни даже кучу заявлений elif .

    2. Несогласованная обработка разрыва строки. Почему я могу сделать:

        test = (1,
      2,
      3)
      

      А не:

       из цикла импорта itertools,
      Ислиса
      izip
      

      Почему я не могу сделать:

       если что-то \
      и foo \
      или бар:
      return "Строка в формате% (arg) s"% \
       {'arg': "кровавая косая черта"}
      

      без использования косой черты?

    3. Не существует одного очевидного и единственного способа сделать это. Python терпит неудачу в своем девизе точно так же, как Java терпит неудачу в «Пиши один раз, запускай где угодно».

       # что сделал бы человек с другого языка
      если не test.has_key ('foo'):
      test ['foo'] = 0
      n = test ['foo'] = test ['foo'] + 1
      

      vs

       # что бы сделал новичок-агностик
      пытаться:
      тест ['foo'] + = 1
      кроме KeyError:
      test ['foo'] = 1
      п = тест ['foo']
      

      vs

       # что вы получите после поиска значения словаря по умолчанию в документе python
      test.setdefault ('foo', 0)
      n = test ['foo'] = test ['foo'] + 1
      

      vs

       # что бы я сделал
      n = test ['foo'] = test.get ('foo', 0) + 1
      

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

    4. Выбор между пробелами и табуляциями. Выбора быть не должно. Выбери, вживи это в камень и перестань сражаться.

    5. Почему вы можете это сделать:

       test = {}
      test ['foo'] = 0
      

      но не:

       test = []
      test [] = 0
      

    P.S: "" .join (l) прекрасные люди. Прекратите жаловаться на это, это не очевидно, но, имея в виду шаблон итератора, это как раз правильный способ сделать это.

    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Условия Common Lisp

    • не являются классами (поскольку классы появились позже), хотя их интерфейс почти идентичен
    • , некоторые имена просто странные, например, flet / label (единственное отличие: область действия) и defvar / defparameter (единственное отличие: поведение, когда оно уже определено), или любая из функций изменения битов (dpb, ldb, и т. д.)
    • пакеты ... действительно сложно понять - каждый раз, когда я думаю, что понимаю их, они не делают то, что я хочу
    • встроенные структуры данных и функции не такие общие, как могли бы (например, почему я не могу определить свою собственную хеш-функцию переносимо?)
    • несколько пространств имен для функций, переменных и т. д. (Я не против этого в принципе, но CL сделал это слишком сложным; Норвиг сказал, что не может сказать из спецификации, но, похоже, минимум 7 пространств имен)
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    C #

    • Ссылочные типы по умолчанию допускают значение NULL; ключевое слово null на языке не типизировано.
    • Отсутствие различаемых объединений
    • Исключения как по умолчанию , неисключительный метод обработки ошибок - альтернативы не так много.
    • архаичный синтаксис и ограничения оператора переключения
    • Излишнее различие между конструкторами и статическими методами
    • Статические методы не могут быть частью интерфейса
    • Отсутствие реализации интерфейса по форме, а не явной реализации интерфейса - что приводит к многочисленные языковые приемы, такие как синтаксис запросов linq, foreach, коллекции и инициализаторы объектов, - ни один из них не может быть гибко повторно использован. Например, синтаксис инициализатора объекта может быть приятным, но плохо работает с неизменяемыми объектами.
    • Невозможно наследовать «интерфейс» класса независимо от реализации - что приводит к дублированию кода и чрезмерно запрограммированному коду, который предоставляет интерфейсы, абстрактные базовые классы, несколько общих реализаций и не дает возможности выбирать биты каждого из них для использования. Также; приводит к слишком большому количеству кода, который тесно связан с конкретной реализацией, поскольку обычно явно ссылаются на тип реализации, а не на интерфейс.
    • Невозможно умножить наследование через композицию, поскольку «интерфейс» классов тесно связан с его реализацией; эффективно отсутствие миксинов.
    • Вышеупомянутые ограничения интерфейсов приводят к увеличению числа практически идентичных интерфейсов, которые естественным образом не перекрываются ни в какой иерархии типов. IComparable vs. IEquatable vs. IComparable vs object. Equals vs. operator == и т. Д. все это требует гораздо больше работы, чем необходимо (особенно для классов коллекций).Очевидно, разработчики языка понимают это, отсюда и различные обходные пути для таких вещей, как linq, foreach и инициализаторы коллекций, которые работают по форме, а не по интерфейсу.
    • Избыточное использование круглых скобок и фигурных скобок вместо компоновки как структуры.
    • Возвращаемые значения можно игнорировать, что ограничивает эффективность вывода типа.
    • Перечисления не являются нормальным типом и не могут иметь методов. Кроме того, значения перечисления не являются типизированными и могут быть инициализированы до 0, несмотря на то, что не имеют значения 0. Смешивание метафор путем объединения перечислений флагов и не флагов.
    • Отсутствие надлежащей поддержки типов значений. Типы значений не могут быть унаследованы, имеют разную семантику конструктора и плохо работают из-за ограничений среды CLR. Кроме того, сбивает с толку семантика в отношении типов значений: некоторые значения действительно являются значениями (и не могут быть изменены), а другие действительно являются ненулевыми ссылками (переменными) без псевдонимов. Это особенно сбивает с толку в отношении следующей проблемы:
    • Семантическое различие между полями и свойствами, особенно в сочетании с отсутствием модификатора изменчивости (как, например, C ++ const )
    • Невозможно специализировать дженерики
    • Невозможно предоставить параметры универсального типа по умолчанию (например, заводские универсальные шаблоны)
    • из-за отсутствия typedef использование универсальных шаблонов затруднительно ( использование является ограниченной, но хорошо известной заменой!)
    • Невозможно обобщать вещи, отличные от типов (например, функции, простые значения или имена).Это означает, что вы не можете сделать что-то вроде общей реализации свойства зависимости, что приведет к неприятным реализациям таких вещей, как свойства зависимости и чрезмерное использование фрагментов кода и, как следствие, плохо читаемый код.
    • Ограниченная возможность указать требования к универсальному типу, например общий метод суммы, который принимает как int, double и bigint (без сложных и часто медленных взломов).
    • Реализация метода интерфейса или переопределение виртуального метода не может возвращать более конкретный тип или принимать более общий тип; т.е. ограниченная поддержка ко / контравариантности даже в C # 4.
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    C#

    Я знаю, что это глупо, но я бы хотел, чтобы типы данных сами преобразовывались в то, что я хочу, без необходимости добавлять (int) или Convert.ToInt32 или что-то еще. Это просто сэкономит мне время. И меня раздражает, что если я пишу что-то для вывода int, а потом оказывается, что мне нужен long, то часто приходится перебирать и менять все, что я сделал, чтобы это заработало. Просто сделайте это для меня!

    Извините, не смог придумать пять, но я новичок, так что, возможно, я вернусь и добавлю больше позже :P

    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Clojure

    • Отсутствие встроенного синтаксиса для необязательных и ключевых параметров в определениях функций. Конечно, вы можете добавить его достаточно легко, но это означает, что разработчики библиотеки не используют его. Повсеместная деструктуризация пока не оказалась хорошей заменой
    • Отсутствие комбинации методов (до / после / вокруг методов сортировки, найденных в Common Lisp)
    • Слишком большая зависимость от взаимодействия Java, например нет встроенного файлового ввода-вывода
    • Иногда мне нужна статическая типизация. Это не чистая ненависть; Я обычно предпочитаю динамический, и попытки смешать два были в основном неудовлетворительными
    • Нет встроенного формата быстрой двоичной сериализации для встроенных структур данных, хотя я слышал, что люди работают над ним
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Haskell

    1. Иногда система типов кажется отсталой. Что, если я не хочу, чтобы компилятор определял типы для моих переменных? Что, если мне нужно обратное, где выполняется проверка ограничений для указанных переменных? Например, вместо того, чтобы вывести тип элементов списка, он вместо этого проверяет, что все они принадлежат определенному классу типов. Это тонкая, но огромная разница, из-за которой мне сложно программировать пользовательский интерфейс. Это можно сделать, но для этого потребуется больше усилий, чем для некоторых других языков. Haskell хорош для частей, не связанных с пользовательским интерфейсом, но пользовательский интерфейс я оставляю нетипизированному языку.

    2. Разрешение построения бесконечных значений иногда приводит к некоторым действительно досадным ошибкам.

    3. Нет ограничений на мономорфизм.

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

    5. Классы типов должны автоматически выводиться для тривиальных случаев, таких как типы свидетелей, но там есть большой потенциал для злоупотреблений.

    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Пять вещей, которые я негодовал в Nemerle :

    • Локальные функции не могут дать результат
    • Способность компилировать лямбду иногда зависит от того, будет ли она встроена.
    • Несогласованная семантика типа значение / ссылка для tuples
    • Случайная неоднозначность между индексами массива и аргументами типа
    • Отсутствие общего принятия
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Erlang отсутствует в этом списке. Один из моих любимых языков, но несколько недостатков точно есть:

    • Синтаксис. Сюда входят 3 завершающие лексемы (,;.) и эстетика, но в более широком смысле - то, как семантический смысл кода выражается в тексте. Примером может служить то, что все строчные лексемы являются атомами, поэтому, чтобы сослаться на функцию, нельзя просто назвать ее, нужно fun my_function/1, и ?PRECEDE_CONSTANTS_WITH_QUESTION_MARKS. Придя из Scheme, Haskell и т.д., вы просто жалеете, что не можете использовать имя.

    • Поддержка библиотек хромает. В основном это касается внешних библиотек, но даже старая стандартная библиотека. Новые версии Erlang имеют разумные POSIX regexes, но в старой версии была довольно ужасная библиотека для базовых операций со строками. Вы также никогда не знаете, когда вы получите значение, или {ok, Value}.

    • Связанное: неоднородные инструменты для сборки и распространения. В Ruby есть gem и rake, RSpec. У Perl есть CPAN. Я не знаю достойных эквивалентов в Erlang.

    • Немногочисленные инструменты, специфичные для Erlang, довольно странные. Mnesia - отличная база данных, но, придя из SQL, вам придется изучать множество мелочей. То же самое с документацией @spec, которая имеет странный способ описания сигнатур.

    • Часто функциональная парадигма вредит, когда вам нужен лишь небольшой кусочек мутации. Предположим, вам нужна хэш-таблица, вы не можете просто взломать ее, как в Scheme или SML. ets и dets немного облегчают боль, но не намного.

    Шестой, бонус:

    • Синтаксис импорта и экспорта для модулей - это куча неудач, не то что 80+ строк import утверждений в Java.

    При всем при том, Erlang - это радость ^_^

    3
    ответ дан 22 November 2019 в 23:35
    поделиться

    REBOL

    REBOL - среди моих любимых языков. Не могу сказать, что у меня есть фаворит, хотя Haskell тоже занимает довольно высокое место.

    1. Его странный синтаксис отпугивает многих разработчиков еще до того, как они попробуют.

       используйте [url правил электронной почты] [
      
      
      ; Небольшой DSL, который рассылает людям электронные письма об URL-адресах.
      правила: [
       некоторые [
       в [
       установить электронную почту!
       установить url url!
       (изменение адреса электронной почты для отправки / темы [URL-адрес "Отъезд"])
       ]
       ]
      ]
      
      ; Глобальный контекст
      уведомить: func [[catch] dsl [block!]] [
       если не разобрать правила dsl [
      выкинуть сделать ошибку! «Вы как-то облажались».
       ]
      ]
      
      ] уведомить [[ a@b.com http://www.google.com] [ b@c.comhttp://www.yahoo.com]]
    2. Рекурсивные диалекты очень легко проверить с помощью PARSE , но очень сложно оценить. (Здесь могут быть полезны стеки.)

    3. REBOL очень плохо интегрируется со многими популярными технологиями, особенно с XML. Я подозреваю, что это отчасти высокомерие, потому что тип данных REBOL BLOCK! может делать почти все, что может делать XML. Однако в реальном мире есть XML.
    4. Нет Unicode.
    5. Благодаря AltMe, сообщество пользователей REBOL очень замкнуто. Я могу понять, почему они хотят использовать AltMe. Он написан на REBOL и демонстрирует его сильные стороны. К сожалению, это также отталкивает их на их собственный маленький остров.

    Грядущий REBOL 3, надеюсь, исправит многие из этих проблем, за исключением последней.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    C #

    1) Отсутствие практических возможностей для написания обобщений для типов значений. Например, любой идиот (ну, большинство идиотов) может написать процедуру, которая вычисляет стандартное отклонение списка int, float, double и т. Д. На C ++, ее просто писать, легко читать и выполнять так же быстро, как не общий код . Я думаю, что если вы можете написать на C # что-то, что близко к достижению любого из этих трех, но при этом не будет смешно с другими двумя, вы действительно отличный программист.

    2) Ковариация и противодействие, хотя это добавляется к 4.

    3) Чрезвычайно плохая документация LINQ (хорошо, не совсем часть языка).

    4) Попытка использовать foreach / итераторы, когда я хочу делать одно и то же каждый раз, за ​​исключением того, что в последний раз что-то немного отличается (например, объединить кучу строк с запятыми между ними и словом и между двумя последними). Если я напишу его с помощью IEnumerable, это будет сложно писать и читать, а с for (int i = 0 i <...) это не намного лучше и менее эффективно.

    5) Я знаю Я буду получать жалобы по этому поводу, но отсутствие проверенных исключений. Это не нужно реализовывать так, как в java (разработчики фреймворка делают несколько очень хороших замечаний, почему они этого не сделали), но я был бы счастлив, если бы компилятор предупреждал пользователей, которым не нравятся проверенные исключения. можно выключить.

    и с for (int i = 0 i <...) это ненамного лучше и менее эффективно.

    5) Я знаю, что буду получать жалобы по этому поводу, но отсутствие проверенных исключений. Это не нужно реализовывать так, как в java (разработчики фреймворка делают несколько очень хороших замечаний, почему они этого не сделали), но я был бы счастлив, если бы компилятор предупреждал пользователей, которым не нравятся проверенные исключения. можно выключить.

    и с for (int i = 0 i <...) это ненамного лучше и менее эффективно.

    5) Я знаю, что буду получать жалобы по этому поводу, но отсутствие проверенных исключений. Это не нужно реализовывать так, как в java (разработчики фреймворка делают несколько очень хороших замечаний, почему они этого не сделали), но я был бы счастлив, если бы компилятор предупреждал пользователей, которым не нравятся проверенные исключения. можно выключить.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    Квенья

    • Сообщество слишком мало. Практически невозможно создать хорошую программу языкового погружения, если поблизости нет другого говорящего.
    • Неправильные глаголы. Да, я знаю, что английский и испанский тоже упоминали о них, но квенья был изобретен . Почему все еще нужны неправильные глаголы?
    • Нет поддержки Unicode. У меня на компьютере должно быть три разных шрифта Tengwar, прежде чем я смогу читать большинство сообщений, и некоторые из них плохо кернируются. Это не будет большой проблемой, учитывая существование романизированной транскрипции, но Tengwar настолько красив, что вы не хотите его использовать.
    • Не на все концепции можно легко сослаться на квенья, что приводит к раздражающим пересказам или обращению к синдаринскому, нуменорскому или (спаси меня Манвэ) клингонскому языку, чтобы донести свою точку зрения.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    C#

    Номер один все время ненависть домашних животных к C# должен быть:

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

    (2) Нужно проверить, равно ли событие нулю, прежде чем вызывать его, и кажется ли это чем-то, что должно быть обработано языком.

    (3) Сериализатор XML не имеет возможности читать/записывать комментарии в XML-файл. Не очень хорошо в среде, где XML-файлы модифицируются как вручную, так и инструментом, написанным на C#. Можно обойтись без использования необработанного XmlDocument, но было бы лучше, если бы можно было абстрагироваться от этого к классу.

    (4) Процесс сборки не позволяет получить прямой доступ к таким вещам, как xsd файлы, вместо этого вам нужен промежуточный шаг, где вы создаете частичный класс на C#. Это также приводит к проблемам с XAML файлами, где для правильного прохождения изменений иногда требуется пересборка дважды.

    (5) Отсутствует поддержка имманентных свойств процессора, таких как MMX и SSE 1,2,3,4, и, таким образом, эти ценные возможности процессора не используются при работе приложений на C#.

    Другие, которые не сделали мои верхние 5:

    (6) Не могут пометить поля как свойства, все свойства должны быть явно реализованы с get go:

    Например, в настоящее время имеет:

    public class MyClass {
        private int someInt;
    
        public int SomeInt {
            get {
                    return someInt;
            }
            set {
                    someInt = value;
            }
        }
    }
    

    Would like

    public class MyClass {
        [IsProperty(public, get, set)]
        private int someInt;
    }
    

    (7) Нет поддержки множественных возвращаемых значений, например:

    public int, string, double MyFunction()
    {
        ....
        return x,y,z;
    }
    
    
    public void TestMyFunction()
    {
        int x, string y, double z = MyFunction();
    }
    

    (8) Нет поддержки ковариантных типов возврата

    У меня есть некоторые догадки по поводу реализации дженериков, но я вырежу их там. Я думаю, что C# - это отличный язык для работы с GUI, сетью и системой настройки, и это мой язык номер один для того, чтобы поднять и ускорить работу таким образом, чтобы это могло быть поддержано в долгосрочной перспективе.

    .
    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    Scala:

    • странности стандартной библиотеки: она не всегда демонстрирует лучшие практики и недостаточно документирована
    • жестко запрограммированные классы FunctionX, TupleX
    • отсутствие свойств: геттеры и сеттеры разделены, что нарушает DRY и делает такие вещи, как FRP, почти невозможными
    • необходимость = _ для инициализации свойств
    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    Моя 5 для Delphi:

    1. Процедуры и функции не обязательно отличаются от переменных если он не параметризован (например, у меня может быть такой оператор, как x: = GetPositionOnScreen; вместо x: = GetPositionOnScreen ();)
    2. Try / finally и Try / Except должны быть вложены (указано ранее, но все равно моего тоже).
    3. Без учета регистра.
    4. Может иметь несколько объектов (функции, глобальные переменные, локальные переменные) с одинаковыми именами, и Delphi с радостью попытается понять, что вы имеете в виду. имена должны быть уникальными.
    5. Нечетное условие условия «если». для одной условной проверки не требуется () вокруг нее, но если я провожу несколько проверок, мне понадобится () вокруг каждой, а иногда и несколько вложенных наборов для более крупных проверок.
    6. Не наследуются. Если мне нужно сослаться на функциональность модуля Windows в базовой и унаследованной форме, я должен включить Windows в обе.
    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    По мнению многих, Java работает медленно, но я согласен с определенной степенью ее использования.

    Java - это драматично. У них есть много занятий, посвященных одному делу, которым вы хотели заниматься. Но вы знаете свойство гибкости XD.

    Поначалу Java - это сложно, но, как всегда, весело.

    Когда вы пишете простой код для печати «Hello, World!» ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ JAVA! XD Я уверен, что оправдан.

    Java - это смесь, поэтому не говорите, что это исключительно язык ООП.

    Их гораздо больше, но я ограничен пятью XD. Спасибо!

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    C #

    Я очень доволен C #, но эти два меня действительно раздражают:

    • Инициализация на основе конструкторов для неизменяемых классов менее удобна, менее интуитивно понятна (когда вы читаете код, вы не понимаете, что вы assign to what), имеет меньшую поддержку IDE, чем инициализация встроенного объекта. Это неизбежно заставляет вас склоняться к изменяемым классам. Я знаю, что об этом упоминалось ранее, но у меня есть проблемы с синтаксисом инициализации для неизменяемых классов.

    • переключатель слишком подробный. Всякий раз, когда я вижу ситуацию, когда переключение было бы правильным, я действительно склонен использовать if..else if .. только потому, что он более краток (примерно на 30% меньше набора текста). Я думаю, что для switch не должно быть провала, break должен подразумеваться, а case должен разрешать список значений, разделенных запятыми.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

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

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    Пять вещей, которые я ненавижу в C ++

    • Время компоновки. С помощью распределенных сборок я могу перестроить весь наш проект за то же время, что и наш компоновщик.
    • Нет стандартного способа предотвратить изменение порядка операций с памятью. Использование памяти с комбинированной записью обычно требует злоупотребления ключевым словом volatile. Предотвращение переупорядочения чтения (часто критически важное для оптимизации при работе с математическими конвейерами SIMD) обычно достигается путем внедрения нулевого блока ASM в середине процедуры.
    • Многоступенчатые макросы для обхода проблем строкового преобразования:
    #define STR_LINE2(x) #x
    #define STR_LINE(x)   STR_LINE2(x)
    #define LINE_NUMBER STR_LINE(__LINE__)

    • Обычно манипуляции со строками просто болезненны.
    • Распространение нестандартных вариантов printf (vsnprintf_s vs _vsnprintf_s).
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Python

    1. Django для Python 3 не существует
    2. Статическая типизация. Да, динамическая типизация - это здорово, но иногда я действительно хочу сделать ее статической.
    3. Правильная поддержка юникода (исправлено в Python 3)
    4. Именование конструкторов. Ненавижу все это подчеркивает __в__ моем коде.
    5. Потоки не очень эффективны
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    VB .NET, но только потому, что VB6 отравил целое поколение программистов

    Я работаю в магазине VB .NET, который раньше был магазином VB6, и все работающие здесь люди, которые раньше были разработчиками VB6, упорно отказываются изучать что-либо о .NET. Они пишут, как будто это все еще VB6, и их приложения отстойные, как и приложения VB6. Мой начальник активно препятствует любому использованию LINQ, потому что боится, что это слишком сложно для понимания другими, и это правда, потому что никто не хочет это понимать.

    Я думаю, что для всех нас было бы лучше, если бы MS просто выбрала C#, что меня убивает, потому что я считаю, что фигурные скобки значительно уступают многословным закрывающим утверждениям VB.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    Переписал это после некоторого размышления ...

    Пять вещей, которые я ненавижу в PHP, хотя и люблю его (в произвольном порядке):

    • Несогласованное именование и порядок параметров во встроенных функциях.
    • Объектно-ориентированный подход к массивам благодаря SPL, но, к сожалению, не к строкам (пока).
    • В самом PHP нет реального параллелизма, только через многопроцессорную обработку веб-серверов.
    • Нет асинхронных вызовов, как в JavaScript.
    • Кэширование кода операции только через расширения. Неплохо, но просто раздражает.

    Это особенности языка (или их отсутствие), которые меня раздражают, но гораздо более серьезными проблемами являются вещи, связанные с большим количеством людей / сообществ:

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

    2. Огромное количество руководств / книг, которые преподают действительно плохие методы и стиль. Это может быть основной причиной №3.

    3. Плохая репутация, которую он приобрел в основном из-за № 3 и № 4.

    1
    ответ дан 22 November 2019 в 23:35
    поделиться

    PHP:

    • Абсурдная функция assert()... она запускает eval() на коде внутри
    • ?> тег удаляет все новые строки после него ?!
    • Странная обработка числовых строк (попробуйте использовать их как ключи массива)
    • Болезненная поддержка юникода, которая, похоже, больше не будет решена в PHP 6
    • Низкая стоимость входа означает, что 95% дают PHP-программистам ужасное имя - и попытки найти кого-то из этих 5% для найма просто безумны.
    2
    ответ дан 22 November 2019 в 23:35
    поделиться

    Python

    1. Стандартная библиотека во многих местах не подчиняется собственным правилам стиля. (PEP-8)
    2. Ключевое слово super в Py3k полно ненужной магии (вы не можете присвоить ему другое имя, работает без self, зачем вообще нужен этот явный параметр?)
    3. Поддержка юникода неполна в Py2k и отстойна в Py3k (стандартный ввод в юникоде, никаких двоичных данных! WTF? Создание нового стандарта WSGI - это халтура.)
    4. GIL. Очень ограниченная поддержка многопоточности (с CPython)
    5. PyPI (Python Package Index) - отстой. Завистливый взгляд на rubygems
    2
    ответ дан 22 November 2019 в 23:35
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: