你的语言是什么“挂断”?

时间:2008-10-02 05:16:29

标签: syntax language-features language-design

我感兴趣地阅读了一些最近的语言与语言问题...... Perl vs. PythonPython vs. JavaCan one language be better than another?

我注意到的一件事是我们很多人都有非常肤浅的不喜欢语言的原因。我们乍看之下注意到了这些事情,他们拒绝了我们。如果我们烦恼的话,我们可以避免在2秒内学会爱或忽略的功能,这些功能可能是完美的语言。

好吧,我和下一个人一样愧疚,如果不是更多的话。这是:

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

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

好的,现在我已经播放了我的脏衣服......我想听你的。 你的语言挂断是什么?什么肤浅的功能打扰你?你是如何克服它们的?

37 个答案:

答案 0 :(得分:32)

我讨厌Hate HATE“End Function”和“End IF”以及“If ... Then”部分的VB。我宁愿看到一个大括号。

答案 1 :(得分: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;

答案 2 :(得分:19)

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

if-then- fi 已经够糟糕了,但是 esac 案例只是变得愚蠢

答案 3 :(得分:12)

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

答案 4 :(得分:9)

Pascal的BeginEnd。太冗长,不受括号匹配的影响,更糟糕的是,每Begin都没有End,例如。

Type foo = Record
    // ...
end;

答案 5 :(得分:9)

虽然我主要是一名PHP开发人员,但我不喜欢那些不能让我在线内做足够事情的语言。 E.g:

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

而不是

returnsArray()[1];

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

而不是

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

答案 6 :(得分:8)

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

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

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

呢?

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

答案 7 :(得分: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)

如果没有foobar的定义,你就无法理解其含义。

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

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

答案 8 :(得分:6)

我厌恶Java的锅炉板的详细程度

  • 为属性编写getter和setter
  • 检查了异常处理和隐含的所有措辞
  • 长导入列表

与使用veryLongVariableNames的Java约定相关的那些,有时让我以为我回到80年代,在我的程序的顶部写IDENTIFICATION DIVISION.

提示:如果您可以在IDE中自动生成部分代码,那么这是一个很好的提示,即您正在生成样板代码。使用自动化工具,写入并不是一个问题,但每当有人必须阅读该代码时,这是一个障碍 - 这更常见。

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

答案 9 :(得分:6)

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

感觉有时,我的throws子句比我的方法内容更加庞大。

答案 10 :(得分:6)

世界上没有什么比仇恨更多的东西了。

  1. 带$的变量,这是每个变量的一个奇数字符。
  2. 使用 - &gt;访问成员没有明显的理由,每个成员访问一个额外的角色。
  3. 真是一种语言表达。
  4. 没有名称空间。
  5. 字符串与...连接。
  6. 语言狂热。

答案 11 :(得分:5)

目标C中的所有[] s和@s。它们的使用与底层C的原生语法有很大的不同,我第一次看到它时给人的印象是所有的面向对象都是笨拙地用螺栓固定在事后的想法。

答案 12 :(得分:4)

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

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

当你为不同的语言使用不同的标准时,这已经够糟了,但是在一个包含HTML,CSS,Javascript,PHP和MySQL的web项目中,这是5种语言,5种不同的风格,并乘以项目的人数

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

答案 13 :(得分:4)

没有特别的顺序......

<强> OCaml的

  • 元组定义使用*来分隔项而不是,。因此,("Juliet", 23, true)的类型为(string * int * bool)

  • 对于这样一个非常棒的语言,文档在threads上有这个令人难以忘怀的评论:“线程库是通过在单个处理器上分时实现的。它不会利用因此,使用这个库永远不会让程序运行得更快。“JoCaml doesn't fix this problem

  • ^^^我听说Jane Street的人正在努力为OCaml添加并发GC和多核线程,但我不知道他们有多成功。我无法想象没有多核线程和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。

功能编程

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

<强>红宝石

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声明是我存在的祸根。好吧,所以我改变了我的属性的数据类型 - 现在我需要更改我的setter中的数据类型?为什么VB不从C#中借用并简单地包含一个名为value的隐式变量?

.NET Framework

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

答案 14 :(得分:3)

我讨厌半冒号。我发现它们会增加很多噪音,你很少需要在一条线上放两个语句。我更喜欢Python和其他语言的风格......行尾是声明的结尾。

答案 15 :(得分:3)

任何无法完全决定Arrays / Loop / string字符索引是基于零还是基于一种语言的语言。

我个人更喜欢零基础,但任何混合两者的语言,或者让你“配置”使用的语言可以驱使你疯狂。 (Apache Velocity - 我正朝着你的方向前进!)

VTL reference剪断(默认为1,但您可以将其设置为0):

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

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

答案 16 :(得分:3)

区分大小写。

你需要认为什么样的宿醉只能通过caSE区分两个标识符是一个好主意?

答案 17 :(得分:3)

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 :(得分:3)

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

答案 19 :(得分:3)

有时人们希望所有工作都有一种语言,这让我感到恼火。根据您正在执行的任务,每种语言都有其优点和缺点。我喜欢基于C语言的语法,因为它是我最常用的,我喜欢它们倾向于给开发人员带来的灵活性。当然,强大的力量带来了巨大的责任,并且有能力编写150行LINQ语句并不意味着你应该这样做。

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

答案 20 :(得分:2)

虽然我主要在python中编程,但它无休止地让我感到不满的是lambda body必须是表达式。

我仍然围绕JavaScript包围我的大脑,总的来说,它基本上是可以接受的。为什么创建命名空间如此困难。在TCL中,它们只是丑陋,但在JavaScript中,它实际上是一个严峻且完全不可读的。

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

答案 21 :(得分:2)

在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.,要么为当地人提供印章。

答案 22 :(得分:2)

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

的Perl:

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

无论$ fullname中有多少单词,此语句都表现良好。在Python中试用它,如果$ fullname不包含正好三个单词,它就会爆炸。

答案 23 :(得分:2)

在C / C ++中,令我很生气的是,编写相同代码的方式有多种不同。

e.g。

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

VS

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

等同于同一件事,但不同的人有不同的风格。我希望原始标准对做出决定更加严格,所以我们不会有这种模糊性。它导致代码评论中的争论和分歧!

答案 24 :(得分:1)

Prolog的if-then-else语法。

x -> y ; z

问题在于“;”是“or”运算符,因此上述内容类似于“x隐含yz”。

答案 25 :(得分:1)

<强>爪哇

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

<强>的Python

  • 缩进是语法的一部分,我更喜欢使用单词“end”来表示块的结尾,并且不需要单词“pass”。
  • 在课堂上,不应该将“自我”这个词作为功能的参数。

<强> C ++

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

答案 26 :(得分:1)

Java的包。我发现它们很复杂,因为我不是公司。 我非常喜欢名称空间。当然,我会克服它 - 我正在使用Android SDK,而Eclipse则消除了很多痛苦。我之前从未有过一台能以交互方式运行它的机器,现在我对此印象非常深刻。

答案 27 :(得分:0)

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

不可否认,Java有一些这样的文件,但是必须要有一个完整的对象来告诉它如何列出文件,这简直太愚蠢了。

另外,我讨厌::, - &gt;,=&gt;以及除&lt; =和&gt; =之外的所有其他多字符运算符(可能是 - 和++)。

答案 28 :(得分:0)

开始sql;结束......那很烦人......

答案 29 :(得分:0)

我的大窍门是MATLAB的语法。我使用它,并且有一些我喜欢它的东西,但它有很多烦人的怪癖。我们来看看。

  • 矩阵用括号索引。因此,如果您看到像Image(350,260)之类的内容,那么您是否从Image矩阵中获取了一个元素,或者我们是否正在调用一个名为Image的函数并将参数传递给它时,您就不知道了。
  • 范围很疯狂。我似乎记得for循环索引变量在循环结束后仍然在范围内。
  • 如果忘记在分配后粘贴分号,则该值将被转储到标准输出。
  • 每个文件可能有一个功能。这对于组织一个人的工作来说非常烦人。

如果我考虑的话,我相信我能拿出更多。

答案 30 :(得分:0)

[免责声明:我对VB的熟悉程度已经过去了,所以我的评论很简单]

我讨厌VB中的每个关键字如何像这样大写。我在另一周(月份?)看到一篇关于尝试编写VB代码而没有任何大写字母的人的博客文章(他们对编译器做了一些让他们编译VB代码的东西),并且语言看起来更好!

答案 31 :(得分: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)我从“为什么的尖锐指南”中自学了

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

哦,我也讨厌

if(a)
  b();

语法。你不知道我刚完成了多少次

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

意外地编写了类似的代码。实际上它可能会更糟糕

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

唯一可以使用的地方是

if(a){ ....
}else if(b){ ...

答案 32 :(得分:0)

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

我想如果你学习了一些东西并且暂时使用它(甚至可能几个小时就足够了,至少对我而言),你实际上可以克服你在语法上的不喜欢,并且能够专注于什么你应该真正使用这种语言的工具。

答案 33 :(得分:0)

我讨厌在Python中我永远不知道某个东西是对象上的方法,还是一些随机函数(参见built-in functions)。感觉就像他们开始使语言面向对象,但后来松了一口气。让这些函数成为某些基类的方法对我来说更有意义,比如Object。

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

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

我不喜欢Python坚持的一种正确的做法。我想要选择。

答案 34 :(得分:0)

我对C#的挂断非常简单:

  1. Scoped blocks
  2. 我希望我能写

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

    而不是:

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

    特别是对于StringBuilder上的Append,AppendFormat,这会使代码变得不那么麻烦。

    1. 空值
    2. 我希望我能说:

      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 coalesce,它可以在多个级别上运行。

答案 35 :(得分:-1)

适用于多种语言:

  1. 区分大小写 - 无论谁的想法是什么?! (那些使用SomeWordsThatMeanSomething以及somewordstansmeansmethingomething for different meaningings的人应该被拍摄:)

  2. 从0开始的数组索引。我来自fortran背景,这是另一个原因,但在数学数组中索引始终以1开头,所以在实现时往往会产生很多麻烦(特别是在调试时)一个更大的模型。

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

  4. 卷曲括号 - 见3.

  5. P.S。你们所有人都在那里。别生气。如果你不喜欢这个答案,你就不应该问。

答案 36 :(得分:-5)

我有一个实用的代码来自多年的代码,用于调查和调试其他人的代码。我会删除(从所有语言)在条件语句中分组逻辑运算的能力。这来自对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
    }
}

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