Вы можете добиться того, чего хотите, используя пользовательскую функцию :
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-запрос будет работать!
c #:
1) статические методы должны быть членами класса
2) статические методы расширения могут быть добавлены только к статическим классам
3) Реализация интерфейса функции не помечаются чем-то вроде «переопределить», чтобы показать, что они принадлежат базовому классу или интерфейсу (что затрудняет переопределение ожидаемого метода (с правильной подписью) с помощью простого обзора кода).
Я просто есть 3. Думаю, неплохо.
Python:
Я все еще умеренный пользователь Python, так что мои жалобы могут быть связаны с ограничением знаний или неправильным использованием. Комментарии приветствуются. Я действительно люблю этот язык.
Я видел, как люди жалуются на скорость. Я этого не понимаю. Это язык интерпретации, код не компилируется в машинный код до времени выполнения, такова его природа. Невозможно сравнить скорость интерпретируемого языка с компилируемым. Насколько я могу судить, среди языков интерпретации / сценариев python не медленный.
C ++ отсутствие хороших инструментов рефакторинга, отсутствие проверенных исключений
Java отсутствие шаблонов, отсутствие ключевого слова const
PHP
И гораздо более субъективно:
Common Lisp
Интересно, на что будет похож строго типизированный lisp
C#
dynamic
должен решить большую часть этой проблемы, но он еще не выпущен.
диализатор (1)
для обнаружения
расхождения. Динамическая типизация
также считается медленным; lists (3)
довольно скудный, иногда
Мне не хватает полезных функций для обработки списков
(например, как в Data.List
в Haskell); ,
в конец каждого оператора
в пункте и .
в конце последнего. Python , еще раз:
Нет ключевого слова переключателя. И НЕТ, словарь ему не заменяет. Ни даже кучу заявлений elif
.
Несогласованная обработка разрыва строки. Почему я могу сделать:
test = (1,
2,
3)
А не:
из цикла импорта itertools,
Ислиса
izip
Почему я не могу сделать:
если что-то \
и foo \
или бар:
return "Строка в формате% (arg) s"% \
{'arg': "кровавая косая черта"}
без использования косой черты?
Не существует одного очевидного и единственного способа сделать это. 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
И хуже всего то, что они не делают в точности того же самого. Есть тонкие различия.
Выбор между пробелами и табуляциями. Выбора быть не должно. Выбери, вживи это в камень и перестань сражаться.
Почему вы можете это сделать:
test = {}
test ['foo'] = 0
но не:
test = []
test [] = 0
P.S: "" .join (l)
прекрасные люди. Прекратите жаловаться на это, это не очевидно, но, имея в виду шаблон итератора, это как раз правильный способ сделать это.
Условия Common Lisp
C #
IComparable
vs. IEquatable
vs. IComparable
vs object. Equals vs. operator == и т. Д. все это требует гораздо больше работы, чем необходимо (особенно для классов коллекций).Очевидно, разработчики языка понимают это, отсюда и различные обходные пути для таких вещей, как linq, foreach и инициализаторы коллекций, которые работают по форме, а не по интерфейсу. const
) использование
является ограниченной, но хорошо известной заменой!) C#
Я знаю, что это глупо, но я бы хотел, чтобы типы данных сами преобразовывались в то, что я хочу, без необходимости добавлять (int)
или Convert.ToInt32
или что-то еще. Это просто сэкономит мне время. И меня раздражает, что если я пишу что-то для вывода int
, а потом оказывается, что мне нужен long
, то часто приходится перебирать и менять все, что я сделал, чтобы это заработало. Просто сделайте это для меня!
Извините, не смог придумать пять, но я новичок, так что, возможно, я вернусь и добавлю больше позже :P
Clojure
Haskell
Иногда система типов кажется отсталой. Что, если я не хочу, чтобы компилятор определял типы для моих переменных? Что, если мне нужно обратное, где выполняется проверка ограничений для указанных переменных? Например, вместо того, чтобы вывести тип элементов списка, он вместо этого проверяет, что все они принадлежат определенному классу типов. Это тонкая, но огромная разница, из-за которой мне сложно программировать пользовательский интерфейс. Это можно сделать, но для этого потребуется больше усилий, чем для некоторых других языков. Haskell хорош для частей, не связанных с пользовательским интерфейсом, но пользовательский интерфейс я оставляю нетипизированному языку.
Разрешение построения бесконечных значений иногда приводит к некоторым действительно досадным ошибкам.
Нет ограничений на мономорфизм.
Обработка байтовых строк иногда кусает меня в задницу, и вы не узнаете об этом, пока ваша программа не выйдет из строя из-за того, что вы неправильно их перепутали. Что-то здесь не так, когда мы теряем информацию о типе, которая должна была предотвратить это.
Классы типов должны автоматически выводиться для тривиальных случаев, таких как типы свидетелей, но там есть большой потенциал для злоупотреблений.
Пять вещей, которые я негодовал в Nemerle :
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
немного облегчают боль, но не намного.
Шестой, бонус:
import
утверждений в Java. При всем при том, Erlang - это радость ^_^
REBOL
REBOL - среди моих любимых языков. Не могу сказать, что у меня есть фаворит, хотя Haskell тоже занимает довольно высокое место.
Его странный синтаксис отпугивает многих разработчиков еще до того, как они попробуют.
используйте [url правил электронной почты] [] уведомить [[ a@b.com http://www.google.com] [ b@c.comhttp://www.yahoo.com]]; Небольшой DSL, который рассылает людям электронные письма об URL-адресах. правила: [ некоторые [ в [ установить электронную почту! установить url url! (изменение адреса электронной почты для отправки / темы [URL-адрес "Отъезд"]) ] ] ] ; Глобальный контекст уведомить: func [[catch] dsl [block!]] [ если не разобрать правила dsl [ выкинуть сделать ошибку! «Вы как-то облажались». ] ]
Рекурсивные диалекты очень легко проверить с помощью PARSE
, но очень сложно оценить. (Здесь могут быть полезны стеки.)
BLOCK!
может делать почти все, что может делать XML. Однако в реальном мире есть XML. Грядущий REBOL 3, надеюсь, исправит многие из этих проблем, за исключением последней.
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 (разработчики фреймворка делают несколько очень хороших замечаний, почему они этого не сделали), но я был бы счастлив, если бы компилятор предупреждал пользователей, которым не нравятся проверенные исключения. можно выключить.
• Сообщество слишком мало. Практически невозможно создать хорошую программу языкового погружения, если поблизости нет другого говорящего.
• Неправильные глаголы. Да, я знаю, что английский и испанский тоже упоминали о них, но квенья был изобретен . Почему все еще нужны неправильные глаголы?
• Нет поддержки Unicode. У меня на компьютере должно быть три разных шрифта Tengwar, прежде чем я смогу читать большинство сообщений, и некоторые из них плохо кернируются. Это не будет большой проблемой, учитывая существование романизированной транскрипции, но Tengwar настолько красив, что вы не хотите его использовать.
• Не на все концепции можно легко сослаться на квенья, что приводит к раздражающим пересказам или обращению к синдаринскому, нуменорскому или (спаси меня Манвэ) клингонскому языку, чтобы донести свою точку зрения.
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, сетью и системой настройки, и это мой язык номер один для того, чтобы поднять и ускорить работу таким образом, чтобы это могло быть поддержано в долгосрочной перспективе.
.Scala:
Моя 5 для Delphi:
По мнению многих, Java работает медленно, но я согласен с определенной степенью ее использования.
Java - это драматично. У них есть много занятий, посвященных одному делу, которым вы хотели заниматься. Но вы знаете свойство гибкости XD.
Поначалу Java - это сложно, но, как всегда, весело.
Когда вы пишете простой код для печати «Hello, World!» ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ JAVA! XD Я уверен, что оправдан.
Java - это смесь, поэтому не говорите, что это исключительно язык ООП.
Их гораздо больше, но я ограничен пятью XD. Спасибо!
Я очень доволен C #, но эти два меня действительно раздражают:
Инициализация на основе конструкторов для неизменяемых классов менее удобна, менее интуитивно понятна (когда вы читаете код, вы не понимаете, что вы assign to what), имеет меньшую поддержку IDE, чем инициализация встроенного объекта. Это неизбежно заставляет вас склоняться к изменяемым классам. Я знаю, что об этом упоминалось ранее, но у меня есть проблемы с синтаксисом инициализации для неизменяемых классов.
переключатель
слишком подробный. Всякий раз, когда я вижу ситуацию, когда переключение было бы правильным, я действительно склонен использовать if..else if ..
только потому, что он более краток (примерно на 30% меньше набора текста). Я думаю, что для switch не должно быть провала, break
должен подразумеваться, а case
должен разрешать список значений, разделенных запятыми.
Пять вещей, которые я ненавижу в C ++
#define STR_LINE2(x) #x
#define STR_LINE(x) STR_LINE2(x)
#define LINE_NUMBER STR_LINE(__LINE__)
Python
VB .NET, но только потому, что VB6 отравил целое поколение программистов
Я работаю в магазине VB .NET, который раньше был магазином VB6, и все работающие здесь люди, которые раньше были разработчиками VB6, упорно отказываются изучать что-либо о .NET. Они пишут, как будто это все еще VB6, и их приложения отстойные, как и приложения VB6. Мой начальник активно препятствует любому использованию LINQ, потому что боится, что это слишком сложно для понимания другими, и это правда, потому что никто не хочет это понимать.
Я думаю, что для всех нас было бы лучше, если бы MS просто выбрала C#, что меня убивает, потому что я считаю, что фигурные скобки значительно уступают многословным закрывающим утверждениям VB.
Переписал это после некоторого размышления ...
Пять вещей, которые я ненавижу в PHP, хотя и люблю его (в произвольном порядке):
Это особенности языка (или их отсутствие), которые меня раздражают, но гораздо более серьезными проблемами являются вещи, связанные с большим количеством людей / сообществ:
Тот факт, что многие люди, которые используют PHP, ничего не знают о программирования и хороших практик в целом и создают действительно беспорядочный код. У JavaScript такая же проблема.
Огромное количество руководств / книг, которые преподают действительно плохие методы и стиль. Это может быть основной причиной №3.
Плохая репутация, которую он приобрел в основном из-за № 3 и № 4.
PHP:
Python