Ответ 1
Я ненавижу Hate HATE "End Function" и "End IF" и "If... Then" части VB. Я бы скорее предпочел бы фигурные скобки.
Я с интересом прочитал некоторые из последних вопросов языка и языка... Perl vs. Python, Python vs. Java, Может ли один язык лучше другого?
Одна вещь, которую я заметил, это то, что у многих из нас очень поверхностные причины для нелюбимых языков. Мы замечаем это на первый взгляд, и они отвергают нас. Мы избегаем того, что, вероятно, является прекрасным языком в результате того, что мы, вероятно, научимся любить или игнорировать через 2 секунды, если мы побеспокоились.
Ну, я так же виноват, как и следующий парень, если не больше. Здесь:
puts
, и это своего рода детский анатомический термин на идише. Таким образом, я не могу серьезно воспринимать Ruby-код, хотя должен.Dim
используется для объявления переменных, так как я помню хорошие дни GW-BASIC, когда он использовался только для массивов измерений.Какие языки на первый взгляд смотрели прямо на меня? Perl, C, QBasic, JavaScript, язык ассемблера, BASH shell, FORTH.
Хорошо, теперь, когда я передал свое грязное белье... Я хочу услышать твое. Каковы ваши языковые зависания? Какие поверхностные особенности вас беспокоят? Как вы их преодолели?
Я ненавижу Hate HATE "End Function" и "End IF" и "If... Then" части VB. Я бы скорее предпочел бы фигурные скобки.
Несоответствия имени функции 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;
Мне никогда не нравились ключевые слова, написанные назад в некоторых скриптовых оболочках
if-then- fi достаточно плохо, но case-in esac просто становится глупым
Я просто подумал о другом... Я ненавижу в основном бессмысленные URL-адреса, используемые в XML, для определения пространств имен, например. xmlns="http://purl.org/rss/1.0/"
Pascal Begin
и End
. Слишком многословная, не подверженная сопоставлению скобок, и, что еще хуже, для End
не существует Begin
, например.
Type foo = Record
// ...
end;
Хотя я в основном разработчик PHP, мне не нравятся языки, которые не позволяют мне делать достаточно много встроенных. Например:.
$x = returnsArray();
$x[1];
вместо
returnsArray()[1];
или
function sort($a, $b) {
return $a < $b;
}
usort($array, 'sort');
вместо
usort($array, function($a, $b) { return $a < $b; });
Мне нравится объектно-ориентированный стиль. Таким образом, он меня пугает на Python, чтобы увидеть len (str), чтобы получить длину строки или расщепить строки, такие как split (str, "|" ) на другом языке. Это хорошо в C; у него нет объектов. Но Python, D и т.д. Имеют объекты и используют obj.method() другие места. (Я все еще думаю, что Python - отличный язык.)
Несоответствие - еще одна большая для меня. Мне не нравится несогласованное именование в той же библиотеке: length(), size(), getLength(), getlength(), toUTFindex() (почему бы не toUtfIndex?), Constant, CONSTANT и т.д.
Длинные имена в .NET иногда меня беспокоят. Разве они не могут каким-то образом сократить DataGridViewCellContextMenuStripNeededEventArgs? Что можно сказать о ListViewVirtualItemsSelectionRangeChangedEventArgs?
И я ненавижу глубокие деревья каталогов. Если в библиотеке/проекте есть дерево с глубиной 5 уровней, у меня возникнут проблемы с этим.
Синтаксис 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
И если в С++ вы видели
foo<bar>(baz(),baaz)
вы не могли бы знать значение без определения foo
и bar
.
Глупо то, что другие языки скопировали некоторые из этих характеристик!
Java и проверенные исключения. Я некоторое время покидал Java, живу в мире .NET, а затем вернулся.
Похоже, что иногда предложение throws
более объемное, чем мой контент метода.
Ничего в мире я ненавижу больше, чем php.
Я отвращаю многословную деталь плиты бойлера Java.
Те, в связи с соглашением Java по использованию veryLongVariableNames
, иногда мне кажется, что я вернулся в 80-е, написав IDENTIFICATION DIVISION.
в верхней части моих программ.
Подсказка. Если вы можете автоматизировать создание части кода в своей среде IDE, это хороший намек на то, что вы создаете шаблонный код. С автоматизированными инструментами это не проблема для написания, но это помеха каждый раз, когда кто-то должен читать этот код - что чаще.
Хотя я думаю, что это немного за бортом по типу бюрократии, Scala успешно справился с некоторыми из этих проблем.
Все [] s и @s в Objective C. Их использование настолько отличается от основного синтаксиса C, что в первый раз, когда я увидел их, это создало впечатление, что вся объектная ориентация была неуклюже заперта как второстепенный.
Несоответствия стиля кодирования в командных проектах.
Я работаю над большим проектом команды, где некоторые участники использовали 4 пробела вместо символа табуляции. Работа с их кодом может быть очень раздражающим - мне нравится держать мой код в чистоте и с последовательным стилем.
Это достаточно плохо, когда вы используете разные стандарты для разных языков, но в веб-проекте с HTML, CSS, Javascript, PHP и MySQL, который состоит из 5 языков, 5 разных стилей и умножается на количество людей, работающих над проектом.
Мне бы хотелось переформатировать код моего коллеги, когда мне нужно что-то исправить, но тогда репозиторий подумает, что я изменил каждую строку своего кода.
Без особого порядка...
OCaml
Определения наборов используют *
для разделения элементов, а не ,
. Итак, ("Juliet", 23, true)
имеет тип (string * int * bool)
.
Для того, чтобы быть таким удивительным языком, в документации есть этот преследующий комментарий к threads: " Библиотека потоков реализованный с помощью совместного использования времени на одном процессоре, и не будет использовать преимущества многопроцессорных машин. Поэтому использование этой библиотеки никогда не сделает программы более быстрыми." JoCaml не устраняет эту проблему.
^^^ Я слышал, что ребята из Jane Street работали над добавлением параллельных GC и многоядерных потоков в OCaml, но я не знаю, насколько они успешны. Я не могу представить язык без многоядерных потоков, и GC выживает очень долго.
Нет простого способа изучить модули в верхнем слое. Конечно, вы можете написать module q = List;;
, и топлевел будет с радостью распечатать определение модуля, но это просто кажется взломанным.
С#
Отрицательный тип вывода. Помимо самых тривиальных выражений, я должен давать типы для общих функций.
Весь код LINQ, который я когда-либо читал, использует синтаксис метода x.Where(item => ...).OrderBy(item => ...)
. Никто никогда не использует синтаксис выражения, from item in x where ... orderby ... select
. Между вами и мной, я думаю, синтаксис выражения глупо, если только по той причине, что он выглядит "чужим" на фоне всех других кодов С# и VB.NET.
LINQ
Каждый другой язык использует названия отраслевых стандартов: Map, Fold/Reduce/Inject и Filter. LINQ должен быть другим и использует Select, Aggregate и Where.
Функциональное программирование
Монады мистифицируют. Увидев монаршу Парсера, Мода, Мода, Государство и Список, я прекрасно понимаю, как работает код; однако, как общий шаблон дизайна, я не могу смотреть на проблемы и сказать "эй, я уверен, что монада идеально подойдет здесь".
рубин
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
И объявления setter - это проклятие моего существования. Хорошо, поэтому я меняю тип данных своего свойства - теперь мне нужно также изменить тип данных в моем сеттере? Почему VB не заимствует у С# и просто включает неявную переменную с именем value?
.NET Framework
Мне лично нравится соглашение об использовании оболочки Java: классы PascalCase, методы и свойства - camelCase.
Меня иногда раздражает то, как люди ожидают, что на всех рабочих местах будет один язык. В зависимости от задачи, которую вы выполняете, каждый язык имеет свои преимущества и недостатки. Мне нравятся языки синтаксиса на основе C, потому что это то, к чему я больше всего привык, и мне нравится гибкость, которую они, как правило, дают разработчику. Разумеется, с большой силой приходит большая ответственность, и иметь возможность писать 150 строк LINQ-заявлений не означает, что вы должны.
Мне нравится встроенный XML в последней версии VB.NET, хотя мне не нравится работать с VB в основном потому, что я считаю, что среда IDE менее полезна, чем IDE для С#.
Если Microsoft пришлось изобретать еще один С++-подобный язык на С#, почему они не исправили ошибку Java и не выполнили поддержку RAII?
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
Чувствительность к регистру.
Какое похмелье вам нужно думать, что отличать два идентификатора исключительно от caSE - отличная идея?
Я ненавижу полуколоны. Я нахожу, что они добавляют много шума, и вам редко приходится помещать два вывода в строку. Я предпочитаю стиль Python и других языков... конец строки - конец инструкции.
Любой язык, который не может полностью решить, являются ли массивные индексы Arrays/Loop/string основаны на нулевом или одном базисе.
Я лично предпочитаю ноль, но любой язык, который смешивает эти два, или позволяет вам "настроить", который используется, может привести вас в беду. (Скорость Apache - Я смотрю в вашу сторону!)
отредактируйте ссылку VTL (по умолчанию 1, но вы можете установить ее на 0):
# Default starting value of the loop
# counter variable reference.
directive.foreach.counter.initial.value = 1
(попробуйте объединить 2 проекта, которые использовали разные схемы счетчиков - ugh!)
В C/С++ меня раздражает, как существуют разные способы написания одного и того же кода.
например.
if (condition)
{
callSomeConditionalMethod();
}
callSomeOtherMethod();
против.
if (condition)
callSomeConditionalMethod();
callSomeOtherMethod();
приравниваются к одному и тому же, но разные люди имеют разные стили. Я бы хотел, чтобы оригинальный стандарт был более строгим в принятии решения об этом, поэтому у нас не было бы этой двусмысленности. Это приводит к аргументам и разногласиям в обзорах кода!
Я нашел, что использование Perl значений "defined" и "undefined" настолько полезно, что я не могу использовать языки сценариев без него.
Perl:
($lastname, $firstname, $rest) = split(' ', $fullname);
Этот оператор отлично работает независимо от того, сколько слов указано в $fullname. Попробуйте в Python, и он взрывается, если $fullname не содержит ровно трех слов.
Хотя я программирую в основном на python, он бесконечно меня раздражает, что тело лямбда должно быть выражением.
Я все еще обволакиваю свой мозг вокруг JavaScript, и в целом его в основном приемлемо. Почему так сложно создать пространство имен. В TCL они просто уродливы, но в JavaScript это на самом деле rigmarole и полностью нечитаемо.
В SQL, как все это всего лишь один, огромный оператор SELECT Freekin.
В 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.
во всех случаях, либо иметь сигил для локальных жителей.
Java-пакеты. Я нахожу их сложными, тем более что я не корпорация. Я очень предпочитаю пространства имен. Разумеется, я это преодолею - я играю с Android SDK, и Eclipse удаляет много боли. У меня никогда не было машины, которая могла бы запускать ее в интерактивном режиме до этого, и теперь я очень впечатлен.
Пролог if-then-else
.
x -> y ; z
Проблема заключается в том, что ";
" является оператором "or
", поэтому приведенное выше выглядит так: "x
подразумевает y
или z
".
Java
Python
С++
Я ненавидел круглые скобки в Lisp и Scheme, потому что после C, С# и таких языков это казалось очень запутанным, и было не совсем ясно, как все связано. Однако теперь, когда я знаю что-то о Scheme и обычных правилах форматирования, я бы не сказал, что мне нравится, как это работает, но, по крайней мере, я понимаю и преодолеваю свои страхи при чтении кода, написанного в CLisp/Scheme.
Я думаю, если вы научитесь чему-то и используете его какое-то время (может быть, даже нескольких часов достаточно, по крайней мере, это было для меня), вы действительно можете преодолеть свою неприязнь в синтаксисе и сможете сконцентрироваться на том, что вы должны делать действительно с помощью инструмента, который является языком.
tsql начинать и заканчивать... это раздражает...
В большинстве языков доступ к файлам. VB.NET - единственный язык, пока доступ к файлу имеет для меня какой-то смысл. Я не понимаю, почему, если я хочу проверить, существует ли файл, я должен использовать File.exists("") или что-то подобное вместо создания файлового объекта (фактически FileInfo в VB.NET) и спрашивать, существует ли он. И затем, если я хочу его открыть, я прошу его открыть: (предположим, например, объект FileInfo, называемый fi) fi.OpenRead. Возвращает поток. Ницца. Именно то, что я хотел. Если я хочу переместить файл, fi.MoveTo. Я также могу сделать fi.CopyTo. Что это за глупость в том, что не делаете файлы полноценными объектами на большинстве языков? Кроме того, если я хочу перебирать файлы в каталоге, я могу просто создать объект каталога и вызвать .GetFiles. Или я могу сделать .GetDirectories, и я получаю совершенно новый набор объектов DirectoryInfo для игры.
По общему признанию, у Java есть некоторые из этих файлов, но эта глупость иметь целый объект, чтобы рассказать ему, как перечислить файлы, просто глупо.
Кроме того, я ненавижу::, → , = > и все другие многосимвольные операторы, кроме <= и >= (и, возможно, - и ++).