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

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

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. Это означает, что вы, вероятно, застряли, используя большую часть стек microsoft, IIS и MSSQL
  3. Вместо того, чтобы быть конкретным инструментом для решения конкретной проблемы, C # пытается быть языком для каждой парадигмы.
  4. Отсутствие сообщества. Конечно, для C # начинают появляться фреймворки и библиотеки с открытым исходным кодом. Те самые, которые были доступны Java-разработчикам в течение многих лет.
  5. Трудно найти хорошую помощь. В Интернете полно плохих примеров того, как решать проблемы с помощью C #. Это восходит к проблеме №3.
1
ответ дан 22 November 2019 в 23:35
поделиться

C++

  • загадочные сообщения об ошибках при использовании шаблонов
  • отсутствие ограничений на шаблоны (многие случаи можно обойти с помощью метапрограммирования шаблонов, но это приведет к нечитаемому коду (по крайней мере для средних программистов) в большинстве случаев)
  • синтаксис указателя на член-функцию
  • комитет по стандартам c++ должен выпускать официальные стандарты чаще (или хотя бы выпускать отдельные обновления для самой стандартной библиотеки), я имею в виду, что TR1 был выпущен в 2005 году, а у нас до сих пор нет shared_ptr, bind и т.п. в стандартной библиотеке.
  • -
2
ответ дан 22 November 2019 в 23:35
поделиться

Относительно C #:

  1. Мне неприятно, что нет ключевого слова, чтобы указать, какие исключения выбрасываются из метода как в java. Это гораздо лучший способ документировать исключения, чем использование комментария XML.
  2. Мне также нужен гораздо лучший синтаксис для общих ограничений, таких как oring и anding ограничений.
  3. Почему метод не может возвращать более одного значения?
  4. Отсутствие поддержки аспектно-ориентированного программирования в языке.
  5. Почему вы не можете аннотировать каждый из методов доступа к свойствам с помощью атрибута?
  6. Отсутствие встроенной поддержки регулярных выражений, как в Perl.
2
ответ дан 22 November 2019 в 23:35
поделиться

Python:

1) Это язык сценариев, а не полностью скомпилированный (я бы предпочел иметь возможность компилировать двоичные файлы - меня не волнует байт-код). Это очень раздражает, если мне приходится использовать очень много библиотек (то есть каждый, кто использует мою программу, должен установить все библиотеки, а это в основном означает, что ни один нормальный человек не сможет или не наберется терпения, чтобы правильно настроить его - если только Я делаю кучу ненужной работы). Я знаю способы создания двоичных файлов, но они не всегда работают, и я предполагаю, что они так или иначе объединяют интерпретатор в двоичные файлы (а я этого не хочу). Теперь, если бы я мог получить компилятор байт-кода, который бы включал копии всех файлов, которые я импортировал (и только те), для помещения в папку моей программы, это может быть подходящим компромиссом (тогда никому не придется загружать дополнительные библиотеки и тому подобное). Также было бы неплохо, если бы скомпилированные файлы python можно было бы сжать в один файл с одним, указанным в качестве файла для запуска программы, прежде чем это будет сделано.

2) Иногда это кажется немного ошибочным; было несколько раз, когда код, который должен был работать, просто не работал (не было ошибок программиста), особенно код, относящийся, например, «from moduleX import *» и другие проблемы, связанные с импортом, а также некоторые проблемы, относящиеся к к глобальным и локальным переменным.

3) Максимальная глубина рекурсии может быть больше. Был по крайней мере один раз, когда я почувствовал, что мне нужно подняться выше.

4) Нет оператора переключения (не говоря уже о том, что позволяет использовать числа,

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

C #

5. Оператор объединения с нулем

?? оператор позволяет вам писать:

x = y ?? z;

вместо:

x = (y == null) ? y : z;

Мне нравится этот оператор, но я хочу другой:

x = y ??? y.foo() : z.foo();

вместо

x = (y == null) ? y.foo() : z.foo();

Я использую такие вещи все время, и меня раздражает то, что введите часть == null .


4. У Equals должна быть лучшая поддержка

Мне приходится начинать каждый метод Equals (object obj) с: MyClass other = obj as MyClass; if (other == null) return false;

Вам нужно только написать:

public override bool Equals(MyClass other) {...}

И язык должен позаботиться о предоставлении метода Equals (object obj) .
ПРИМЕЧАНИЕ: должно быть гарантировано, что other не будет нулевым.


3. Невозможно использовать тернарный оператор с разными типами

Это не компилируется, и я думаю, что следует!

string foo = "hello";
int bar = 4;
object baz = foo == null ? foo : bar;

2. Отсутствие частного пространства имен

Мне нравится внутренняя защита, но я бы хотел, чтобы была защита, которая разрешала бы доступ только из того же точного пространства имен. Это было бы неплохо для лучшего контроля доступа к большим библиотекам классов.


1. Нет множественного наследования

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

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

vb.net

  • Слабо набран по умолчанию (опция строгих исправлений это, но это не по умолчанию)
  • не требует скобок на методах (Myфункция Вместо merfunction () и т. Д.)
  • использует скобки для определения / использования массива / использование (MyArray (12) вместо MyArray [12])
  • не поддерживает прямое прикрепление (I ++)
  • Поддержка наследия по ошибке Ключевые слова Ключевые слова Ключевые слова и все пространство имен VB6
-1
ответ дан 22 November 2019 в 23:35
поделиться

Python

Те, которые я просто не понимаю ...

  • math.ceil () и math.floor () возвращают числа с плавающей запятой, а не целые числа (возможно, чтобы избежать целочисленного переполнения в базовой функции C - но почему бы не преобразовать в Python long?)
  • len () - это функция, а не метод
  • reload () очень ограничен, не перезагружает модуль 9 раз из 10, только перезагружает импортированную метку, если это модуль, то есть не может выполнить из bar import foo; reload (foo) , если foo не является модулем
  • Изменяемые аргументы по умолчанию имеют единственную ссылку (почему бы не создавать новый экземпляр при каждом вызове функции?!)
  • Все эти подчеркнутые переменные - если они такие частные, почему мы так много видим встроенных в коде? Получите пространство имен!
  • Строки не изменяемы - возможно, для этого есть веская причина, но я встречал много ситуаций, когда я хотел бы настроить один конкретный символ ...

Те, которые имеют смысл в зависимости от реализации, но раздражают ...

  • array.sort () не возвращает массив (я полагаю, это происходит на месте)
  • Понимание списка / генератора не не определяют новую область (это просто синтаксический сахар для цикла for , верно?)

и пара, которая зафиксирована в Python 3

  • Целочисленное деление по умолчанию
  • global ] может относиться только к пространству имен верхнего уровня
1
ответ дан 22 November 2019 в 23:35
поделиться

JavaFX

  • Вывод типа иногда не ведет себя так, как вы ожидаете, поэтому часто требуется явно объявить тип .
  • def ведет себя так же, как const в C, а не final в Java
  • , вы можете вставить значение в последовательность, обратившись к индексу> = seq.length, который фактически должен вызвать ошибку компилятора (согласно ссылке).
  • если вы присваиваете String значение null, по умолчанию используется значение "". Если вы присваиваете null целому числу, выдается ошибка компилятора (в отличие от того, что говорится в ссылке).
  • обрабатывает CheckedExceptions так же, как RuntimeExceptions
0
ответ дан 22 November 2019 в 23:35
поделиться

Lua

  • Если вы выполните foo.bar (1,2), тогда 'self' будет нулем внутри метода bar. Вы должны не забыть вместо этого выполнить foo: bar (1,2). Я бы предпочел, чтобы это переключилось («self» должно быть определено по умолчанию, если вы не используете оператор «:» или не вызываете функцию, которая не является методом).
  • Переменные по умолчанию являются глобальными. Я бы предпочел отказаться от «локального» ключевого слова и использовать вместо него «глобальное».
  • Необъявленным переменным присваивается ноль. Я бы предпочел получить сообщение об ошибке. Вы можете обойти это, манипулируя глобальной метатаблицей env, но я бы предпочел, чтобы она была реализована по умолчанию и могла деактивировать ее.
  • Множественные возвращаемые значения параметров обрабатываются не очень хорошо. Допустим, у вас есть функция foo (), которая возвращает 1,2,3 (три значения), а bar () возвращает 4,5 (два значения). Если вы выполните print (foo (), bar ()), вы получите «1,4,5» ... при вызовах раскрывается только «последний» кортеж.
  • Оператор # (длина таблицы) работает только в таблицах, индексированных непрерывными целыми числами. Если ваша таблица не такая, и вы хотите знать, сколько в ней элементов, вам нужно либо проанализировать ее с помощью цикла, либо обновлять счетчик каждый раз, когда вы вставляете / удаляете из нее элемент.
0
ответ дан 22 November 2019 в 23:35
поделиться

Я только что обнаружил, что не могу использовать Enum в качестве ограничения типа при создании универсального метода в C #.

У Microsoft есть достаточно хорошее объяснение, почему, но все же. Я сумасшедший

public static T MyFunc<T>(string arg) where T:Enum //wont work :(
0
ответ дан 22 November 2019 в 23:35
поделиться

HyperTalk:

  • Давным-давно умер
  • Нет простого задания (нельзя просто сказать a: = 3 , у вас есть сказать поместить 3 в
  • Нет вложенных функций
  • Нет реальных структур данных, только строки. Чтобы создать «списки», вы разделяете элементы с помощью itemDelimiter и экранируете их вручную. также можно получить строки и слова вроде получить слово 2 из строки 5 текстового файла

В стороне, я думаю, что одна из самых крутых функций, уникальных для HyperTalk, - это специальная переменная it :

ask "How many years old are you?"
answer "You are " & it*12 & " months old."
0
ответ дан 22 November 2019 в 23:35
поделиться

C #

  • Невозможно создать ссылку (var & t = struct)
  • Нет деструкторов локальной области (IDispose приближается, но не то же самое)
  • ToString, i почти не нравится, что он есть у каждого объекта, но оказывается, мне не нравится все, что использует его, как это делает string.format. У меня есть вещи, которые принимают определенный тип (например, целые числа, числа с плавающей запятой, текст, только символы). Поэтому вместо передачи какого-либо объекта мне нужно передать что-то с неявным приведением типов или интерфейсом. В итоге я написал что-то вроде этого, чтобы безопасно экранировать текст для html, который отлично работал.
  • Невозможно использовать виртуальное приведение типов (blah) obj; не работает, если obj не наследует / имеет интерфейс blah. Простой обходной путь - предоставить интерфейс с функцией преобразования.
  • Не имеет локального творения. Вместо того, чтобы писать var o = new Item (); я хотел бы написать (что-то вроде) Item o () (с автоматическим удалением, если он есть).
0
ответ дан 22 November 2019 в 23:35
поделиться

Python

  • Нет пространств имен.
  • Псевдо-частные атрибуты / искажение имен (в основном с помощью getattr).
  • Манипуляции с путями к файлам распространяются на несколько модулей. Объединять вызовы os.path вместе некрасиво, трудно читать и в большинстве случаев нарушает DRY. Обычные операции с путями к файлам по-прежнему не имеют вспомогательных функций, таких как получение списка файлов в каталоге. Модуль типа path , позволяющий исправить это, был отклонен.

( [f вместо f в os.listdir ('/ file / path'), если os.path.isfile (os.path.join ('/ file / path', f))] )

  • Документация Python (я очень, очень, очень благодарен, что документация вообще есть, и что она так красиво отформатирована, но я ненавижу пробираться через 5000 строк примеров быстрого запуска, чтобы найти документацию по отдельным функциям для отдельные модули (я смотрю на вас optparse и logging)). Встроенные типы документируются по частям почти в 10 различных местах.
0
ответ дан 22 November 2019 в 23:35
поделиться

То, что я ненавижу в Python :

  • нет компилятора
  • это не воспринимается всерьез

То, что меня раздражает в Python:

  • (self,
  • нет private
  • нарушение совместимости


Пять вещей, которые я ненавижу в PHP :
  • «работает по назначению», когда это явно ошибка
  • нет goto
  • ссылки на ошибки ( foreach $ arr => & $ val ... foreach $ arr => $ val )
  • без множественного наследования
  • нет компилятора, который действительно работал бы без принесения в жертву темного бога ягненка
-2
ответ дан 22 November 2019 в 23:35
поделиться

Java - нет поддержки композиции на уровне языка

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

Python:

  • отсутствие разделителя, сигнализирующего о конце блоков, вносит двусмысленность, из-за которой автоматический отступ не будет работать с плохо отформатированным кодом.
  • нет макросов (декораторы не считаются)
  • нет автоподбора библиотек, как в haskell's cabal или perl's CPAN
  • нельзя объявлять переменные const (да, можно, но ... )
  • мета-программирование урезано
  • чуть не забыл про блокировку глобального интерпретатора
0
ответ дан 22 November 2019 в 23:35
поделиться

Object Pascal:

  • В редактируемом файле много прыжков туда-сюда, поскольку интерфейс и реализация разделены на две части, но все равно помещены в один файл.
  • Динамическая индексация массивов, строки начинаются с 1, вы указываете начальный индекс при объявлении фиксированных массивов, а динамически выделяемые массивы всегда начинаются с 0.
  • Классы и объекты (не говоря уже об интерфейсах) прикручены поверх языка и, кроме всего прочего, не могут быть выделены стеком, как записи.
  • При вызове функций без параметров () необязательны, что приводит к большим неудобствам при работе с указателями функций или при попытке сослаться на результат функции, используя имя функции.
  • Списки параметров не могут работать с фиксированными типами массивов или указателей функций без внешних определений типов.

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

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

JavaScript

Из спецификации ECMAScript 5:

  • 7.6.1.2 Будущие зарезервированные слова:

    class, enum, extends, super, const, export, import

    В строгом режиме: реализует, let, private, public, interface, package, protected, static, yield

  • 11.9.4 Оператор строгого равенства (===) vs. 11.9.1 TheEqualsOperator ( ==)
  • 11.9.6 Алгоритм строгого сравнения равенства (NaN === NaN неверно)
  • 8.5 Тип числа - нет вещественных целых чисел, все является плавающим.
  • 4.2.1 Объекты - прототипное наследование

Хорошо, мне нравится последний вариант, но он сбивает с толку 7 видов

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

Python 3

  • и табуляции, и пробелы разрешены для отступов
    И можно подумать, что люди учатся на прошлом (Makefile). Просто выберите пробелы и запретите вкладки. YAML правильно понял.
  • Отсутствие популярных сторонних библиотек.
    Стандартная библиотека прекрасна, но многое из того, что делает Python 2 таким мощным, лежит в сфере сторонних разработчиков. Python 2 правильно понял :-).
  • IEEE float
    Плавающие точки в языках программирования сбивают с толку, потому что они отличаются от того, как мы их используем в математике. Вместо этого числовые операции следует рассматривать как выражения, которые преобразуются в формат десятичной точки только при необходимости (например, при печати на экране). Думаю, Maple и Mathematica сделали все правильно.
  • набор символов для идентификаторов слишком ограничен
    list.empty? лучше, чем list.is_empty или даже len (list)! = 0 . Аналогично process.kill! было бы лучше, чем process.kill . Ruby и lisp поняли это правильно.
  • при вызове функции вы должны всегда записывать круглые скобки
    Было бы неплохо, если бы мы могли опустить их в однозначных случаях. Как это снова? dict.items или dict.items () ? Руби тоже правильно поняла.
1
ответ дан 22 November 2019 в 23:35
поделиться

Objective-C 2.0

Строго придерживаться языка и среды выполнения, а не библиотек, и ни в каких конкретный заказ:

  1. Отсутствие cVars.
  2. Нет модулей. Я не очень недоволен отсутствием пространств имен, но модули было бы неплохо иметь.
  3. Синтаксис свойств на основе Ivar требует объявления с использованием имени переменной в трех местах. Это довольно ужасно.
  4. C наследием. Все, что вызывает ненависть в языке C, кроме OO и GC, присутствует.
  5. Объекты не могут находиться в стеке. Не столько проблема с Obj-C, сколько с тем, что он делает с практиками программирования на других языках. Мне кажется странным, когда я получаю возвращаемое значение в стеке, например, на C ++. Если я на самом деле не смотрю документацию библиотеки, когда пишу код, я предполагаю, что каждая функция возвращает указатель, что часто приводит к некоторой значительной очистке позже.
0
ответ дан 22 November 2019 в 23:35
поделиться
  • Свойство length легко спутать с функцией length (); вместо этого используйте size ()
  • Синтаксис для интерполяции переменной в строках селектора ('"+ $. month +"') stinks
  • $ (event.currentTarget) не всегда работает для восходящей и захватывающей
  • синтаксиса атрибута работает ("[class = 'foot']") в местах, где синтаксис селектора (".foot") ничего не возвращает
  • Содержит селектор ([class ~ = done]) иногда не работает там, где JavaScript (this.className.search ("done ")> 0) работает
0
ответ дан 22 November 2019 в 23:35
поделиться

У меня есть только один, но я считаю, что им стоит поделиться.

CSharp / .NET

У нас есть свойство Length для получения количества элементов в массиве и свойство Count для получения количества элементов в коллекции. Это выглядит более странно, если учесть тот факт, что CLR автоматически добавляет IList, ICollection, IEnumerable к нулевым одноразмерным массивам за сценой.

Я полагаю, что команда CLR и команда BCL имели трудные времена, обсуждая эту тему ;)

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

Рубин.

  1. Странные правила области видимости - переменные, константы и методы ведут себя по-разному. Правила также меняются в зависимости от того, какое ключевое слово вы использовали для закрытия. Или от того, находитесь ли вы в классе, собственном классе, объекте, модуле или самом модуле. Затем есть instance_eval, который меняет правила на другой набор правил. И они снова меняются, когда модуль «включен» или «расширен», которые сами по себе делают разные вещи в области видимости. А некоторые наборы правил нельзя эмулировать с помощью метапрограммирования, поэтому вам придется использовать eval. Если только вы не используете Ruby 1.9, где все по-другому.
  2. Пространство имен в принципе бесполезно. Если у вас есть Foo :: File, то файл stdlib, вероятно, не работает для всего Foo.
  3. Оператор require не работает. Если два файла требуют друг друга, поведение этих файлов может резко измениться в зависимости от того, какой из них загружается первым из другого места.
  4. Библиотеки меняют API резко и внезапно, поэтому вам нужно требовать определенные младшие номера ревизий для всех ваших зависимостей. Для каждого отдельного приложения Ruby в вашей системе.
  5. Система пакетов rubygems переопределяет "требовать", а не помещать файлы в путь поиска - потому что зачем использовать систему, если ее можно заменить?
1
ответ дан 22 November 2019 в 23:35
поделиться

C # 4.0

Ключевое слово "dynamic", готовое к злоупотреблениям. Если вы хотите / вам нужно использовать Reflection, используйте и сделайте очевидным, что вы его используете, не пытайтесь замаскировать его динамическими.

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

Python:

  1. Нет стандартного набора инструментов GUI (сообщество ходит вокруг да около, но, похоже, так ни к чему и не пришло).

  2. Эволюция инструментов и методов распространения и установки приложений и библиотек Python была, ну, скалистой. (Хотя в последнее время это, кажется, приближается к исправлению).

  3. CPython все еще медленный как интерпретатор (хотя PyPy выглядит довольно хорошо в эти дни, если он станет "стандартным" Python, эта проблема исчезнет).

  4. Вы не можете подклассифицировать встроенные классы (например, list и dict) без переопределения множества методов, даже если все, что вы хотите сделать - это простое подключение к событию (например, чтобы подключить элемент, добавляемый в список или удаляемый из него, вам нужно переопределить delitem, append, extend, insert, pop и remove - нет ни подклассифицируемого уведомления о событии "change", ни "protected" методов, которые бы отменяли общий код, используемый всеми вышеперечисленными методами).

  5. Пока не был изобретен virtualenv, держать на одной машине отдельные среды Python для разных целей было настоящим мучением.

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

Python:

1) синтаксис продолжения строки: «... \» работает, а «... \» - нет, и это конечное пространство обычно невидимо, без необычных eol -маркировка редактором.
2) простое «повышение» невидимо в трассировке стека, поскольку трассировка стека выглядит как предыдущее возбужденное исключение.
3) медленный
4) плохая интеграция с веб-серверами (mod_python: dead, mod_wsgi: ограниченный объем работы). Это усложняется 3], требующим демонизации или некоторого вида сохранения памяти для правильной работы.
5) чрезмерная терпимость к смешанным табуляциям и пробелам, позволяющая иногда скрывать изменения в потоке управления. (возможно, исправлено в последних версиях)

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

Java:

  1. Очень непоследовательно.
  2. Графические API-интерфейсы иногда сложно использовать
  3. NullPointerExceptions не сообщает вам, что такое null
  4. Программы, которые я пишу, иногда не работают на другой JVM, что является огромной проблемой и противоречит Java «Напишите один раз, запустите везде "заявление.
  5. Свинг не так хорош, как должен быть.
1
ответ дан 22 November 2019 в 23:35
поделиться

SAS

  • Никогда не имеет собственных идей (все заимствовано).

  • Жаден до огромных наборов данных.

  • Использует Java, но так и не узнал, что такое объект.

  • Похищает Perl, но скрывает его на этапе обработки данных.

  • Врать всегда со статистиками!

-2
ответ дан 22 November 2019 в 23:35
поделиться
Другие вопросы по тегам:

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