16

我感兴趣地阅读了一些最近的语言与语言问题... Perl 与 PythonPython 与 Java一种语言可以比另一种更好吗?

我注意到的一件事是,我们中的很多人不喜欢语言都有非常肤浅的原因。我们第一眼就注意到了这些事情,它们让我们感到厌烦。我们回避那些可能非常好的语言,因为如果我们打扰的话,我们可能会在 2 秒内学会喜欢或忽略这些功能。

好吧,我和下一个人一样有罪,如果不是更多的话。开始:

  • Ruby:我看到的所有 Ruby 示例代码都使用该puts命令,这是一种幼稚的意第绪语解剖术语。因此,即使我应该认真对待 Ruby 代码,我也不能认真对待。
  • Python:我第一次看到它时,我对整个重要的空白都傻笑了。在接下来的几年里,我避免了它。现在我几乎不使用其他任何东西。
  • Java:我不喜欢 identifiersThatLookLikeThis。我不确定为什么。
  • Lisp:所有括号都有问题。不同重要性和目的的事物(函数声明、变量赋值等)在语法上没有区别,我懒得去学习什么是什么。
  • Fortran:大写的一切都伤害了我的眼睛。我知道现代代码不必这样写,但大多数示例代码是......
  • Visual Basic:Dim用于声明变量让我很烦恼,因为我记得 GW-BASIC 的美好时光,当时它用于维度数组。

哪些语言乍一看对我来说是正确的Perl、C、QBasic、JavaScript、汇编语言、BASH shell、FORTH。

好的,现在我已经晾干了我的脏衣服……我想听听你的。 你的语言障碍是什么?哪些肤浅的特征困扰着你?你是如何克服它们的?

4

37 回答 37

32

我讨厌讨厌 VB 的“结束函数”、“结束 IF”和“如果……那么”部分。我宁愿看到一个大括号。

于 2008-10-02T05:56:34.130 回答
22

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;
于 2008-10-02T07:20:39.777 回答
19

我从来没有真正喜欢在某些脚本 shell 中反向拼写的关键字

if-then- fi已经够糟糕了,但是 case-in- esac越来越傻了

于 2008-10-02T07:57:22.870 回答
12

我只是想到了另一个......我讨厌在 XML 中用于定义命名空间的大多数毫无意义的 URL,例如xmlns="http://purl.org/rss/1.0/"

于 2008-10-02T16:56:39.643 回答
9

帕斯卡BeginEnd. 太冗长,不受括号匹配的影响,更糟糕的是,没有Beginfor each End,例如。

Type foo = Record
    // ...
end;
于 2008-10-02T06:23:56.310 回答
9

虽然我主要是一名 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; });
于 2008-10-02T06:27:12.010 回答
8

我喜欢面向对象的风格。因此,我在 Python 中看到 len(str) 来获取字符串的长度,或者在另一种语言中拆分字符串(如 split(str, "|") )让我很烦恼。这在 C 中很好;它没有对象。但是 Python、D 等确实有对象并在其他地方使用 obj.method()。(我仍然认为 Python 是一门很棒的语言。)

不一致对我来说是另一个大问题。我不喜欢同一个库中不一致的命名:length()、size()、getLength()、getlength()、toUTFindex()(为什么不使用 toUtfIndex?)、Constant、CONSTANT 等。

.NET 中的长名称有时会困扰我。他们不能以某种方式缩短 DataGridViewCellContextMenuStripNeededEventArgs 吗?ListViewVirtualItemsSelectionRangeChangedEventArgs 怎么样?

而且我讨厌深层目录树。如果一个库/项目有一个 5 级深的目录树,我会遇到麻烦。

于 2009-02-22T21:37:56.083 回答
7

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如果没有and的定义,您将无法知道其含义bar

  • < 和 > 可能是模板实例化,或者可能小于和大于(不寻常但合法)
  • () 可能是一个函数调用,或者可能只是围绕逗号运算符(即执行 baz() 以获得大小效果,然后返回 baaz)。

愚蠢的是,其他语言复制了其中一些特征!

于 2008-10-02T06:59:00.000 回答
6

世界上没有什么比 php 更让我讨厌的了。

  1. 带有 $ 的变量,这是每个变量的一个额外的奇怪字符。
  2. 成员使用 -> 访问,没有明显的原因,每个成员访问一个额外的字符。
  3. 真是语言的奇葩。
  4. 没有命名空间。
  5. 字符串与 .. 连接
  6. 语言的怪诞表演。
于 2008-10-02T07:38:23.387 回答
6

Java 及其检查的异常。我离开 Java 有一段时间,住在 .NET 世界,然后最近回来了。

感觉有时候,我的throws子句比我的方法内容更冗长。

于 2008-10-02T05:25:56.200 回答
5

Objective C 中的所有 [] 和 @s。它们的使用与底层 C 的本机语法如此不同,以至于我第一次看到它们时给人的印象是,所有面向对象都是在事后才笨拙地用螺栓固定的。

于 2009-02-28T05:31:19.757 回答
5

我讨厌Java 的样板冗长

  • 为属性编写 getter 和 setter
  • 检查异常处理和所有暗示
  • 长长的进口清单

那些与 Java 约定 using 相关的那些veryLongVariableNames,有时让我觉得我回到了 80 年代,写IDENTIFICATION DIVISION.在我的程序的顶部。

提示:如果您可以在 IDE 中自动生成部分代码,则很好地提示您正在生成样板代码。使用自动化工具,编写不是问题,但每次有人必须阅读该代码时都会遇到障碍 - 这种情况更常见。

虽然我认为类型官僚主义有点过火,但 Scala 已经成功解决了其中一些问题。

于 2009-12-01T23:43:11.583 回答
4

团队项目中的编码风格不一致。

我正在从事一个大型团队项目,其中一些贡献者使用了 4 个空格而不是制表符。使用他们的代码可能会很烦人——我喜欢保持我的代码干净并且风格一致。

当你对不同的语言使用不同的标准时,这已经够糟糕了,但在一个包含 HTML、CSS、Javascript、PHP 和 MySQL 的 Web 项目中,那就是 5 种语言、5 种不同的样式,并乘以项目工作人员的数量。

当我需要修复某些东西时,我很想重新格式化我的同事代码,但是存储库会认为我更改了他们代码的每一行。

于 2008-10-02T13:55:36.787 回答
3

没有特别的顺序...

OCaml

  • 元组定义用于*分隔项目,而不是,. 所以,("Juliet", 23, true)有类型(string * int * bool)

  • 由于是一门很棒的语言,文档对线程有这样令人难以忘怀的评论:“线程库是通过在单个处理器上分时实现的。它不会利用多处理器机器。因此,使用这个库永远不会制作程序跑得更快。 ” JoCaml没有解决这个问题

  • ^^^ 我听说 Jane Street 的人正在努力将并发 GC 和多核线程添加到 OCaml,但我不知道他们有多成功。我无法想象没有多核线程和 GC 的语言能够存活很长时间。

  • 在顶层探索模块并不容易。当然,您可以编写module q = List;;并且顶层会很高兴地打印出模块定义,但这看起来很老套。

C#

  • 糟糕的类型推断。除了最琐碎的表达式之外,我还必须为泛型函数赋予类型。

  • 我读过的所有 LINQ 代码都使用方法语法,x.Where(item => ...).OrderBy(item => ...). 没有人使用过表达式语法,from item in x where ... orderby ... select. 在你我之间,我认为表达式语法很愚蠢,如果没有其他原因,它在所有其他 C# 和 VB.NET 代码的背景下看起来很“陌生”。

LINQ

使用行业标准名称的所有其他语言是 Map、Fold/Reduce/Inject 和 Filter。LINQ 必须不同,并使用 Select、Aggregate 和 Where。

函数式编程

单子很神秘。看过 Parser monad、Maybe monad、State 和 List monad,我可以完全理解代码是如何工作的;然而,作为一种通用的设计模式,我似乎无法看到问题并说“嘿,我敢打赌 monad 在这里很适合”。

红宝石

呜呜呜!!!!!!我的意思是……说真的。

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 不从 C# 中借用并简单地合并一个名为 value 的隐式变量?

.NET 框架

我个人喜欢 Java 大小写约定:类是 PascalCase,方法和属性是 camelCase。

于 2009-12-02T00:21:23.770 回答
3

我讨厌分号。我发现它们增加了很多噪音,您很少需要将两个语句放在一行中。我更喜欢 Python 和其他语言的风格……行尾就是语句的结尾。

于 2009-02-22T20:45:12.917 回答
3

如果微软不得不在 C# 中发明另一种类似 C++ 的语言,为什么他们不纠正 Java 的错误并实现对 RAII 的支持?

于 2008-10-02T07:30:01.860 回答
3

任何无法完全确定数组/循环/字符串字符索引是基于零还是基于一的语言。

我个人更喜欢从零开始,但是任何混合这两者的语言,或者让你“配置”使用的语言都会让你发疯。(Apache Velocity - 我正在寻找你的方向!)

VTL 参考中截取(默认为 1,但您可以将其设置为 0):

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

(尝试合并 2 个使用不同计数器方案的项目 - 啊!)

于 2009-02-28T17:12:20.930 回答
3

区分大小写。

您认为仅通过大小写来区分两个标识符是一个好主意,您需要什么样的宿醉?

于 2008-10-02T07:42:50.707 回答
3

有时让我感到恼火的是,人们期望所有工作都使用一种语言。根据您正在执行的任务,每种语言都有其优点和缺点。我喜欢基于 C 的语法语言,因为这是我最习惯的语言,而且我喜欢它们倾向于赋予开发人员的灵活性。当然,权力越大责任越大,拥有编写 150 行 LINQ 语句的权力并不意味着你应该这样做。

我喜欢最新版本的 VB.NET 中的内联 XML,虽然我不喜欢使用 VB,主要是因为我发现 IDE 不如 C# 的 IDE 有用。

于 2008-10-02T05:33:32.467 回答
2

In Ruby, I very strongly dislike how methods do not require self. to be called on current instance, but properties do (otherwise they will clash with locals); i.e.:

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

To my mind, it's very inconsistent. I'd rather prefer to either always require self. in all cases, or to have a sigil for locals.

于 2009-12-01T23:26:25.287 回答
2

我发现 Perl 对“已定义”和“未定义”值的使用非常有用,以至于如果没有它,我在使用脚本语言时会遇到麻烦。

珀尔:

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

无论 $fullname 中有多少个单词,此语句都能很好地执行。在 Python 中尝试一下,如果 $fullname 不包含恰好三个单词,它就会爆炸。

于 2008-10-02T06:32:13.043 回答
2

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

于 2008-10-02T07:32:54.147 回答
2

虽然我主要使用 python 编程,但 lambda 主体必须是表达式,这让我无休止地恼火。

我仍然在围绕 JavaScript 绞尽脑汁,总的来说,它大多是可以接受的。为什么创建命名空间这么难。在 TCL 中它们只是丑陋的,但在 JavaScript 中,它实际上是一个复杂的问题并且完全不可读。

在 SQL 中,为什么一切都只是一个巨大的 freekin SELECT 语句。

于 2009-02-22T20:28:04.410 回答
2

在 C/C++ 中,如何有不同的方式来编写相同的代码让我很恼火。

例如

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

对比

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

等同于同一件事,但不同的人有不同的风格。我希望原始标准对此做出更严格的决定,这样我们就不会产生这种歧义。它会导致代码审查中的争论和分歧!

于 2008-10-02T05:26:20.317 回答
1

Java 的包。我发现它们很复杂,更因为我不是一家公司。我非常喜欢命名空间。当然,我会克服它 - 我正在使用 Android SDK,而 Eclipse 消除了很多痛苦。我以前从来没有一台可以交互运行它的机器,现在我做到了,我印象非常深刻。

于 2008-10-02T06:38:59.503 回答
1

Prolog 的if-then-else语法。

x -> y ; z

问题是“ ;”是“ or”运算符,所以上面看起来像“x暗示yz”。

于 2008-10-06T01:34:38.493 回答
1

爪哇

  • 泛型(Java 版本的模板)是有限的。我不能调用类的方法,也不能创建类的实例。泛型由容器使用,但我可以使用 Object 实例的容器。
  • 没有多重继承。如果多重继承的使用不会导致菱形问题,则应该允许。它应该允许编写接口方法的默认实现,问题示例:接口 MouseListener 有 5 个方法,每个事件一个。如果我只想处理其中一个,我必须将其他 4 个方法实现为空方法。
  • 它不允许选择手动管理某些对象的内存。
  • Java API 使用复杂的类组合来完成简单的任务。例如,如果我想从文件中读取,我必须使用许多类(FileReader、FileInputStream)。

Python

  • 缩进是语法的一部分,我更喜欢使用“end”这个词来表示块的结束,并且不需要“pass”这个词。
  • 在类中,不应需要“self”一词作为函数的参数。

C++

  • 标题是最严重的问题。我必须在头文件中列出函数并在 cpp 文件中实现它们。它不能隐藏类的依赖关系。如果A类私下使用B类作为字段,如果我包含A的头,B的头也会被包含。
  • 字符串和数组来自 C,它们不提供长度字段。很难控制 std::string 和 std::vector 将使用堆栈还是堆。如果我想使用赋值、作为参数传递给函数或返回它,我必须使用带有 std::string 和 std::vector 的指针,因为它的“=”运算符将复制整个结构。
  • 我无法控制构造函数和析构函数。在没有默认构造函数的情况下创建对象数组或选择与 if 和 switch 语句一起使用的构造函数是很困难的。
于 2011-04-15T23:52:25.170 回答
0

在大多数语言中,文件访问。到目前为止,VB.NET 是唯一一种对我来说文件访问有意义的语言。我不明白为什么如果要检查文件是否存在,我应该使用 File.exists("") 或类似的东西,而不是创建文件对象(实际上是 VB.NET 中的 FileInfo)并询问它是否存在。然后,如果我想打开它,我会要求它打开:(假设一个名为 fi 的 FileInfo 对象)例如 fi.OpenRead。返回一个流。好的。正是我想要的。如果我想移动文件,fi.MoveTo。我也可以做fi.CopyTo。在大多数语言中不使文件成为成熟的对象是什么废话?此外,如果我想遍历目录中的文件,我可以创建目录对象并调用 .GetFiles。或者,我可以使用 .GetDirectories,并获得一组全新的 DirectoryInfo 对象。

诚然,Java 有一些这种文件的东西,但是这种必须有一个完整的对象来告诉它如何列出文件的胡说八道是愚蠢的。

另外,我讨厌 ::、->、=> 和所有其他多字符运算符,除了 <= 和 >=(可能还有 -- 和 ++)。

于 2009-02-28T05:55:37.797 回答
0

我讨厌 Lisp 和 Scheme 中的括号,因为在 C、C# 和类似的语言之后,它看起来非常模糊,并且不清楚它们之间的关系。然而,既然我对 Scheme 有所了解,而且它是通常的格式指南,我不会说我喜欢它的工作方式,但至少我理解并克服了阅读用 CLisp/Scheme 编写的代码时的恐惧。

我想如果你学了一些东西并使用它一段时间(也许几个小时就足够了,至少对我来说是这样),你实际上可以克服你对语法的厌恶,并且能够专注于你应该做的事情真正使用作为语言的工具。

于 2009-02-22T20:17:16.090 回答
0

tsql 开始和结束...这很烦人...

于 2009-02-28T05:42:24.597 回答
0

我最大的问题是 MATLAB 的语法。我使用它,我喜欢它,但它有很多烦人的怪癖。让我们来看看。

  • 矩阵用括号索引。所以如果你看到像 Image(350,260) 这样的东西,你不知道我们是从 Image 矩阵中获取一个元素,还是我们正在调用一个名为 Image 的函数并向它传递参数。
  • 范围很疯狂。我似乎记得 for 循环索引变量在循环结束后保持在范围内。
  • 如果您忘记在赋值后添加分号,该值将被转储到标准输出。
  • 每个文件可能有一个函数。事实证明,这对于组织工作非常烦人。

如果我考虑一下,我相信我可以想出更多。

于 2009-09-18T19:27:51.343 回答
0

我得到了一个。

我对所有过于严格的静态类型语言都怀恨在心。

在我开始被迫编写这样的代码之前,我认为 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
}

哦,属性是丑陋的。微软真的想不出比[MyAttribute(Argument)] void function...认真的更丑陋的东西吗?什么?甚至不要让我开始使用 XAML 标记..

由于空格问题,我不能认真对待 Python。

有时我很难认真对待 Ruby,因为

a)我从Why's Poignant Guide自学

b) 在某些情况下,标识符类型由大小写决定。我已经超越了这一点,因为它比const关键字更明智且更干净。现在在每种语言中,当我制作一个常量时,它都是大写的。

哦,我也讨厌

if(a)
  b();

句法。你不知道我刚刚做了多少次

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

意外地写了这样的代码..实际上可能会更糟

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

它应该能够使用的唯一地方是

if(a){ ....
}else if(b){ ...
于 2009-12-01T23:42:51.723 回答
0

我讨厌在 Python 中,我永远不知道某物是对象上的方法,还是浮动的随机函数(请参阅内置函数)。感觉就像他们开始使语言面向对象但后来懈怠了。让这样的函数成为某个基类(如 Object)上的方法对我来说更有意义。

我也讨厌__methodName__- 风格的方法,如果我真的想要,我仍然可以从类外访问类中的私有内容。

空格要求让我很烦恼;我不希望语​​言设计师让我以某种方式编写代码。

我不喜欢 Python 所坚持的“一种正确的做某事”的理想方式。我想要选择。

于 2009-12-02T18:53:28.550 回答
0

[免责声明:我对 VB 只略知一二,所以对我的评论持保留态度]

我讨厌VB中的每个关键字都是这样大写的。前一周(一个月?)我看到一篇博客文章,关于有人尝试编写不带任何大写字母的 VB 代码(他们对编译器做了一些事情,可以让他们像这样编译 VB 代码),而且语言看起来好多了!

于 2009-12-01T23:06:38.507 回答
0

我的 C# 挂断非常简单:

  1. 范围块

我希望我能写

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

代替:

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

尤其是在 StringBuilder 上使用 Append、AppendFormat,这将使代码阅读起来不那么繁琐。

  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,并希望有一个平滑的 null 合并,它可以在多个层次上工作。

于 2011-06-22T21:40:46.780 回答
-1

适用于多种语言:

  1. 区分大小写——这是谁的主意?!(并且应该枪杀那些使用 ManyWordsThatMeanSomething 以及几个wordsthatmeansomething 来表达不同含义的人:)

  2. 数组索引从 0 开始。我来自 fortran 背景,这是另一个原因,但在数学中数组索引总是从 1 开始,因此在实现更大的模型时往往会造成很多麻烦(尤其是在调试时)。

  3. 分号 - 只是代码中的垃圾。如果您仔细编写代码(fortran、python、...),则不需要它们。如果你不是,他们不会救你的。

  4. 大括号 - 见 3。

ps 你们都在外面。不要生气。如果你不喜欢这个答案,你就不应该问。

于 2009-02-22T21:05:20.047 回答
-5

我有一个多年代码审查和调试其他人代码的实用程序。我将(从所有语言中)删除在条件语句中对逻辑操作进行分组的能力。这来自对 AND 运算符的特定抱怨,例如..

if (a and b)
{
  do something
}

有4起案件,其中3起尚未处理。程序员很可能已经考虑了所有 4 种情况并故意选择以这种方式编写代码,但除非他们对代码进行了注释,否则我们没有任何迹象表明是这种情况——通常他们不会。

它可能有点冗长,但以下是明确的......

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

作为一年后跟进的穷人,至少我会确切地知道应该发生什么。

于 2008-10-02T07:53:35.393 回答