Каковы ваши "зависания" на вашем языке?

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

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

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

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

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

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

Ответы

Ответ 1

Я ненавижу Hate HATE "End Function" и "End IF" и "If... Then" части VB. Я бы скорее предпочел бы фигурные скобки.

Ответ 2

Несоответствия имени функции 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;

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Type foo = Record
    // ...
end;

Ответ 6

Хотя я в основном разработчик 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; });

Ответ 7

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

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

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

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

Ответ 8

Синтаксис 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.

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

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

Ответ 9

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

Похоже, что иногда предложение throws более объемное, чем мой контент метода.

Ответ 10

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

  • Переменные с $, это один дополнительный нечетный символ для каждой переменной.
  • Доступ к элементам осуществляется с помощью → без видимых причин, один дополнительный символ для каждого доступа к члену.
  • На самом деле это настоящий язык.
  • Нет пространств имен.
  • Строки объединены с..
  • Freakshow of language.

Ответ 11

Я отвращаю многословную деталь плиты бойлера Java.

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

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

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

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

Ответ 12

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

Ответ 13

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

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

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

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

Ответ 14

Без особого порядка...

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.

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

Ответ 20

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

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

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

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

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

Ответ 21

В C/С++ меня раздражает, как существуют разные способы написания одного и того же кода.

например.

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

против.

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

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

Ответ 22

Я нашел, что использование Perl значений "defined" и "undefined" настолько полезно, что я не могу использовать языки сценариев без него.

Perl:

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

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

Ответ 23

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

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

В SQL, как все это всего лишь один, огромный оператор SELECT Freekin.

Ответ 24

В 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. во всех случаях, либо иметь сигил для локальных жителей.

Ответ 25

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

Ответ 26

Пролог if-then-else.

x -> y ; z

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

Ответ 27

Java

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

Python

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

С++

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

Ответ 28

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

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

Ответ 29

tsql начинать и заканчивать... это раздражает...

Ответ 30

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

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

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