Какие у вас языковые зависания?

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

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

Что ж, я виноват как следующий парень, если не больше. Вот оно:

  • Ruby: Во всех примерах кода Ruby, которые я вижу, используется команда puts, и это своего рода детский анатомический термин на идише. В результате я не могу серьезно относиться к коду Ruby, хотя должен.
  • Python: В первый раз, когда я увидел это, я ухмыльнулся всей этой значимой штуке с пробелами. Я избегал этого в течение следующих нескольких лет. Сейчас больше ничем не пользуюсь.
  • Java: Мне не нравятся идентификаторы ThatLookLikeThis. Я не уверен, почему именно.
  • Лисп: У меня проблемы со всеми круглыми скобками. Вещи разной важности и назначения (объявления функций, присвоения переменных и т. Д.) Синтаксически не различаются, и мне лень узнавать, что к чему.
  • Фортран: все прописные буквы режут мне глаза. Я знаю, что современный код не нужно писать так, но большинство примеров кода ...
  • Visual Basic: меня беспокоит, что Dim используется для объявления переменных, поскольку я помню старые добрые дни GW-BASIC, когда он только использовался для измерения массивов.

Какие языки мне показались на первый взгляд подходящими? Perl, C, QBasic, JavaScript, ассемблер, оболочка BASH, FORTH.

Хорошо, теперь, когда я проветрила свое грязное белье ... Я хочу услышать твое. Какие у вас проблемы с языком? Какие внешние особенности вас беспокоят? Как вы их преодолели?


person Community    schedule 02.10.2008    source источник
comment
Я согласен с Python, но я все еще избегаю его. Я бы тоже избегал Haskell - за исключением того, что он позволяет вам переопределить пробелы и использовать фигурные скобки, что я всегда делаю.   -  person finnw    schedule 09.10.2008
comment
Что ж, я должен повторить, что я очень рад, что преодолел свое зависание с пробелами Python. :)   -  person Dan Lenski    schedule 09.10.2008
comment
Что ж, использование пробелов в Python, похоже, налагает ограничения: почему лямбда может принимать только один оператор?   -  person Svante    schedule 21.11.2008
comment
Скобки? Какие скобки? Я не замечал скобок с первого месяца программирования на Лиспе. Я люблю спрашивать людей, которые жалуются на скобки в Лиспе, не беспокоят ли их все пробелы между словами в газете ...   -  person Svante    schedule 21.11.2008
comment
Харлекин, если ты прочитал то, что я написал, меня беспокоят не сами скобки, а то, что они все одинаковы. Мне сложно концептуально различать разные конструкции без визуальных подсказок.   -  person Dan Lenski    schedule 21.11.2008
comment
Разве это не идишский термин «путц»? Я никогда не видел, чтобы это было написано как «ставит». Думаю, я говорю, что никогда бы не подумал так произносить «пут».   -  person Telemachus    schedule 22.02.2009
comment
Прописные буквы в фортране отказались от F90 (около 1990 г.), и даже некоторые компиляторы F77 имели возможность этого избежать. Так что вы можете удалить это. Если вы обычно не используете код FORTRAN IV.   -  person Rook    schedule 23.02.2009
comment
Сванте: они меня тоже беспокоят. Телемах: Вы правы. Питон-фобы: пейте Kool-Aid, он вас не убьет. SO-meta: Нам нужна «веская причина»: автор не такой смешной, как он думает. :)   -  person jmucchiello    schedule 18.09.2009
comment
Puts определенно произносится иначе, чем putz. Буква «u» в обоих словах звучит по-разному.   -  person Dean J    schedule 02.12.2009


Ответы (37)


Я ненавижу НЕНАВИЖУ НЕНАВИЖУ "End Function", "End IF" и "If ... Then" части VB. Я бы предпочел вместо этого фигурную скобку.

person Community    schedule 02.10.2008
comment
По крайней мере, у него есть одно преимущество - вы можете видеть, какая конструкция заканчивается, без необходимости искать подходящую скобку, которая может быть вне верхней части экрана. - person Hugh Allen; 25.10.2008
comment
Несколько вложенных END IF в VB будут иметь ту же проблему ... Я обычно использую комментарии к закрывающей скобке в коде со многими вложенными блоками, например // end для y и т. Д. - person Jared Updike; 29.10.2008
comment
Я тоже ненавижу END Funtions. Я предпочитаю синтаксис bash (if / fi, case / esac) или фигурные скобки ... - person Seiti; 03.11.2008
comment
Да, я действительно ненавижу многословный VB. - person cdmckay; 22.02.2009
comment
Сеити: Вы хотели бы видеть NOITCNUF в конце функции? А ЭРУДЕКОРП? и SSALC? Как насчет ECAFRETNI? Для языков POO (э-э, я имею в виду ООП)? - person jmucchiello; 18.09.2009

Несоответствие имени функции PHP.

// common parameters back-to-front
in_array(needle, haystack);
strpos(haystack, needle);

// _ to separate words, or not?
filesize();
file_exists;

// super globals prefix?
$GLOBALS;
$_POST;
person Community    schedule 02.10.2008
comment
Вау, я только что прочитал свой пример комментария // _ для разделения слов или нет? и понял, что слово «отдельный» - хотя всегда имеет одно и то же значение - произносится по-разному в двух разных контекстах. Один похож на задание, а другой - на компаратор ... Я полагаю, что английский тоже довольно плохой. - person Dean Rather; 02.10.2008
comment
Да, я не понимаю, почему они просто не сохраняют все функции, которые загрязняют глобальное пространство имен (например, strpos и т. Д.), Но также включают новые классы, которые их очищают (например, класс String, класс Number и т. Д.) .) - person cdmckay; 22.02.2009
comment
В этом отношении несоответствия именования Python. Это единственное, что я дам Java. ВСЕ на Java названо правильно. - person Instance Hunter; 28.02.2009
comment
За исключением того, что иногда .length, иногда .length(), а иногда .getLength() ~ - person Pavel Minaev; 02.12.2009
comment
Если бы только именование было худшим из несоответствий PHP! - person EMP; 02.12.2009
comment
@Dean, если вы еще этого не видели: stackoverflow.com/questions/282329/. - person Jeff Sternal; 02.12.2009
comment
(Или, на самом деле, возможно, нет. Интересно. Английский иногда бывает странным.) - person TRiG; 26.05.2011

Мне никогда не нравились ключевые слова, написанные задом наперед в некоторых скриптовых оболочках.

если-то- fi достаточно плохо, но case-in- esac становится просто глупым

person Community    schedule 02.10.2008
comment
Хех, я должен согласиться с вами в этом ... и почему циклы for и while заканчиваются на done, а не на rof или elihw :-P - person Dan Lenski; 02.10.2008
comment
Я так хочу язык, где rofl - ключевое слово - person Earlz; 02.12.2009

Я просто подумал о другом ... Я ненавижу бессмысленные URL-адреса, используемые в XML для определения пространств имен, например xmlns="http://purl.org/rss/1.0/"

person Community    schedule 02.10.2008
comment
Мне действительно нравится это решение. URL-адреса вряд ли будут конфликтовать (поскольку вы фактически должны приобрести доменное имя), и он предоставляет значимый указатель на то, куда вы должны пойти, чтобы узнать о значении тегов в этом пространстве имен (хотя нет требования, чтобы ресурс действительно существовал.) - person SingleNegationElimination; 22.04.2011

Begin и End Паскаля. Слишком многословен, не соответствует скобкам, и, что еще хуже, нет Begin для каждого End, например.

Type foo = Record
    // ...
end;
person Community    schedule 02.10.2008
comment
Любая IDE Pascal / Delphi, достойная ее соли, будет соответствовать begin..end в квадратных скобках, и многие продвинутые текстовые редакторы также делают это. У меня есть (он также соответствует If...Then..End If в скобках на БЕЙСИКЕ и т. Д.). - person Pavel Minaev; 02.12.2009

Хотя я в основном разработчик PHP, мне не нравятся языки, которые не позволяют мне делать достаточно встроенных функций. Например.:

$x = returnsArray();
$x[1];

вместо

returnsArray()[1];

or

function sort($a, $b) {
    return $a < $b;
}
usort($array, 'sort');

вместо

usort($array, function($a, $b) { return $a < $b; });
person Community    schedule 02.10.2008
comment
Последнее возможно в php 5.3. - person moo; 02.12.2009
comment
а как насчет $(returnsArray())[1]? - person Radagast the Brown; 26.03.2011

Мне нравится объектно-ориентированный стиль. Поэтому в Python меня беспокоит то, что я вижу len (str) для получения длины строки или разбиение строк, например, split (str, "|") на другом языке. Это нормально в C; у него нет объектов. Но Python, D и т. Д. Имеют объекты и используют obj.method () в других местах. (Я по-прежнему считаю Python отличным языком.)

Непоследовательность - еще одна большая проблема для меня. Мне не нравится непоследовательное именование в одной и той же библиотеке: length (), size (), getLength (), getlength (), toUTFindex () (почему не toUtfIndex?), Constant, CONSTANT и т. Д.

Иногда меня беспокоят длинные имена в .NET. Разве они не могут как-то сократить DataGridViewCellContextMenuStripNeededEventArgs? А как насчет ListViewVirtualItemsSelectionRangeChangedEventArgs?

И я ненавижу глубокие деревья каталогов. Если у библиотеки / проекта есть 5-уровневое дерево каталогов, у меня с ним возникнут проблемы.

person Community    schedule 22.02.2009
comment
Шутки в сторону. Зачем делать его на 99% объектно-ориентированным, а затем без видимой причины бросать туда какой-то случайный не объектно-ориентированный материал? ГАХ! - person Instance Hunter; 28.02.2009
comment
Я так идентифицирую себя с тобой. По какой-то непонятной причине я сейчас нахожусь в java - где веб-проекты начинаются с пятиуровневым деревом каталогов - прежде, чем вы сможете написать одну строку кода ... - person Radagast the Brown; 12.03.2011
comment
одна из самых раздражающих вещей в любом объектно-ориентированном языке. - person Roja Buck; 14.04.2011

Синтаксис C и C ++ немного необычный. Они повторно используют операторов для разных целей. Вы, вероятно, настолько привыкли к этому, что не думаете об этом (и я тоже), но подумайте, сколько значений имеют круглые скобки:

int main()        // function declaration / definition
printf("hello")   // function call
(int)x            // type cast
2*(7+8)           // override precedence
int (*)(int)      // function pointer
int x(3)          // initializer
if (condition)    // special part of syntax of if, while, for, switch

И если в C ++ вы видели

foo<bar>(baz(),baaz)

вы не смогли бы понять значение без определения foo и bar.

  • ‹и> могут быть экземпляром шаблона или могут быть меньше или больше (необычно, но допустимо)
  • () может быть вызовом функции или просто окружать оператор запятой (т. е. выполнить baz () для эффектов размера, а затем вернуть baaz).

Глупо то, что другие языки скопировали некоторые из этих характеристик!

person Community    schedule 02.10.2008
comment
Последовательное и разумное использование пробелов может помочь прояснить некоторые двусмысленности ... но никого это не волнует. - person yodie; 02.12.2009
comment
@yodie: за исключением того, что это не так. Пробел может указывать на то, что имел в виду автор, но он не сообщает компилятору, что на самом деле делать то, что автор пытался ввести. - person SingleNegationElimination; 17.05.2011
comment
Правильно. Он проясняет это для читателей (включая автора), но не для компилятора. Тем не менее, я обнаружил, что мое сообщение имеет тенденцию быть более ясным для компилятора, когда я правильно форматирую, потому что я ловлю свои ошибки (или не буду их делать). - person yodie; 17.05.2011

Java и ее проверенные исключения. Я на время оставил Java, живя в мире .NET, но недавно вернулся.

Иногда кажется, что мое предложение throws более объемно, чем содержание моего метода.

person Community    schedule 02.10.2008
comment
Конструктор исключений java имеет параметр причины, чтобы вы могли создавать цепочки исключений именно для предотвращения этого. Вы должны выдавать только исключения, которые актуальны на уровне абстракции вашего класса. - person Wim Coenen; 22.02.2009

Нет ничего в мире, что я ненавижу больше, чем php.

  1. Переменные с $, это один лишний нечетный символ для каждой переменной.
  2. Доступ к членам осуществляется с помощью -> без видимой причины, по одному дополнительному символу для каждого доступа к члену.
  3. На самом деле языковой урод.
  4. Нет пространств имен.
  5. Строки объединяются с ..
  6. Уродство языка.
person Community    schedule 02.10.2008
comment
Теперь, когда я так думаю,. не может использоваться вместо - ›потому что это конкатенация ... ммм ... - person asterite; 02.10.2008
comment
А дополнительные символы ($ и ›) требуют нажатия клавиши Shift, что раздражает и увеличивает количество опечаток. - person Jared Updike; 29.10.2008
comment
не так много, если вы не думаете, что операторы в языке программирования должны быть интуитивно понятными. В большинстве правильных объектно-ориентированных языков есть. для доступа к члену и + для конкатенации строк. Таким образом, вы ожидаете аналогичного поведения. Но тогда php - это не объектно-ориентированный язык, не говоря уже о собственном языке. - person Vasil; 24.02.2009
comment
Что такое правильный объектно-ориентированный язык? Существует множество объектно-ориентированных языков, в которых ни один из них не используется. ни - ›для доступа к элементам данных. А что такое правильный язык? Покажи мне определение. Brainfuck чрезвычайно последовательна. Это правильный язык? - person jmucchiello; 18.09.2009
comment
Я бы предположил, что в языках, которые имеют как изменяемые типы значений, так и изменяемые ссылочные типы, наличие разных символов для доступа к членам, вероятно, является хорошей вещью. - person supercat; 29.08.2011

Все [] и @s в Objective C. Их использование настолько отличается от базового синтаксиса языка C, что, когда я впервые их увидел, у меня сложилось впечатление, что вся объектная ориентация была неуклюже закреплена на заднем плане.

person Community    schedule 28.02.2009
comment
Меня это пугает, это C, но это не дедушка C - person seanb; 02.12.2009
comment
Его прикрутили запоздалая мысль. Он начинался в основном как препроцессор для C. @ были там, потому что @ не было законным для чего-либо еще, поэтому они могли быть уверены, что любое новое ключевое слово, начинающееся с @ (@interface, @implementation и т. Д.), Не будет конфликтовать с любые ключевые слова C. Objective-C ужасно уродлив, что прискорбно, потому что лежащая в основе объектно-ориентированная модель и фреймворки довольно хороши. - person Kristopher Johnson; 28.06.2010

Я ненавижу стандартную многословность Java.

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

Те, которые связаны с соглашением Java об использовании veryLongVariableNames, иногда заставляют меня думать, что я вернулся в 80-е и писал IDENTIFICATION DIVISION. в верхней части моих программ.

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

Хотя я думаю, что с бюрократией типов мы немного переборщили, Scala успешно решила некоторые из этих проблем.

person Community    schedule 01.12.2009
comment
System.out.Println смешно для того, что большинство языков называют puts - person Earlz; 02.12.2009
comment
Вы забыли глубину деревьев каталогов - и str1.equals (str2), о, у него нет конца: { - person Radagast the Brown; 12.03.2011
comment
@Earlz по крайней мере, это соответствует методологии вызова OO. В случае Java put должно быть либо ключевым словом, либо статическим методом объекта. Стоимость использования этого метода вполне может быть высокой. - person Roja Buck; 14.04.2011

Несоответствие стиля кодирования в командных проектах.

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

Достаточно плохо, когда вы используете разные стандарты для разных языков, но в веб-проекте с HTML, CSS, Javascript, PHP и MySQL это 5 языков, 5 разных стилей, умноженное на количество людей, работающих над проектом.

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

person Community    schedule 02.10.2008

Иногда меня раздражает то, что люди ожидают, что для всех рабочих мест будет один язык. В зависимости от выполняемой задачи у каждого языка есть свои преимущества и недостатки. Мне нравятся языки синтаксиса на основе C, потому что это то, к чему я больше всего привык, и мне нравится гибкость, которую они обычно наделяют разработчиками. Конечно, большие возможности влекут за собой большую ответственность, и возможность писать 150-строчные операторы LINQ не означает, что вы должны это делать.

Мне нравится встроенный XML в последней версии VB.NET, хотя мне не нравится работать с VB в основном потому, что я считаю IDE менее полезной, чем IDE для C #.

person Community    schedule 02.10.2008
comment
Хорошая точка зрения! C # отлично подходит для задач, связанных с любым нетривиальным объемом работы, но кроме этого, использовать его сложно. Поэтому я выучил скриптовый язык :) - person RCIX; 02.12.2009

Если Microsoft пришлось изобрести еще один C ++ - подобный язык в C #, почему они не исправили ошибку Java и не реализовали поддержку RAII?

person Community    schedule 02.10.2008
comment
RAII зависит от наличия детерминированных деструкторов, что невозможно в языке со сборкой мусора. - person Ferruccio; 02.10.2008
comment
RAII просто требует интерфейса с поддержкой языка. Интерфейс (назовем его Resource) имеет один метод void Release (). Языковой поддержкой будет приобретенное ключевое слово переменной File foo = new File (). Когда полученная переменная покидает область видимости, автоматически вызывается Release. Простой. - person jmucchiello; 23.02.2009
comment
Для меня это звучит как IDisposable. - person David; 02.12.2009
comment
@jmucchiello: Боюсь, это не так просто (иначе Java и C #, вероятно, сделали бы это :-)). Проблема в том, что экземпляр, на который ссылается переменная, может выжить после экземпляра (если экземпляр скопирован и где-то хранится, например, в коллекции). Чтобы очистить эти экземпляры, вам нужна сборка мусора, которая не поддерживает RAII .. - person sleske; 02.12.2009
comment
Безусловно, полная поддержка RAII потребует наличия типов, которые не наследуются от Object и не допускают копирование, кроме как через определенные методы. Однако я не уверен, почему это невозможно. Меня раздражает, что ни vb.net, ни C # не предоставляют удобных средств для автоматического создания метода Dispose для очистки всех полей IDisposable с особыми тегами, а также средств для вызова метода очистки, когда конструктор выдает исключение после объекта. частично создан. - person supercat; 29.08.2011

Чувствительность к регистру.

Какое похмелье вам нужно, чтобы подумать, что отличать два идентификатора исключительно по caSE - это отличная идея?

person Community    schedule 02.10.2008
comment
В Java принято называть классы с заглавной буквы, а экземпляры - строчными. Очень часто можно увидеть что-то вроде: Человек person = new Person (); - person Dean Rather; 02.10.2008
comment
Кажется, все языковые дизайнеры, кроме Билла Гейтса, были с похмелья. - person Vasil; 03.10.2008
comment
У меня совершенно противоположная точка зрения! Мне нравится, как в Haskell чувствительность к регистру используется как часть синтаксиса (типы и конструкторы всегда в верхнем регистре, переменные всегда в нижнем регистре). Я считаю его очень элегантным. - person Jared Updike; 29.10.2008
comment
Я считаю, что чувствительность к регистру хороша для языков со статической типизацией, но для динамических языков, где нет компилятора, который мог бы уловить ваши ошибки, это может сильно раздражать. - person Edan Maor; 02.12.2009

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

person Community    schedule 22.02.2009
comment
Я бы сказал, что они более полезны наоборот - когда конец строки не должен быть концом оператора, поэтому вы можете разбить длинные строки. - person Benno; 02.12.2009
comment
Раньше мне не нравились точки с запятой, но потом я увидел VB, который делает наоборот. УРА! - person Christian Hayter; 02.12.2009

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

Я лично предпочитаю основываться на нуле, но любой язык, который смешивает их или позволяет вам «настраивать», может свести вас с ума. (Apache Velocity - я смотрю в вашу сторону!)

фрагмент из справочника VTL (по умолчанию 1, но вы можно установить на 0):

# Default starting value of the loop
# counter variable reference.
directive.foreach.counter.initial.value = 1

(попробуйте объединить 2 проекта, в которых использовались разные схемы счетчиков - тьфу!)

person Community    schedule 28.02.2009

В произвольном порядке ...

OCaml

  • В определениях кортежей для разделения элементов используется *, а не ,. Итак, ("Juliet", 23, true) имеет тип (string * int * bool).

  • Для того, чтобы быть таким классным языком, в документации есть этот навязчивый комментарий к темам: "Библиотека потоков реализована путем разделения времени на одном процессоре. Она не использует преимущества многопроцессорных машин. Поэтому использование этой библиотеки никогда не заставит программы работать быстрее." JoCaml не решает эту проблему.

  • ^^^ Я слышал, что ребята из Джейн Стрит работали над добавлением параллельных GC и многоядерных потоков в OCaml, но я не знаю, насколько они успешны. Я не могу представить язык без многоядерных потоков и очень долго выжившего сборщика мусора.

  • Непростой способ изучить модули на верхнем уровне. Конечно, вы можете написать module q = List;;, и верхний уровень с радостью распечатает определение модуля, но это кажется хакерским.

C #

  • Паршивый вывод типа. Помимо самых тривиальных выражений, я должен придавать типы универсальным функциям.

  • Весь код LINQ, который я когда-либо читал, использует синтаксис метода x.Where(item => ...).OrderBy(item => ...). Никто никогда не использует синтаксис выражений from item in x where ... orderby ... select. Между вами и мной, я считаю, что синтаксис выражений глуп, хотя бы по той причине, что он выглядит «чужим» на фоне всего остального кода C # и VB.NET.

LINQ

Все остальные языки используют стандартные отраслевые названия: «Карта», «Свернуть / уменьшить / ввести» и «Фильтр». LINQ должен быть другим и использовать Select, Aggregate и Where.

Функциональное программирование

Монады загадочны. Увидев монаду Parser, монаду Maybe, State и List, я могу прекрасно понять, как работает код; однако, в качестве общего шаблона проектирования, я не могу смотреть на проблемы и говорить «эй, держу пари, что здесь идеально подошла бы монада».

Рубин

GRRRRAAAAAAAH !!!!! То есть ... серьезно .

VB

Module Hangups
    Dim _juliet as String = "Too Wordy!"

    Public Property Juliet() as String
        Get
            Return _juliet
        End Get
        Set (ByVal value as String)
            _juliet = value
        End Set
    End Property
End Module

А декларации сеттеров - это проклятие моего существования. Хорошо, поэтому я меняю тип данных своего свойства - теперь мне нужно также изменить тип данных в моем сеттере? Почему VB не заимствует из C #, а просто включает неявную переменную с именем value?

.NET Framework

Мне лично нравится соглашение о регистрах Java: классы - это PascalCase, методы и свойства - это camelCase.

person Community    schedule 02.12.2009
comment
Объявления свойств vb тоже меня раздражают, особенно с учетом того, что очень распространенным шаблоном является реализация общедоступных или защищенных свойств только для чтения с частным резервным полем. - person supercat; 29.08.2011

В C / C ++ меня раздражает, что есть разные способы написания одного и того же кода.

e.g.

if (condition)
{
   callSomeConditionalMethod();
}
callSomeOtherMethod();

vs.

if (condition)
   callSomeConditionalMethod();
callSomeOtherMethod();

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

person Community    schedule 02.10.2008
comment
Языки не предназначены для предотвращения аргументов, они предназначены для предоставления абстракций от кода машинного уровня, чтобы сообщить компьютеру, что делать. Если вы сделаете стандарт строгим в одной ситуации, вы получите аргументы в другом месте. Приведенный вами пример является крайним случаем для однострочных операторов. - person Jeff Yates; 02.10.2008
comment
Да, я согласен, что это была крайняя ситуация. Он был задуман как единственный пример моей проблемы (в C / C ++ есть разные способы написания одного и того же кода). Это была не единственная моя проблема. - person LeopardSkinPillBoxHat; 02.10.2008
comment
В C / C ++ есть разные способы написания одного и того же кода. Вы когда-нибудь программировали на Perl? знак равно - person Seiti; 03.11.2008
comment
Не спорьте об этом в обзоре кода. Позвольте людям, которым не все равно, делать работу. Не выполняйте форматирование самостоятельно, вместо этого будьте продуктивны, и тогда вы получите прибавку ;-) - person Jonas Kölker; 23.02.2009

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

Perl:

($lastname, $firstname, $rest) = split(' ', $fullname);

Этот оператор работает независимо от того, сколько слов содержится в $ fullname. Попробуйте использовать его на Python, и он взорвется, если $ fullname не содержит ровно трех слов.

person Community    schedule 02.10.2008
comment
Да, это что-то вроде PITA в Python. Обычно я делаю что-то вроде: fields = fullname.split (); поля + = [Нет] * (len (поля) -3); фамилия, имя, остальные = поля. Определенно не так удобно. - person Dan Lenski; 02.10.2008
comment
Точно! Делай, что хочу, черт возьми! :) - person Barry Brown; 02.10.2008

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


    DECLARE mycurse CURSOR LOCAL FAST_FORWARD READ_ONLY
        FOR
        SELECT field1, field2, fieldN FROM atable

    OPEN mycurse
    FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN

    WHILE @@fetch_status = 0
    BEGIN
        -- do something really clever...

        FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN
    END
    CLOSE mycurse
    DEALLOCATE mycurse

person Community    schedule 02.10.2008

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

Я все еще занимаюсь JavaScript, и в целом это приемлемо. Почему так сложно создать пространство имен. В TCL они просто уродливы, но в JavaScript это на самом деле вздор И совершенно нечитаемый.

Почему в SQL все сводится к одному огромному свободному оператору SELECT?

person Community    schedule 22.02.2009
comment
Я должен поднять вас на комментарий о Python lambdas - его интересный Гвидо убил такую ​​полезную функцию LISP. Удобство использования не было полностью убито, но большая часть гибкости была удалена, чтобы сделать его выражением. - person new123456; 22.04.2011

В Ruby мне очень не нравится, что методы не требуют вызова self. в текущем экземпляре, а свойства требуют (иначе они будут конфликтовать с локальными); то есть:

def foo()
   123
end

def foo=(x)
end

def bar()
    x = foo() # okay, same as self.foo()
    x = foo   # not okay, reads unassigned local variable foo
    foo = 123 # not okay, assigns local variable foo
end

На мой взгляд, это очень непоследовательно. Я бы предпочел либо всегда требовать self. во всех случаях, либо иметь сигил для местных жителей.

person Community    schedule 01.12.2009

Пакеты Java. Я считаю их сложными, тем более что я не корпорация. Я очень предпочитаю пространства имен. Я, конечно, переживу это - я играю с Android SDK, и Eclipse снимает большую часть боли. У меня никогда раньше не было машины, которая могла бы запускать ее в интерактивном режиме, а теперь я очень впечатлен.

person Community    schedule 02.10.2008
comment
Насколько сильно различаются пакеты и пространства имен? - person Zifre; 29.03.2009
comment
Что ж, концептуально не так уж и много. Я комментировал то, как пакеты полагаются на структуру файловой системы, и способ, которым вы должны основывать ее на своем домене (com.google.Whatever), а не на пространстве имен MyProject {something}. - person Bernard; 30.03.2009
comment
Хорошо, думаю, я согласен с вами по поводу структуры файловой системы, но по крайней мере com.google. Что бы ни помогало предотвращать конфликты. - person Zifre; 05.04.2009
comment
Что ж, основывать имена пакетов на вашем доменном имени - это просто соглашение и никоим образом не соблюдается. Это по-прежнему хорошая идея, потому что она позволяет избежать конфликтов имен. Кроме того, я лично считаю довольно полезным параллелизм между пакетом и структурой fs, поскольку он упрощает поиск классов. Но это может быть спорным ... - person sleske; 02.12.2009
comment
Я признаю, что параллелизм package / fs меня немного вырос. - person Bernard; 02.12.2009

Синтаксис if-then-else Пролога.

x -> y ; z

Проблема в том, что «;» является оператором «or», поэтому приведенное выше выглядит как «x подразумевает y или z».

person Community    schedule 06.10.2008
comment
Вау, это действительно непостижимо! - person Dan Lenski; 06.10.2008
comment
Вы можете сделать то же самое для большинства языков сценариев. JS: var a = b || 12; присваивает a b, если оно имеет истинное значение, в противном случае - 12. - person Radagast the Brown; 12.03.2011
comment
@Radagast the Brown: указанный выше оператор -> не является присваиванием. Это импликация (например, if ... then). x - это условие, y и z - истинная и ложная ветви. - person Hugh Allen; 26.03.2011

Java

  • Дженерики (Java-версия шаблонов) ограничены. Я не могу вызывать методы класса и не могу создавать экземпляры класса. Обобщения используются контейнерами, но я могу использовать контейнеры экземпляров Object.
  • Нет множественного наследования. Если использование множественного наследования не приводит к проблеме с ромбами, его следует разрешить. Это должно позволить написать реализацию методов интерфейса по умолчанию, пример проблемы: интерфейс MouseListener имеет 5 методов, по одному для каждого события. Если я хочу обработать только один из них, я должен реализовать четыре других метода как пустой метод.
  • Он не позволяет вручную управлять памятью некоторых объектов.
  • Java API использует сложную комбинацию классов для выполнения простых задач. Например, если я хочу читать из файла, мне нужно использовать много классов (FileReader, FileInputStream).

Python

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

C ++

  • Заголовки - самая большая проблема. Мне нужно перечислить функции в файле заголовка и реализовать их в файле cpp. Он не может скрыть зависимости класса. Если класс A использует класс B в частном порядке как поле, если я включаю заголовок A, заголовок B также будет включен.
  • Строки и массивы пришли из C, они не предоставляют поля длины. Трудно контролировать, будут ли std :: string и std :: vector использовать стек или кучу. Я должен использовать указатели с std :: string и std :: vector, если я хочу использовать присваивание, передать как аргумент функции или вернуть ее, потому что ее оператор "=" скопирует всю структуру.
  • Я не могу управлять конструктором и деструктором. Трудно создать массив объектов без конструктора по умолчанию или выбрать, какой конструктор использовать с операторами if и switch.
person Community    schedule 15.04.2011

На большинстве языков доступ к файлам. На данный момент VB.NET - единственный язык, на котором доступ к файлам имеет для меня какой-то смысл. Я не понимаю, почему, если я хочу проверить, существует ли файл, я должен использовать File.exists ("") или что-то подобное вместо того, чтобы создавать объект файла (на самом деле FileInfo в VB.NET) и спрашивать, существует ли он. А затем, если я хочу его открыть, я прошу его открыть: (при условии, что объект FileInfo называется fi) fi.OpenRead, например. Возвращает поток. Хороший. Именно то, что я хотел. Если я хочу переместить файл, fi.MoveTo. Еще я могу сделать fi.CopyTo. Что это за чушь в том, что в большинстве языков файлы не становятся полноценными объектами? Кроме того, если я хочу перебрать файлы в каталоге, я могу просто создать объект каталога и вызвать .GetFiles. Или я могу использовать .GetDirectories, и я получаю совершенно новый набор объектов DirectoryInfo для игры.

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

Кроме того, я ненавижу ::, ->, => и все другие многосимвольные операторы, кроме ‹= и> = (и, возможно, - и ++).

person Community    schedule 28.02.2009
comment
Обожаю = ›! вы можете сделать это в VB? myEvent += (sender, args) => {MessageBox.Show("it worked!")}; - person RCIX; 02.12.2009
comment
AddHandler myEvent, Function() MessageBox.Show("it worked!") или что-то в этом роде - не держите перед собой IDE для проверки. - person Christian Hayter; 02.12.2009

[Отказ от ответственности: я лишь частично знаком с VB, поэтому отнеситесь к моим комментариям с долей скептицизма]

Я ненавижу то, как каждое ключевое слово в VB пишется с заглавной буквы. Я видел сообщение в блоге на прошлой неделе (месяц?) О ком-то, кто пытался писать код VB без заглавных букв (они сделали что-то с компилятором, который позволил бы им компилировать такой код VB), и язык выглядел намного лучше!

person Community    schedule 01.12.2009
comment
Visual Basic не чувствителен к регистру. Вы можете написать код VB строчными буквами, если хотите, и он отлично скомпилируется. Но IDE изменит корпус за вашей спиной! Начальный регистр для ключевых слов и создание имен переменных с такими же заглавными буквами, как в объявлении. Это IDE, а не компилятор. - person PhiLho; 15.03.2011
comment
@PhiLho: Я был абсолютно уверен, что они упомянули, что какой бы компилятор VB они ни использовали, требовалось использовать заглавные буквы в ключевых словах, и что им пришлось перекомпилировать версию, которая в этом не нуждалась. - person RCIX; 05.04.2011
comment
честно говоря, я не знаю, я никогда не использовал VB вне визуальной среды, делая то, что я описываю, помимо v.6. Так что, возможно, вы правы, и IDE меняет регистр ключевых слов в соответствии с требованиями ... Википедия говорит, что, как правило, не учитывает регистр (и добавляет больше точности), поэтому мы оба наполовину правы ... :-) (не на одной половине !) - person PhiLho; 09.04.2011

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

  • Матрицы индексируются круглыми скобками. Итак, если вы видите что-то вроде Image (350,260), вы не имеете ни малейшего представления о том, получаем ли мы элемент из матрицы Image или вызываем некоторую функцию с именем Image и передаем ей аргументы.
  • Размах безумный. Кажется, я припоминаю, что переменные индекса цикла остаются в области видимости после завершения цикла.
  • Если вы забудете поставить точку с запятой после присваивания, значение будет выведено на стандартный вывод.
  • У вас может быть одна функция для каждого файла. Это очень утомляет при организации работы.

Я уверен, что смог бы придумать больше, если бы подумал об этом.

person Community    schedule 18.09.2009

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

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

Требование пробелов меня беспокоит; Я не хочу, чтобы дизайнер языка заставлял меня писать код определенным образом.

Мне не нравится идеал «одно правильное решение», которого придерживается Python. Я хочу варианты.

person Community    schedule 02.12.2009
comment
Я также ненавижу методы в стиле methodName и то, что, если я действительно хочу, я все равно могу получить доступ к частным вещам в классе извне. Это просто отговорка - если вы хотите оскорбить класс, это ваша проблема, и вы столкнетесь с ее последствиями. Это не задача языков, чтобы помешать вам сделать что-нибудь глупое. - person new123456; 22.04.2011

Я ненавидел круглые скобки в Lisp и Scheme, потому что после C, C # и подобных языков они казались очень запутанными, и было не совсем понятно, как все взаимосвязано. Однако теперь, когда я кое-что знаю о Scheme и об обычных рекомендациях по форматированию, я бы не сказал, что мне нравится, как это работает, но, по крайней мере, я понимаю и преодолеваю свои страхи при чтении кода, написанного на CLisp / Scheme.

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

person Community    schedule 22.02.2009
comment
Для ненавистников скобок теперь есть Clojure. Он сокращает ненужные скобки и использует квадратные скобки и фигурные скобки вместо некоторых из них - это делает кодирование более доступным для тех, кто менее склонен к скобкам. - person Carl Smotricz; 02.12.2009

Мои зависания с C # очень просты:

  1. Блоки с ограниченным размером

Я бы хотел написать

with SomeObject
{
    .Property = "Some value";
    .Event();
}

вместо:

SomeObject.Property = "Some value";
SomeObject.Event();

Это сделало бы код менее громоздким для чтения, особенно с Append, AppendFormat в StringBuilder.

  1. Нули

Хотел бы я сказать:

var result = SomeObject.SomeCollection.First().SomeProperty ??? "Default value";

Вместо:

string result = string.Empty;

if ( SomeObject != null && SomeObject.SomeCollection.Count() > 0 )
{
    result = SomeObject.SomeCollection.FirsT().SomeProperty;
}
else
{
     result = "Default value";
}

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

person Community    schedule 22.06.2011
comment
Я предпочитаю реализацию последнего, чтобы позволить классам и структурам определять невиртуальные члены (как методы, так и свойства) с использованием синтаксиса, аналогичного синтаксису для методов расширения. Если язык распознавал и передачу по константной ссылке, и передачу по ссылке, а методы структуры не могли изменять this, если они не были объявлены с использованием параметра this по ссылке, многие из вещей, которые Эрик Липперт ненавидит в изменяемых структуры будут решены. - person supercat; 29.08.2011

tsql begin & end ... это раздражает ...

person Community    schedule 28.02.2009

Я получил один.

У меня есть недовольство всеми чрезмерно строгими языками со статической типизацией.

Я думал, что C # великолепен, пока меня не заставляли писать такой код:

void event...(object sender,EventArgs e){
  int t=(int)(decimal)(MyControl.Value); //Value is an object which is actually a decimal to be converted into an int
}

Да, и атрибуты уродливые. Могла ли Microsoft серьезно не придумать ничего уродливее, чем [MyAttribute(Argument)] void function... Серьезно. wtf? Даже не заставляйте меня начинать с разметки XAML ..

Я не могу серьезно относиться к Python из-за проблемы с пробелами ..

Иногда мне трудно воспринимать Руби всерьез, потому что

а) Я научился из «Пронзительного гида Почему»

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

О, и я также ненавижу

if(a)
  b();

синтаксис. Вы не представляете, сколько раз я только что сделал

if(a)
  b();
  c();

случайно с таким кодом .. На самом деле с

if(a)
  b(); c();

Единственное место, где его можно будет использовать, это

if(a){ ....
}else if(b){ ...
person Community    schedule 01.12.2009

Применимо к нескольким языкам:

  1. Чувствительность к регистру - кто это придумал ?! (И людей, которые используют несколько слов для разных значений, а также несколько слов, которые означают что-то с разными значениями, следует расстрелять :)

  2. Индексирование массивов начинается с 0. Я пришел из fortran-фонов, так что это еще одна причина, но в математике индексация массивов всегда начинается с 1, поэтому она имеет тенденцию создавать много головной боли (особенно при отладке) при реализации более крупной модели.

  3. Точка с запятой - мусор в коде. Если вы аккуратно пишете код (fortran, python, ...), они вам не нужны. Если нет, они тебя не спасут.

  4. Фигурные скобки - см. 3.

p.s. Все вы там. Не злись. Если вам не нравится ответ, не спрашивайте.

person Community    schedule 22.02.2009
comment
Касательно: 1) Я согласен с тем, что использование разных схем корпуса для различения идентификаторов - это мерзость, но я также думаю, что использование разных корпусов для / одного и того же / идентификатора также может быть PITA. Я не хочу искать VARNAME, VarName, varname, VARname и т. Д. При сканировании идентификатора. - person Adam Bellaire; 23.02.2009
comment
stackoverflow.com/questions/509129/ - person Ólafur Waage; 23.02.2009
comment
Олафур: Я знаю, почему они начинают с нуля. Мне просто не нравится то, что они любят :) - person Rook; 23.02.2009
comment
Адам: Почему бы и нет? Вы просто игнорируете регистр и начинаете искать ...? Я думаю, что использование разных регистров для одного и того же идентификатора может быть хорошей расслабляющей синтаксической функцией. Или я что-то упускаю? - person Rook; 23.02.2009
comment
По поводу 2: см. Lua.org для другого языка, который выполняет индексацию на основе 1. Что касается нечувствительности к регистру, то для программистов открываются гораздо худшие возможности сделать код трудным для чтения: см. _1 _... - person RCIX; 02.12.2009
comment
@RCIX - (если я правильно понял вашу точку зрения), тогда просто конвертируйте все в маленькие заглавные буквы ... (аналогия с табуляциями / пробелами, над которыми так много драматизируют из ничего ...) - person Rook; 02.12.2009
comment
За исключением чувствительности к регистру (что характерно для большинства языков), вам нужно, чтобы Lua не имел фигурных скобок для блоков, индексов массивов, начинающихся с 1, и необязательных (и обычно ненужных, даже с несколькими инструкциями в строке) полуколоний. - person PhiLho; 15.03.2011

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

if (a and b)
{
  do something
}

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

Это может быть немного более многословно, но следующее однозначно ...

if (a)
{
    if (b)
    {
        do something
    }
    else
    {
        what about this case?
    }
}
else
{
    if (b)
    {
        what about this case?
    }
    else
    {
        do something else
    }
}

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

person Community    schedule 02.10.2008
comment
Но если вы уберете это из языка, программисты выпустят свою собственную версию. И это было бы некрасиво. - person finnw; 23.02.2009
comment
Я действительно не слежу. Первое утверждение мне кажется совершенно ясным - вы хотите что-то делать только тогда, когда истинны и a, и b. Во всех остальных случаях ничего делать не нужно. Наличие пустых операторов else кажется неправильным. - person Dan Diplo; 18.09.2009
comment
содрогается я бы НЕ хотел поддерживать написанный вами код ... - person RCIX; 02.12.2009
comment
-1. (это вики сообщества, так что я не расстраиваюсь), это совершенно бессмысленно. Эй, попробуй управлять if((a and b) or (c and d) and e)) за меня. Бьюсь об заклад, вы выколите себе глаза, когда дойдете до конца, когда будет что-то вроде этого }}}}}}} Это НЕ делает код более читаемым и НЕ повышает надежность / правильность кода. Это просто больше похоже на то, что программист мог ошибиться при наборе текста. - person Earlz; 02.12.2009