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

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

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 ответов

Пять вещей я ненавижу о Java:

  • Никакие первоклассные функции.
  • Никакой вывод типа.
  • Отсутствие нормальных значений по умолчанию в, например, графики.
  • NullPointerException, не содержащий больше информации о том, что является пустым.
  • быстрое увеличение бессмысленно "настраиваемых" интерфейсов/фабрики платформ/поставщика услуг системы впрыска classes/dependency. Конфигурируемость почти никогда не используется, DRY нарушен в высшей степени, и тетрады кода в размере и половины в четкости.

я знаю, я должен проверить Scala.

182
ответ дан Zarkonnen 27 April 2015 в 07:21
поделиться
  • 1
    Точно, в чем я нуждался, я забыл о ядре.Спасибо! – Tony Bogdanov 15 February 2012 в 20:15

Ruby

  1. Никакой вывод типа
  2. Методы/функции не являются первоклассными объектами
  3. , Объем переменных не является лексическим, хотя объем основных переменных лексический
  4. определение в определении
  5. различие между супер и супер ()
1
ответ дан jmuk 27 April 2015 в 07:21
поделиться
  • 1
    @MikeS. походит на файл CSS, который содержит datepicker, не применяется, или другие правила применяются после. Можете Вы осматривать свое средство выбора даты в Вашем browser' s (Chrome' s, предпочтительно), dev инструменты и видят, какие правила применяются и от где? Если they' ре не там, двойная проверка, чтобы путь к файлу был корректен. – undefined 30 July 2012 в 01:27

Я могу добавить другой для Python:

, Учитывая список l = [l1, l2, ..., ln], тогда repr(l) = [repr(l1), repr(l2), ..., repr(ln)], но str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l)). Это было решено, потому что там мог быть неясными записями в списке как l = ["foo], [bar,", "],["], и str(l) возвратится "[foo], [bar, ], []", который "мог смутить пользователей". Однако это делает str невозможный использовать для того, чтобы просто вывести данные, так как список уничтожает "просто данные дампа в читаемом формате". Augh!

1
ответ дан 2 revs, 2 users 50%Tetha 27 April 2015 в 07:21
поделиться

Perl 5:

  1. Весь действительно хороший материал в наше время, кажется, требует mod_perl, который имеет низкую доступность везде, я хочу пойти.
  2. Некоторая действительно невероятная функциональность может инкапсулироваться в модулях, но что находится под капотом, является часто хрупким или пугающим: фильтры источника, typeglobs, безотносительно Американского лося делают...
  3. DateTime является блестящим, но все еще сделал некоторые очень плохие проектные решения ( не возврат продолжительности секундомера при вычитании двух объектов DateTime )
  4. , Двойные-lifed модули в ядре и на CPAN все еще вызывают конфликты
  5. , авторы модуля все еще помещают интерактивный материал в свои сценарии конфигурации модуля так, чтобы они не могли быть автоматически установлены
3
ответ дан skiphoppy 27 April 2015 в 07:21
поделиться

Python:

  • Медленный для перемалывания чисел. Это не было бы большой частью проблемы кроме него...
  • не идет с простым способом включать код C с Вашей программой, которая автоматически компилируется, когда импортировано.
  • Мы все еще должны жить с глупыми правилами целочисленного деления, пока py3k не вступает во владение.
  • Мы все еще должны жить с положительными героями как IMAP и izip, находящийся в отдельном модуле, пока py3k не вступает во владение.
  • Мы должны сделать, большая работа прежде py3k может вступить во владение.
4
ответ дан Theran 27 April 2015 в 07:21
поделиться
  • 1
    Я могу только сказать что эта гарантия doesn' t проект хорошо для осуществления. Для N == M заключают возможности в корпус столкновения с бесконечным циклом с плохим или низким качеством ' рэнд () ' довольно высоки (и возможности получения, очень долгое время поиска для последних элементов даже с хорошим rand() выше). Я don' t знают, как можно обоснованно ожидать O(n lg n) на практике. В идеальном мире, возможно... – AnT 22 October 2009 в 17:58

C++

  1. требуется так много времени для создания простого отрывка кода.
  2. для (станд.:: вектор:: проход const_iterator = [...]
  3. vector.remove () не удаляет.
  4. вектор push_front () не существует.
  5. заголовочные файлы
  6. Никакая лямбда
  7. Никакой автоматический пустой виртуальный деструктор, если существует по крайней мере одна виртуальная функция.
1
ответ дан user35978 27 April 2015 в 07:21
поделиться

Python:

  • скорость
  • статический анализ (отсутствие)
  • анонимные функции, ограниченные одним выражением
1
ответ дан orip 27 April 2015 в 07:21
поделиться

Python: выбор детали Массива не дает Вам, что Вы попросили.

[1] дает Вам, один элемент
[1:2] дает Вам, один элемент, не [[1], [2]]
[1:3] дает 2 элемента

, я ненавижу это, но возможно это просто, потому что я главным образом работаю в Verilog.

1
ответ дан Marty 27 April 2015 в 07:21
поделиться
  • 1
    ПУСТЫЕ УКАЗАТЕЛИ не хранятся в индексах. Существует возможность разницы в производительности, в зависимости от запроса. – EvilTeach 3 October 2008 в 17:30

Другое голосование за C++ здесь... все еще мой фаворит у нескольких близких подписчиков - C и Python. Вот мой текущий список ненависти без определенного порядка:

  • Изобилие целых типов, наследованных от C - слишком много проблем, вызванных со знаком по сравнению с неподписанными ошибками
  • конструкторы Копии и операторы присваивания - почему компилятор не может создать один из другого автоматически?
  • безумие Аргумента переменной - va_list просто не работает с объектами, и я так сыт по горло проблемами, созданными с sprintf (), snprintf (), vsnprintf (), и все их родственники.
  • Шаблонная реализация требуется, чтобы быть полностью видимой во время компиляции - я думаю об отсутствии реализаций "экспорта" или по крайней мере применимых
  • Отсутствие поддержки свойств - я хочу иметь участника только для чтения как "a.x", который может быть считан публично и только присвоен внутренне. Я действительно ненавижу "val=obj.getX ()" и "obj.setX (val)". Я действительно хочу свойства с управлением доступом и непротиворечивым синтаксисом.
3
ответ дан D.Shawley 27 April 2015 в 07:21
поделиться

Ruby:

  • Значительный пробел. Для интерпретатора конца строки = конец оператора, если это не похоже на оператор, должен продолжиться (или Вы явно выходите из новой строки).
  • Медленный
  • Онлайн-документация, не столь хорошая как Python (в защите, Python превосходен)
  • , я упоминал медленный?
1
ответ дан Joshua Swink 27 April 2015 в 07:21
поделиться

Я чувствую, что любимый язык невозможно выбрать. Динамический контроль типов и статический контроль типов не могут вполне быть сравнены, таким образом, я просто перечислю который, из которых я использую

C++:

  • Шаблонный синтаксис метапрограммирования ужасен. Неявное ::value сделало бы его намного более кратким
  • ->., Почему компилятор не может выяснить, что я делаю ptr.thing и просто делаю -> для меня?
  • я ненавижу пробел. Таким образом, целое vector<vector<int>> должно быть vector<vector<int> >, заставляет меня дрожать, и затем я не могу сфокусироваться каждый раз, когда я вижу, что строка кода и заканчиваю тем, что пытался выяснить способ использовать int[][] или что-то
  • Макросы. Я лично люблю понятие макросов. Но с C++, я, что система является взломом
  • , я - ненавистник ;

Python:

  • Строки, являющиеся неизменным. Делает его так, я не могу только сделать строки [4] = Списки "b"
  • , неявно скопированные ссылкой. Который просачивается в [[0] *width] *height проблемы
  • Отсутствие хвостовой рекурсии (я должен был подстроить НЕАКТИВНЫЙ для не выкладывания 1000-х сообщений об ошибках каждый раз, когда я ввел рекурсивную функцию с опечаткой)
  • ключи Словарей, не принимающие Отсутствие lists/dicts
  • глубоких объемов. Когда я делаю понимание списка, я не хочу, чтобы переменная в нем влияла на внешний объем
1
ответ дан 2 revs, 2 users 80%Demur Rumed 27 April 2015 в 07:21
поделиться
  • 1
    Я удалил класс в целом. $('#ui-datepicker-div').removeClass('ui-helper-hidden-accessible'); для того же эффекта. – Milo LaMar 31 August 2012 в 18:16

Дельфи:

  • IDE немного нестабилен.
  • понимание Кода иногда путается.
  • Отладка иногда является багги.
  • Обновление нескольких файлов проекта может быть громоздким.
  • При запуске, когда один или несколько пакетов недоступны, сообщение об ошибке несколько раз выталкивается.
17
ответ дан Toon Krijthe 27 April 2015 в 07:21
поделиться
  • 1
    Спасибо - это работает на меня. Кто-либо знает, почему jqui диалоговое окно перемещает те средства управления из формы? Они принимающий Вас don' t хотят элементы UI в диалоговом окне, ОТПРАВЛЕННОМ на сервер? – russau 10 March 2010 в 22:03

Язык Common LISP:

  1. Ключевые слова часто слишком многословны.
  2. поддержка Библиотеки является жалкой.
  3. не работает хорошо в Ose, которые хотят обработать память более строго.
  4. не имеет хороших средств для взаимодействия с ОС.
  5. средство "цикла" не четко определено, и уверенный не смотрит Lispy.
24
ответ дан David Thornley 27 April 2015 в 07:21
поделиться

числа JavaScript

  1. как строки - Математика может быть печальной, когда числа являются intpreted как строками. 5 + 2 = 52? Grrr...
  2. полномочия - весь лучший материал требует разрешения от пользователя!
  3. экранные обновления - браузер должен быть в устойчивом состоянии для обновления экрана. Кажется, нет способа вынудить экран обновить посреди сценария.
  4. Медленный - хотя Chrome Google хорош...
  5. различия в Браузере делают использование языка [подвергнутым цензуре].
23
ответ дан 2 revs, 2 users 91%BoltBait 27 April 2015 в 07:21
поделиться
  • 1
    отметьте I' m выполнение двойных знаков фунта при необходимости для выхода из него. Для незнакомых, CF использует знаки фунта вокруг переменных для вывода. – Steve 11 October 2010 в 19:28

Python:

  • Отсутствие статического контроля типов
  • обработка Параметра по умолчанию (конкретно то, что Вы можете изменение параметр по умолчанию для будущих вызывающих сторон!)
  • Слишком много необходимых подчеркиваний (конструкторов нужно вызвать __init__)
  • Отсутствие надлежащих членов парламента, не занимающих официального поста и функций (в соглашении просто говорится, что большинство вещей, которые запускаются с подчеркивания, частное, за исключением всего материала как __getattr__, который не является)
  • Забавный синтаксис для print луг в файл (но они фиксируют это в Python 3)
34
ответ дан 3 revs 27 April 2015 в 07:21
поделиться

PHP:

  • никогда нельзя быть уверенным, что бесспорный почти распространенный расширения доступны на всех веб-серверах.
  • попытки быть всем в будущем (goto, закрытия...)
  • много угроз безопасности для неопытных пользователей
  • [еще 115] перегрузка оператора была бы хороша
  • все бедные программисты, которые не изучают, как заставить его работать правильно и дать ему дурную славу

, Тем не менее, PHP (сценарии) язык.;-)

20
ответ дан 2 revs, 2 users 93%okoman 27 April 2015 в 07:21
поделиться
  • 1
    управление вызывает обратную передачу сама форма или кнопка? В этом экземпляре это - модальное диалоговое окно, таким образом, нет никакой кнопки отправки. Я попытался добавить, что моя собственная кнопка отправки вместо того, чтобы переопределить один из jQuery генерировала кнопки также, но это didn' t работают также. – mancmanomyst 20 February 2009 в 09:28

PHP

  1. Никакие функции отладки, если Вы не управляете сервером, и даже тогда ими отчасти, не сосут
  2. , экстремальная сумма плохого кода PHP, плавающего вокруг, дает всем PHP программистам дурную славу
  3. Непоследовательная функция, называющая
  4. Неспособность иметь статическую переменную определенного типа, если я хочу один (я - большой поклонник динамического контроля типов 90% времени)
  5. , REGISTER_GLOBALS является дьяволом
26
ответ дан MattBelanger 27 April 2015 в 07:21
поделиться

C (хорошо, это не мой фаворит, но это еще не было сделано.)

  • синтаксис библиотеки Socket.
  • Никакая перегрузка функции.
  • строки C-стиля.
  • Переполнение буфера.
  • Загадочный синтаксис. Я не знаю, сколько раз я искал материал как atoi, хлопнул мой лоб и кричал, "Конечно!"

РЕДАКТИРОВАНИЕ: Я мог, вероятно, придумать больше, если бы я обратился к большему количеству кода библиотеки (как, я сделал с сокетами, но те особенно плохи), но я уже чувствовал, что обманывал для того, чтобы выбрать C. Столько языков существует только, чтобы взять хорошие части C и заменить плохое, что он отчасти похож на избиение мертвой лошади.

25
ответ дан 4 revsBill the Lizard 27 April 2015 в 07:21
поделиться

Ruby является моим любимым языком, вот то, что я не люблю:

  • потоки Green + блокирующиеся библиотеки C = гигантский сбой
  • ТАК КРАЙНЕ МЕДЛЕННЫЙ
  • сама стандартная библиотека несовместима со своим использованием удара! методы
  • Модуль включает +, расширяются, грязно.
  • "Открытые Классы" не могут быть ограничены по объему - я хочу добавить String#dostuff, но я не хочу, чтобы это просочилось во все сторонние библиотеки
  • Никакое двоичное развертывание упаковочное решение.
18
ответ дан 2 revs, 2 users 88%Orion Edwards 27 April 2015 в 07:21
поделиться
  • 1
    @russau рассуждает для добавления к телу, объясненному в forum.jquery.com/topic/… - в основном it' s единственный гарантируемый путь к z-индексу это правильно в IE – drzaus 30 October 2013 в 15:33

Ошибки/Исключения Python

  • неопределенны при отладке
  • , я не использую его на работе
  • , использование __ init __, __ repr __, __ str __, и т.д. в классах
  • не Может просто скомпилировать исполняемый файл (.exe или иначе)
  • Некоторая другая вещь, которую я не попытался делать все же, но я уверен, будет прослушивать меня

И всем тем программистам языка C-выхода, сам имеет больше смысла мне, чем это, потому что объект относится к сам

4
ответ дан dragonjujo 27 April 2015 в 07:21
поделиться
  • 1
    После борьбы с этой проблемой все утро, я столкнулся с этим, и это работает отлично. Я люблю 1 строку, фиксирует. – hacker 30 March 2009 в 19:15

C++

  • Строки.
    Они не совместимы со строками платформы, таким образом, Вы заканчиваете тем, что использовали станд.:: векторная половина времени. Политика копии (копия на записи или глубоко копируют) не определяется, таким образом, гарантии исполнения не могут быть даны для простого синтаксиса. Иногда они полагаются на алгоритмы STL, которые не очень интуитивны для использования. Слишком много библиотек прокручивают свои собственные, которые, к сожалению, намного более удобны для использования. Если Вы не должны комбинировать их.

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

    • универсальный LPCTSTR,
    • LPC (W) STR, выделенный CoTaskMemAlloc,
    • BSTR, _bstr _t
    • (w) строка,
    • CString,
    • станд.:: вектор
    • roll-my-own класс ( вздох ), который добавляет проверку диапазона и основные операции к (w) символу * буфер известной длины
  • модель Build.
    я болен к смерти от все время потраченного запутывания вокруг с who-includes-what, предописаниями, оптимизация предварительно скомпилированных заголовков и включаю для хранения, по крайней мере, возрастающего времени изготовления терпимым и т.д. Это было большим в восьмидесятых, но теперь? Существует столько препятствий к собиранию части кода, таким образом, это может быть снова использовано, что даже собака мам скучает, слушая меня.

  • Трудно для парсинга
    Это делает внешние инструменты особенно трудно, чтобы записать, и разобраться. И сегодня, мы парням C++ недостает главным образом набора инструментальных средств. Я люблю свое отражение C# и делегатов, но я могу жить без них. Без большого рефакторинга я не могу.

  • Поточная обработка слишком трудна
    , Язык даже не распознает его (к настоящему времени), и свободы компилятора - в то время как большой - к болезненному.

  • Статическая и инициализация по запросу Технически, я обманываю здесь: это - другая часть загадки в, "оборачивают код для повторного использования": это - кошмар для получения чего-то, инициализировал только, когда это необходимо. Лучшее решение всех других redist проблем бросает все в заголовки, эта проблема говорит "neeener - Вы не можете".

<час>

Предоставленный, многое из этого вне строгого объема языка, но IMO весь набор инструментальных средств должен быть оценен и должен развиться.

36
ответ дан 3 revs, 3 users 93%peterchen 27 April 2015 в 07:21
поделиться

JavaScript:

  • Object прототип может быть изменен. Каждый объект в Вашей программе получает новые свойства, и что-то, вероятно, повреждается.

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

  • Никакое объектное закрытие во время ссылки на функцию. На самом деле никакое объектное закрытие вообще - вместо этого, this не установлено каждый раз, когда функция вызвана с объектной нотацией или new оператор. Результаты в большом количестве беспорядка, особенно при создании обратных вызовов события, потому что this не установлен на то, что ожидает программист.

    • Заключение: вызов функции без [1 116] объектная нотация или new оператор приводит к this устанавливаемый равный глобальному объекту, приводящему к большой поломке.
  • Оператор сложения, перегруженный, чтобы также выполнить конкатенацию строк, несмотря на эти две операции, являющиеся существенно отличающимся. Результатами в боли, когда значение Вы ожидаете быть числом, является на самом деле строка.

  • == и != операторы выполняют приведение типа. Сравнения между различными типами включают список правил, что никакой смертный не может помнить полностью. Это смягчено существованием === и !== операторы.

  • И null и undefined существуют, с тонко различными, все же избыточными значениями. Почему?

  • Странный синтаксис для установки цепочек прототипа.

  • parseInt(s) ожидает число C-стиля, таким образом, значения обработок с продвижением обнуляют как восьмеричные и т.д. Вы можете [по крайней мере 1 114], но поведение по умолчанию сбивает с толку.

  • Никакая область действия блока.

  • Может объявить ту же переменную несколько раз.

  • Может использовать переменную, не объявляя его, в этом случае это глобально и вероятно повреждает Вашу программу.

  • with { }.

  • Действительно трудный к документу с JavaDoc как инструменты.

35
ответ дан 2 revsDaniel Cassidy 27 April 2015 в 07:21
поделиться

C++

  1. Шаблонный Синтаксис
  2. Ромбовидные проблемы Наследования
  3. изобилие/отсутствие стандартных библиотек, которые имеют современные языки (хотя повышение приближается).
  4. IOStreams
  5. синтаксис, используемый вокруг Пробелов Python

    1. IOStreams

    , (иногда) значим
  6. подчеркнутые ключевые слова
  7. Ограниченная поддержка потока (по крайней мере, в настоящее время)
  8. "сам" вместо "этого"
  9. , Пробелы (иногда) значимы
40
ответ дан grieve 27 April 2015 в 07:21
поделиться

Objective C

1) Никакие пространства имен, просто ручные соглашения о присвоении имен - я не возражаю, что с точки зрения разделения класса, но я действительно пропускаю способность импортировать все определения классов в пространстве имен в одной строке (как импорт com.me.somelibrary.*).

2) Библиотеки все еще имеют некоторые дыры в важных областях как поддержка RegEx.

3) синтаксис Свойства немного неуклюж, требуя, чтобы три строки (в двух отдельных файлах) объявили свойство.

4) мне нравится сохранить/выпустить модель, но это легче, чем это должно быть должно выпустить ссылку и затем случайно использовать его позже.

5), Хотя не действительно функция языка, XCode так переплетен с использованием Objective C, я не могу сдержать взгляды о том аспекте... в основном автозавершение, очень сомнительно. Это больше похоже на систему, которая вознаграждает Вас за нахождение чего-то, что Вы хотите, существует, и затем представляет его как выбор впоследствии. Но тогда я предполагаю, что мне никогда не нравились механизмы автоматического заполнения.

37
ответ дан 3 revs, 3 users 79%Kendall Helmstetter Gelner 27 April 2015 в 07:21
поделиться

Вот некоторые вещи, которые я не люблю о Java (который не является моим любимым языком):

  • стирание типа Дженериков (т.е. никакие овеществленные дженерики)
  • Неспособность поймать несколько исключений (различных типов) в единственном блоке выгоды
  • Отсутствие деструкторов (завершают () является очень плохой заменой)
  • Никакая поддержка закрытий, или рассматривающие функции как данные (анонимные внутренние классы являются очень подробной заменой)
  • Контролируемые исключительные ситуации в целом, или более конкретно, делая неисправимые исключения проверенными (например, SQLException)
  • Никакая поддержка уровня языка литеральных наборов
  • Никакой вывод типа, когда конструкторов универсальных классов вызывают, т.е. параметр (параметры) типа должен быть повторен с обеих сторон '='
50
ответ дан 4 revsDon 27 April 2015 в 07:21
поделиться
  • 1
    Очень хороший! Can' t ожидают для попытки его. – Shane 3 March 2010 в 04:09

Я сделаю PHP, поскольку мне время от времени нравится он, и Python будет сделан слишком очень.

  • Никакое пространство имен; все находится в своего рода очень большом пространстве имен, которое является адом в больших средах

  • Отсутствие стандартов когда дело доходит до функций: функции массива берут иглу в качестве первого аргумента, стог сена как вторую (см. array_search). Строковые функции часто берут стог сена сначала, вторая игла (см. ремни для правки бритв ). Другие функции просто используют различные схемы именования: bin2hex, strtolower, cal_to_jd

    Некоторые функции имеют странные возвращаемые значения, из того, что нормально: Это вызывает, Вы для имения третьей переменной объявили откуда ни возьмись, в то время как PHP мог эффективно интерпретировать пустой массив как ложь с ее манипулированием типа. Нет близость никаких других функций, делающих то же.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • язык (до PHP6) прилагает все усилия для уважения почти отсталой обратной совместимости, заставляя его нести плохие методы и функции вокруг если не необходимого (см. mysql_escape_string по сравнению с mysql_real_escape_string).

  • язык, развитый от языка шаблонной обработки до полного бэкенда один. Это означает, что кто-либо может произвести что-либо, когда они хотят, и этим злоупотребляют. Вы заканчиваете с движками шаблонов для языка шаблонной обработки...

  • Это сосет при импорте файлов. У Вас есть 4 различных способа сделать это (включайте, include_once, потребуйте, require_once), они являются все медленными, очень медленными. На самом деле целый язык является медленным. По крайней мере, довольно медленнее, чем Python (даже с платформой) и RoR от того, что я собираю.

я все еще как PHP, все же. Это - цепная пила веб-разработки: Вы хотите малый и средний сайт, сделанный очень быстро и быть уверенными, что кто-либо может разместить его (хотя конфигурации могут отличаться)? PHP тут же, и это настолько повсеместно, требуется только 5 минут для установки полного стека LAMP или WAMP. Ну, я возвращаюсь к работе с Python теперь...

58
ответ дан 4 revs, 3 users 94%I GIVE TERRIBLE ADVICE 27 April 2015 в 07:21
поделиться

Perl

  • Смешанное использование символов

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • Например, ни один из них не то же:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    В Perl6 это записано:

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • Отсутствие истинного OO

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    В Perl6 это записано:

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • Плохо разработанные regex функции

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    В Perl6 это записано:

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • Отсутствие нескольких диспетчеризирует

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    В Perl6 это записано:

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • Плохая перегрузка Оператора

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    В Perl6 это записано:

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    
72
ответ дан 11 revs, 3 users 97%Brad Gilbert 27 April 2015 в 07:21
поделиться

Обработка строк C

  • .

Необходимость иметь дело вручную со строковыми буферами является подверженной ошибкам болью. Так как такое вычисление действительно перемещает и изменяет строки (компьютеры не используются вполне так же для большого материала перемалывания чисел, как люди думали, что они будут путем назад, когда), будет действительно хорошо быть в состоянии использовать управляемые языки, или строка C++ возражает для контакта с ними. Когда я должен выполнить в нем прямо C, как плавать в плывуне.

113
ответ дан Michael Burr 27 April 2015 в 07:21
поделиться
  • 1
    Спасибо! It' s работающий на меня теперь. – Christian Aichinger 4 October 2008 в 13:09

Ruby имеет много дефектов, связанных с его скоростью, но я не ненавижу тех. Это также имеет дефекты с евангелизмом сообщества, идущим за борт, но это действительно не беспокоит меня. Это то, что я ненавижу:

  • Закрытия (блоки) имеют 4 различных синтаксиса создания, и ни один из них не оптимален. Изящный синтаксис является неполным и неоднозначным с хешами, и полный синтаксис ужасен.
  • сообщество склонно быть против реальной документации, одобряя ‘read code’. Я нахожу это ребяческим и ленивым.
  • злоупотребление Метапрограммирования, особенно в библиотеках, делает ошибки кошмаром для разыскивания.
  • На связанной ноте, распространяющееся метапрограммирование делает всесторонний IDE трудным, если не невозможный, для создания.
  • способ, которым сделана передача блока функциям, глуп. Нет никакой причины, блоки должны быть переданы вне списка параметров или иметь нечетный специальный синтаксис для доступа (уступают). Я имею мнение, что блокам нужно было дать менее неоднозначный синтаксис (или хеши, возможно, использовали различные разделители; возможно, <>, а не {}), и передающий как параметры методам должен был быть точно так же, как все другие параметры.

    object.method(1, {|a| a.bar}, "blah")
    

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

73
ответ дан 3 revs, 3 users 77%Myrddin Emrys 27 April 2015 в 07:21
поделиться

C#/.NET:

  • Классы должны быть изолированы значением по умолчанию
  • не должно быть никакого lock оператор - вместо этого, у Вас должны быть определенные объекты блокировки, и должны быть методы такой как Acquire, которые возвращают доступные маркеры блокировки. Заключение: не должно быть монитора для каждого объекта.
  • GetHashCode() и Equals() не должен быть в System.Object - не все подходит для хеширования. Вместо этого имейте IdentityComparer, который делает то же самое и сохраняет IComparer<T>, IComparable<T>, IEqualityComparer<T> и IEquatable<T> интерфейсы для пользовательских сравнений.
  • Плохая поддержка неизменности
  • Плохой способ обнаружить дополнительные методы - это должно быть намного более сознательное решение, чем просто то, что я использую пространство имен.

Те были первое, что пришло на ум - спрашивают меня завтра, и я придумаю различные 5:)

129
ответ дан Jon Skeet 27 April 2015 в 07:21
поделиться
  • 1
    Doesn' t работа для меня, посмотрите мое редактирование вопроса. Дальнейшие идеи? – Christian Aichinger 4 October 2008 в 12:23
Другие вопросы по тегам:

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