你讨厌自己喜欢的语言有五件事情是什么?

时间:2008-11-11 22:14:44

标签: programming-languages language-agnostic

最近Stack Overflow上出现了一组Perl-hate,所以我想我会把我的“Five things you hate about your favorite language”问题带到Stack Overflow。拿你最喜欢的语言告诉我你讨厌的五件事。那些可能是让你烦恼,承认设计缺陷,公认的性能问题或任何其他类别的东西。你只需要讨厌它,它必须是你最喜欢的语言。

不要将它与其他语言进行比较,也不要谈论你已经厌恶的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只是想听听你讨厌但容忍的事情,这样你就可以使用所有其他东西了,我想听听你希望别人会用的语言。

每当有人试图将他们最喜欢的语言推到我身上时,我就会问这个问题,有时候这也是一个面试问题。如果有人找不到讨厌他最喜欢的工具的五件事情,他就不会很清楚地提倡它或者使用它来获取大笔资金。他没有在足够多的情况下使用它来充分探索它。他主张将其作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,我就错了。

我并不关心你使用哪种语言。不想使用特定的语言?然后不要。您是否经过尽职调查以做出明智的选择但仍然不使用它?精细。有时候正确的答案是“你有一个强大的编程团队,有很好的实践和很多Bar的经验。改变Foo会是愚蠢的。”


这也是代码审查的一个很好的问题。真正了解代码库的人会对它有各种各样的建议,那些不太了解代码库的人会有非特定的投诉。我问的问题是“如果你能重新开始这个项目,你会做些什么不同的事情?”在这个幻想的土地上,用户和程序员会抱怨任何他们不喜欢的东西。 “我想要一个更好的界面”,“我想将模型与视图分开”,“我会使用这个模块而不是另一个”,“我会重命名这套方法”,或者他们真的不喜欢不喜欢目前的情况。这就是我如何处理特定开发人员对代码库的了解程度。这也是一个线索,关于程序员的自我与他告诉我的内容有多大关系。

仇恨并不是弄清楚人们知道多少的唯一方面,但我发现这是一个非常好的方面。他们讨厌的事情也让我知道他们对这个主题的思考程度。

182 个答案:

答案 0 :(得分:216)

哇,我很惊讶 SQL 还没有在这里搞定。猜猜这意味着没有人喜欢它:)。

  • 跨实现的语法不一致
  • 由于看似模糊的原因,微妙的代码差异可能会产生巨大的性能影响
  • 对文本操作的支持不足
  • 入门成本高,但掌握语言的学习曲线陡峭
  • 社区内针对最佳做法的最小标准化,包括语法风格。

......还有一些额外的理由来讨厌它,不收取额外费用

  • WHERE子句最后一个,很容易过早地执行UPDATE或DELETE,从而破坏整个表。相反,WHERE应该在前面的某个地方。
  • 实施关系分工很困难。
  • 我可以将值设置为NULL,但我无法测试它与NULL的相等性。我可以检查IS NULL,但这只会使代码复杂化 - 在我看来,这是不必要的。
  • 为什么我们需要完全重新指定GROUPed列的公式,而不是在列上设置别名,然后在别名上设置GROUP BY(或者像SORT那样设置列索引)?

答案 1 :(得分:182)

我讨厌Java的五件事:

  • 没有一流的功能。
  • 没有类型推断。
  • 缺乏理智的默认设置,例如图片。
  • NullPointerException不包含有关null的更多信息。
  • 无意义的“可配置”框架/服务提供者接口/工厂类/依赖注入系统的激增。可配置性几乎从未使用过,严重违反了DRY,代码大小翻了四倍,易读性减半。

我知道,我应该查看Scala。

答案 2 :(得分:160)

<强>的JavaScript

  1. 所有最酷的事情都是非常复杂的,但是,所有的冷静也包含在如此少量的代码中,让你感到愚蠢的努力追随它

  2. '+'是一种荒谬的运算符选择,用于弱类型语言的连接。他们尝试来吓跑新手?

  3. 这是一个跨浏览器兼容性的雷区(如果它甚至没有打开,也不介意)

  4. 它通常是不受信任的 - 与诸如阻止后退按钮,永不死亡的弹出窗口等的捣乱有关。

  5. 调试几乎是不可能的,因为只有几个不同的错误消息和几个不同的类型(数字,字符串,对象等)

  6. 如果不是jQuery,我可能仍然像以前一样讨厌它:)

答案 3 :(得分:149)

PHP:

1)强迫我做出不必要的变量:

$parts = explode('|', $string);
$first = $parts[0];

2)lambdas的实现如此蹩脚,大致相当于使用eval(),所以我从未使用过它,这是一个可怕的错误(见http://www.php.net/create_function)。

3)一个try / catch系统,它只能捕获可能发生的大约80%的错误。

4)正则表达式支持与lambda支持一样蹩脚,因为它必须写在常规字符串中,使得难以学习的编程工具之一难度大约是其三倍。 PHP应该是一种“简单”的语言?!?!?

5)无法在不写入两次或构建自己的函数或使用“@”运算符的情况下安全地从$ _POST中提取东西:

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6)奖金回答:'@'。如果您无法正确编写代码,只需添加“@”,对于以后必须调试代码的任何人来说都太糟糕了。

答案 4 :(得分:135)

C ++

  • 很容易随意破坏内存并创建几乎不可能发现的错误(尽管Valgrind对解决这个问题还有很长的路要走。)
  • 模板错误消息。
  • 使用模板时,很容易将所有内容都包含在一个文件中,然后获得愚蠢的编译时间。
  • 标准库是现代时代的笑话(默认情况下仍然没有线程或网络?)
  • 很多讨厌的小东西(特别是short / int / unsigned / etc之间的所有转换......)

答案 5 :(得分:129)

C#/ .NET:

  • 默认情况下应该密封课程
  • 应该没有lock语句 - 相反,你应该有特定的锁定对象,并且应该有诸如Acquire之类的方法返回一次性锁定令牌。推论:每个对象都不应该有监视器。
  • GetHashCode()Equals()不应该在System.Object中 - 并非所有内容都适合散列。相反,让IdentityComparer执行相同的操作,并保留IComparer<T>IComparable<T>IEqualityComparer<T>IEquatable<T>接口以进行自定义比较。
  • 对不变性的不良支持
  • 发现扩展方法的方法很差 - 它应该是一个更有意识的决定,而不仅仅是我使用命名空间的事实。

那些是我的头脑 - 明天问我,我会想出一个不同的5:)

答案 6 :(得分:113)

C

  • 字符串操作。

必须手动处理字符串缓冲区是一个容易出错的痛苦。由于如此多的计算实际上正在移动和修改字符串(计算机并没有像人们认为的那样在大数字运算时使用得那么多),能够使用托管语言或C ++的字符串真的很棒对象来处理这些。当我必须在直线C中进行时,感觉就像在流沙中游泳一样。

答案 7 :(得分:94)

答案 8 :(得分:88)

我讨厌的五件事 Java (目前,这是我最喜欢的语言)并没有特别的顺序。

  1. 尽管我是Java Generics的粉丝,但它的设计方式却有很多奇怪之处。因此,泛型中存在无数令人讨厌的限制(其中一些是类型擦除的结果)。
  2. Object.clone()和Cloneable接口的工作方式完全破碎。
  3. Sun没有采取高速公路并将所有东西都作为对象(a.la. SmallTalk),而是创建了两种截然不同的数据类型:对象和基元。因此,现在有两个表示基本数据类型和奇怪的好奇心,如装箱/拆箱,不能将原语放在集合中。
  4. 挥杆过于复杂。不要误会我的意思:用Swing可以做很多很酷的事情,但它是过度工程的一个很好的例子。
  5. 最后的抱怨同样也是Sun和那些为Java编写XML库的人的错。 Java XML库太复杂了。为了简单地读入XML文件,我经常要担心我使用的解析器:DOM还是SAX?每个API都同样令人困惑。 轻松解析/编写XML语言的原生支持非常好。
  6. java.util.Date糟透了。它不仅不必要地复杂化,而且所有有用的方法都已被弃用(并被其他增加复杂性的方法所取代)。

答案 9 :(得分:73)

Ruby 有很多与其速度相关的缺陷,但我不讨厌这些。它也有社区传福音过火的缺陷,但这并没有真正困扰我。这些是我讨厌的:

  • 闭包(块)有4种不同的创建语法,但它们都不是最佳的。优雅的语法不完整,使用哈希模糊,完整的语法很难看。
  • 社区倾向于反对真正的文档,倾向于“阅读代码”。我发现这幼稚和懒惰。
  • 元编程滥用,特别是在图书馆中,使得bug成为追踪的噩梦。
  • 在相关的说明中,普遍的元编程使得全面的IDE很难(如果不是不可能的话)制作出来。
  • 块传递给函数的方式很愚蠢。没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield)。我认为块应该被赋予一个不那么模糊的语法(或者哈希可以使用不同的分隔符;也许&lt;&gt;而不是{}),并且作为参数传递给方法应该像所有其他参数一样。

    object.method(1, {|a| a.bar}, "blah")
    

    这些奇怪的东西,比如块必须是传递的最后一个参数,并且传递多个块是不同的,语法更长,真的很烦我。

答案 10 :(得分:72)

的Perl

  • 混合使用符号

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • 例如 none 是相同的:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    Perl6 written

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • 缺乏真正的OO

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    Perl6 written

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • 设计不佳的正则表达式功能

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    Perl6 written

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • 缺少多次发送

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    Perl6 written

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • 操作员负载过重

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    Perl6 written

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

答案 11 :(得分:58)

我有时会喜欢 PHP ,而且Python会做得太多。

  • 没有命名空间;一切都在 是一种非常大的命名空间 在更大的环境中地狱

  • 缺乏标准 函数:数组函数取一个 针作为第一个论点,干草堆 作为第二个(见array_search)。 字符串函数经常采用 干草堆第一,针第二(见 strpos)。其他功能只是 使用不同的命名方案: bin2hexstrtolowercal_to_jd

    有些功能有奇怪的回报 正常的价值观:这个 强迫你拥有第三个变量 PHP时无处声明 可以有效地解释一个空的 数组为false类型 戏法。几乎没有其他 功能相同。

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • 语言(直到PHP6)完成它 最好是尊重近乎迟钝的人 向后兼容,制作它 带有不良做法和功能 在不需要的时候(见 mysql_escape_string vs. mysql_real_escape_string)。

  • 语言是从a演变而来的 模板语言 全后端的。这意味着任何人 可以随时输出任何东西, 它被滥用了。你结束了 用于模板的模板引擎 语言...

  • 导入文件很糟糕。您 有4种不同的方法来做到这一点 (include,include_once,require, require_once),它们都很慢, 非常慢。实际上整个 语言很慢。至少,漂亮 比python慢​​(即使有一个 框架)和RoR来自我 聚集。

我仍然喜欢PHP。这是网络开发的链锯:你想要一个真正快速完成的中小型网站,并确保任何人都可以托管它(尽管配置可能不同)? PHP就在那里,它无处不在,安装一个完整的LAMP或WAMP堆栈只需要5分钟。好吧,我现在要回Python了......

答案 12 :(得分:50)

以下是一些我不喜欢Java的东西(这不是我最喜欢的语言):

  • 泛型类型擦除(即没有具体化的泛型)
  • 无法在单个catch块中捕获多个异常(不同类型)
  • 缺少析构函数(finalize()是一个非常糟糕的替代品)
  • 不支持关闭或将函数作为数据处理(匿名内部类是一个非常冗长的替代品)
  • 一般检查异常,或者更具体地说,检查不可恢复的异常(例如SQLException)
  • 对文字集合没有语言级支持
  • 当调用泛型类的构造函数时,没有类型推断,即类型参数必须在'='的两边重复

答案 13 :(得分:40)

<强> C ++

  1. 模板语法
  2. 钻石继承问题
  3. 现代语言所拥有的过多/缺乏标准库(虽然提升很接近)。
  4. 输入输出流
  5. IOStreams
  6. 周围使用的语法

    <强>的Python

    1. 空间有意义(有时)
    2. 强调关键字
    3. 有限的线程支持(至少目前)
    4. “self”而不是“this”
    5. 空间有意义(有时)

答案 14 :(得分:37)

<强>目标C

1)没有命名空间,只是手动命名约定 - 我不介意在类分离方面,但我确实错过了能够在一行中导入命名空间中的所有类定义(如import com.me) .somelibrary。*)。

2)图书馆在RegEx支持等重要领域仍然存在一些漏洞。

3)属性语法有点笨拙,需要三行(在两个单独的文件中)来声明属性。

4)我喜欢保留/释放模型,但它比发布引用更容易,然后在以后意外地使用它。

5)虽然不是真正的语言功能,但Xcode与Objective-C的使用密切相关,我不禁想到这个方面......基本上自动完成,非常不确定。它更像是一个奖励你找到你想要的东西的系统,然后把它作为一个选择。但后来我想我从来没有喜欢自动完成引擎。

答案 15 :(得分:36)

C ++

  • <强>字符串。
    它们不能与平台字符串互操作,因此您最终会在一半的时间内使用std :: vector。未定义复制策略(写入或深层复制时复制),因此无法为直接语法提供性能保证。有时它们依赖于不太直观的STL算法。太多的库自己滚动,不幸的是使用它们更加舒适。除非你必须将它们结合起来。

  • 各种字符串表示
    现在,这是一个平台问题 - 但是我仍然希望在早期可用的不那么顽固的标准字符串类时会更好。我经常使用以下字符串表示:

    • 通用LPCTSTR,
    • 由CoTaskMemAlloc分配的LPC(W)STR,
    • BSTR,_bstr _t
    • (w)string,
    • CString,
    • 的std ::矢量
    • 一个自己动手的类(叹气),它将范围检查和基本操作添加到已知长度的(w)char *缓冲区
  • 构建模型。
    我厌倦了所有的时间花在与谁包括什么,前进声明,优化预编译标题和包括至少保持增量构建时间可以忍受等等。这在八十年代是伟大的,但现在?包装一段代码有很多障碍,所以可以重复使用,甚至妈妈们也会听我的话感到无聊。

  • 难以解析
    这使得外部工具特别难以编写,并且正确。今天,我们C ++人员大多缺乏工具链。我喜欢我的C#反思和代表,但我可以没有它们。如果没有很好的重构,我就不能。

  • 线程太难
    语言甚至不识别它(到现在为止),编译器的自由 - 虽然很棒 - 但是很痛苦。

  • 静态和按需初始化 从技术上讲,我在这里作弊:这是“重复使用的代码”中的另一个难题:只有在需要时才能初始化某个东西是一场噩梦。所有其他redist问题的最佳解决方案是将所有内容放入标题中,这个问题说“neeener - 你不能”。


当然,其中很多都超出了严格的语言范围,但IMO需要对整个工具链进行评判并需要进化。

答案 16 :(得分:35)

<强>的JavaScript

  • 可以修改Object原型。程序中的每个对象都会获得新的属性,并且可能会中断。

  • 所有对象都是哈希映射,但很难安全地使用它们。特别是,如果您的某个密钥恰好是__proto__,那么您就遇到了麻烦。

  • 在功能参考时没有对象关闭。实际上,根本没有对象闭包 - 相反,只要使用对象表示法或this运算符调用函数,就会设置new。导致很多混乱,尤其是在创建事件回调时,因为this未设置为程序员所期望的。

    • 推论:调用不带对象表示法的函数new运算符会导致this设置为等于全局对象,从而导致严重破坏。
  • 尽管两个操作根本不同,但加法运算符重载也会执行字符串连接。当您期望作为数字的值实际上是一个字符串时,会导致痛苦。

  • ==!=运算符执行类型强制。不同类型之间的比较涉及一系列规则,凡凡人都无法完整记住。 ===!==运算符的存在减轻了这种情况。

  • nullundefined都存在,具有微妙的不同但冗余的含义。为什么呢?

  • 设置原型链的奇怪语法。

  • parseInt(s)需要一个C风格的数字,因此将前导零的值视为八进制等。您至少可以parseInt(s, 10),但默认行为会令人困惑。

    < / LI>
  • 没有区块范围。

  • 可以多次声明同一个变量。

  • 可以使用变量而不声明它,在这种情况下它是全局的,可能会破坏你的程序。

  • with { }

  • 真的难以使用类似工具的JavaDoc进行记录。

答案 17 :(得分:34)

的Python:

  • 缺乏静态类型
  • 默认参数处理(特别是您可以为将来的来电者change the default argument这一事实!)
  • 太多必需的下划线(构造函数必须调用__init__
  • 缺乏适当的私人成员和功能(惯例只是说大多数以下划线开头的东西是私有的,除了__getattr__之外的所有东西都没有)
  • print文件的有趣语法(但他们在Python 3中修复它)

答案 18 :(得分:32)

<强> C#

  • 我希望我能switch()任何类型,case可以是任何表达。

  • 无法将对象初始化程序语法与'readonly'字段/ private set autoprops一起使用。一般来说,我希望语言帮助制作不可变类型。

  • 将<{1>}用于命名空间方法以及属性/索引器块多语句块数组初始值设定项

  • 。当你们相距甚远或不匹配时,很难弄明白你的位置。

  • 我讨厌写{}。我不想回退到方法调用语法,因为查询语法缺少某些东西。

  • 我想要一个关于查询语法的(from x in y ... select).Z()子句,就像do一样。但那不是一个真正的问题。

我真的到了这里。我认为C#太棒了,而且很难找到很多被打破的东西。

答案 19 :(得分:26)

<强> PHP

  1. 如果您不控制服务器,则没有调试功能,即使这样,他们也有点傻逼
  2. 大量错误的PHP代码浮出水面,给所有PHP程序员一个坏名字
  3. 功能命名不一致
  4. 如果我想要一个静态类型变量,我就无法拥有静态类型变量(我90%的时间都是动态类型的忠实粉丝)
  5. REGISTER_GLOBALS是魔鬼

答案 20 :(得分:25)

C(好吧,这不是我最喜欢的,但还没有完成。)

  • 套接字库语法。
  • 没有函数重载。
  • C风格的字符串。
  • 缓冲区溢出。
  • 隐秘语法。我不知道有多少次我抬头看过像atoi这样的东西,打了我的额头,然后喊道“当然!”
编辑:如果我使用更多的库代码(比如我使用套接字,但是那些特别糟糕),我可能会想出更多,但我已经觉得我在欺骗选择C.这么多语言存在只是为了取得C的优点,取而代之的是它有点像打死马。

答案 21 :(得分:24)

Common Lisp:

  1. 关键字往往过于冗长。
  2. 图书馆支持可怜。
  3. 在想要更严格地处理内存的操作系统中不能正常工作。
  4. 没有良好的与操作系统交互的便利。
  5. “循环”设施没有明确定义,肯定看起来不像Lispy。

答案 22 :(得分:24)

<强> BrainF * CK

  • 您的亮点是您图灵完整?!我可以用Perl正则表达式做更多的事情!

  • 缺少物品。来吧,人们!就像,你好 ...

  • 没有网络库。我想要的只是刮一个网页,GOSH。

  • 没有一流的功能。恭喜你 - 你得与你的Java朋友同情。

  • 用于存储的无限磁带,没有别的。这非常自命不凡,我们不妨写Lisp。

答案 23 :(得分:23)

<强>的JavaScript

  1. 数字作为字符串 - 数学可以 数字是令人沮丧的 解释为字符串。 5 + 2 = 52? 哎呀...
  2. 权限 - 所有最好的东西都需要用户的许可!
  3. 屏幕更新 - 浏览器必须处于稳定状态才能更新屏幕。似乎没有办法强制屏幕在脚本中间更新。
  4. 慢 - 虽然谷歌的Chrome很不错......
  5. 浏览器差异使得使用语言a [censored]。

答案 24 :(得分:20)

PHP:

  • 我们永远无法确定所有网络服务器上都有某些几乎常见的扩展名。
  • 试图成为未来的一切(goto,closures,...)
  • 对于没有经验的用户存在许多安全风险
  • 更多运算符重载会很好
  • 所有那些不学习如何使其正常工作并给它起个坏名声的可怜程序员

然而,PHP是 (脚本)语言。 ; - )

答案 25 :(得分:18)

VB6

  1. 仅限Windows。
  2. 不再支持。
  3. 数组可以从任意数字开始,而不是全部被标准化为0。
  4. 编译的应用程序依赖于许多dll才能正常运行。
  5. 许多复杂的控件(如浏览器控件或复杂的代码段)在运行未编译的代码时往往会破坏IDE,但在编译时工作正常。

答案 26 :(得分:18)

Ruby是我最喜欢的语言,这是我不喜欢的:

  • 绿色线程+阻止C库=巨人失败
  • 太痛苦了
  • 标准库本身与它的使用不一致!方法
  • 模块包括+ extend is messy。
  • “Open Classes”不能作用域 - 我想添加一个String #dostuff,但我不想让它泄漏到所有第三方库中
  • 没有二进制部署打包解决方案。

答案 27 :(得分:17)

的Delphi:

  • IDE有点不稳定。
  • 代码洞察有时会混淆。
  • 调试有时会出错。
  • 更新多个项目文件可能很麻烦。
  • 如果在一个或多个软件包不可用时启动,则会多次弹出错误消息。

答案 28 :(得分:16)

<强>的JavaScript

  • 每个脚本都在一个全局“命名空间”中执行...在处理来自不同来源的脚本时您必须注意的事项

  • 如果使用了变量但尚未预先定义,则将其视为全局变量

  • 浏览器供应商按照自己的意愿制定标准,为使用这种美丽语言的开发人员编写代码应该比应该更难

  • 区分大小写 - 考虑到使用编译时检查开发js没有合适的IDE

  • 解决方法(例如使用hasOwnProperty方法)执行某些操作,否则操作简单。

答案 29 :(得分:15)

Haskell中:

  1. 懒惰评估中的空间泄漏。
  2. 数学层次结构不是根据数学抽象构建的。
  3. 严格的monadic IO会使调试变得更加困难。
  4. 大型实现以一种似乎与标准不兼容的方式处理I / O. (特别是,输出字符只输出低8位 - 然后构建使用此假设进行二进制I / O的代码.Ick。)
  5. ($)运算符的关联性可以更改为使某些表达式更漂亮。
  6. 其中大多数都没有达到仇恨的程度,并且有人试图为这些中的每一个修复或构建固体解决方法。

    编辑:关于第5点存在一些混淆。特别是有些人似乎认为我的意思是参数的顺序,而我没有。我不会解释我的意思,而只是将人们指向以下链接,http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity,它表达得很好。

答案 30 :(得分:13)

Smalltalk中

  • 我不想再用java,delphi,c#或ruby开发了(这是不切实际的,因为我公司的主要开发语言是c#,delphi和java)。
  • 从左到右的评估。
  • 有课程评论但没有方法评论(至少在Squeak中)
  • 没有真正的标准库,细节上有很多差异
  • 缺少名称空间

答案 31 :(得分:13)

我知道我迟到了,但仇恨是永恒的!

的Java

  • Runtime.exec()。因此,如果我不手动清除STDOUT和STDERR缓冲区,我的代码会挂起吗?哇。死,PLZ。
  • 空指针异常。负责任的编程意味着我必须对待大多数对象,就像它们是未爆炸的炸弹一样,这是一种面向对象语言的pisser。当不可避免的事情发生时,我有点需要知道哪个对象在我脸上爆炸,但Java显然觉得它会让我作弊。
  • 文件I / O。为什么我必须通过这么多箍来阅读dang文本文件?在复制文件时,我必须将源文件汇集到我的代码中并手动处理输出字节缓冲区?你认真吗?
  • 基元与原始包装器。请注意,Java现在具有许多功能,允许您将基元及其包装器对象视为在某些地方可互换,但在其他地方则不可;别担心,编译器会让你知道哪个是哪个。这对于从根本上进行设计决策的工作感觉就像是一个黑客。它是。 (编辑:实际上,编译器比我想象的更安全,特别是在进行相等检查时。如果`a`和`b`是整数,'a == b`保证只有当它们中的至少一个是`int`类型时,才会按预期运行。如果它们都是`Integer`类型,那么只有当两个数字介于-128和127之间时,该语句才能做你想象的.`Engger a = 1000;整数b = 1000;返回a == b;`将返回`false`。真的。)
  • XML。我有这个简单的小XML文件我需要创建,我必须做什么?

答案 32 :(得分:12)

的Lua

我喜欢这种语言,但有些事情让我困扰多年!

  • 没有(内置)支持二进制操作(从5.1开始,它可能带有5.2)。
  • 应该有一个内置的二进制缓冲区实现,例如允许长字符串连接。
  • 我知道它在语法上不合适,但有时候我会想念longVariableName ++或verboseVariableName + = 5.
  • 参考假定知识C(我有它,但它对新手来说是减号)并且推迟了对C引用的一些帮助!有时它太简洁了。
  • 它开始拥有大量的图书馆,但你必须从不同的地方获得它们。另一方面,下载量非常小! ; - )

答案 33 :(得分:11)

VB.NET

  • 行为AndAlso / OrElseAnd / Or似乎倒退了。也许他们应该换掉。
  • When只能用于异常捕获。执行When条件的能力对于其他一些事情会很好。
  • VS IDE中没有friggin Refactoring(不是真正的语言错误),就像C#
  • 一样
  • Not <obj> Is Nothing。是的,这已由IsNot补救,但出于某种原因,我发现Not Is过于频繁使用。 (对于那些把英语作为第二语言的开发者来说,我更频繁地看到它,从这个角度来看它是否更有意义?)
  • ()和大多数功能都不需要ToString()。 (导致草率的编码习惯)
  • 断线时必须_
  • 它允许可选参数。 (导致草率的编码习惯)
  • 声明数组由UpperBound完成,而不是由容量完成。 “Dim arr(2)as String” 实际上会持有3个元素。
  • =成为比较赋值运算符。

答案 34 :(得分:11)

的Python

  • 1-3:包装/构建/文档系统没有一个明显的选择(例如Perl的cpanPOD或Ruby的{{1 },gemrake)。

  • 4:Python 3.0与每个Python项目需要两个源分支(2.x和3.x)不兼容。但是Python 3.0 不兼容,足以证明它的合理性。大多数py3k的优点都太微妙了。

  • 5:Jython,IronPython,CPython不兼容。

答案 35 :(得分:10)

目标Caml

  1. 非并发垃圾收集器。我可以整天编写多线程程序,但它们一次只能获得我的八个核心之一。这让我很难过。

  2. 否型类(或他们的道德当量)。有古濑桑的GCaml,但它是A)并不像类型类和B一样好)不INRIA发行。

  3. 非常需要Cocoa桥。说真的。如果我用基于DNA的生命形式的实际接口编写更多代码,那么我可能会分解并自己编写这个该死的东西。为什么没有其他人这样做呢?

  4. Functors很可恶。说真的,模块应该是一流的价值观。应该只有一种功能。在你激怒我之前,请先阅读Montagu and Rémy

  5. 应该使用LLVM作为后端。我是谁必须谋杀才能让OCaml为我愚蠢的小型ARM6内核编译?

  6. 所以是的,我有一些问题。我仍然喜欢这种语言。这真是太棒了。

答案 36 :(得分:9)

VBA(包括MS Office IDE):

1)文件不佳
  2)错误信息不良
  3)阵列操作例程不足
  4)必须重复DIM语句的类型
  5)不会打印彩色(必须购买第三方插件)

答案 37 :(得分:9)

我自己的前5名“我真的很讨厌c ++”:

[5]自动生成构造函数,析构函数和赋值运算符。伙计,每当我不在课堂上宣布某些内容时,就意味着我不需要它,而不是我忘记它。你,编译器,听到我吗?!

[4]模板语法。哦,我真的需要输入所有这些“&lt;”和“&gt;”,每当我决定从类体中提取定义时?

[3]字符串。 Jeez,我厌倦了“const char *”,我必须处理NULL情况,我必须浪费O(N)来获取它的长度,我必须为concat操作分配一个缓冲区。

[2]宏观处理。每当我不明白,我的编译器发生了什么,我就开始寻找一个宏。

[1]运算符重载。我看到代码“A + B * C”,我不能说出这段代码的含义,直到我看到A,B和C的实际类型。

答案 38 :(得分:8)

Delphi(又名Object Pascal),我将讨论原生版本,而不是.NET。

  • Var blocks!
  • 语言中的接口在设计时考虑了COM的使用 - 因此比C#或Java中的更复杂。即。除非您明确禁用引用计数,否则引用计数。
  • try except finally end;
  • 对象创建过于明确:

    var obj: TMyObject;
    ...
    obj := TMyObject.Create;
    try
      ...
    finally
      obj.Free;
    end;
    

取而代之的是

auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block. 
  • 好的,语言非常好我不能再这么想了所以我在这里推动自己:像字符串,整数......或枚举这样的内置类型会更好地拥有方法。即。 i.ToString代替IntToStr(i)

答案 39 :(得分:7)

的Lua:

  • 我理解原因,但认真。默认情况下,变量应为本地变量,使用global关键字,反之亦然。
  • 我一般不是do / end风格语义的忠实粉丝。我更喜欢C型支架。
  • 动态打字。我知道,有些人会去“嗯?”但是我已经完全知道确切地知道给定变量中的数据类型。常数if (type(var) == "string") then stuff() end很痛苦。
  • 在使用变量之前无需定义变量。我更愿意明确我要做的事情,而不是冒着打字错误导致我喜欢称之为“古怪的豆子”。

PHP:

  • 再次,动态打字。
  • 缺少关闭。我知道,你可以做$function($arg);,但这不算数。
  • 同样,变量可以在定义之前使用。我有个人政策,在使用之前总是将任何变量显式初始化为已知值,并将其扩展到我有任何控制权的最佳实践文档。

C / C ++:

  • 标题=颈部疼痛。
  • 不支持关闭。 (我很高兴C ++ 0x,它有它们。)
  • 静态输入。 “等等,”你说。 “你刚才说你不喜欢动态打字!”是的,我确实这么说过。但静态打字也可能是一个痛苦的屁股。 (如果给出了一个选择,我仍然会选择静态类型。)最好我喜欢默认情况下静态输入的语言,但也支持动态类型。 (而且我也喜欢小马,五十亿美元,还有世界,请。)

答案 40 :(得分:7)

红宝石:

  1. 这很慢......
  2. 自我中心社区
  3. 这不是很小的话。
  4. 在nil上调用方法时出错,而不是仅返回nilàlaObjective C
  5. 非原生线程

答案 41 :(得分:7)

<强> C

  1. 无参数多态(即C ++模板)。它使得编写可重用的数据结构和算法变得很麻烦(并且几乎没有任何静态检查)。例如,参见qsort和bsearch的比较器参数:比较器获取void指针:(
  2. 没有数据结构库。我真的很讨厌写自己的哈希表。我也非常讨厌在网上搜索可重用数据结构库。特别是如果它变得不完整。
  3. 字符串即可。表示效率低下,如果你理智,笨拙,太难以安全地输入一个字符串。没有snprintf的标准。使用sprintf创建格式字符串太困难了,然后使用它以安全的方式再次创建一个包含sprintf的字符串。
  4. 仅限词汇宏。如果不同的编译器期望在不同的地方使用函数注释,我必须将相同的HAS_NO_SIDE_EFFECTS放在不同的地方。为什么我不能抓住函数,切换编译器类型,然后通过宏调用将它插入到正确的位置?
  5. 没有用于常见功能的可移植库。对于套接字和线程,我使用SDL ---一个frigging 游戏库。对于.ini风格的解析器,我能找到的唯一一个为ubuntu打包的库,我在每日wtf上发布(它计算一个哈希值数组,然后通过它进行线性扫描......)
  6. <强> C ++

    1. 模板语法很重且不适合。我们来看看for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it)
    2. STL中的设计错误。您的向量的更改分配策略是否真的会更改其类型
    3. 过于复杂的类型系统。类型T1具有convert-to-T2方法,T2具有隐式的from-T1构造函数。这就是所谓的?重载,覆盖和多重继承如何交互?不好,我猜......
    4. 来自模板的令人难以置信的长而笨重的错误消息。你知道我的意思......
    5. 引用表示您无法在呼叫站点看到输出参数。在C中,您可以猜出foo(bar, &baz)能够和不能修改的内容。

答案 42 :(得分:6)

我的语言是Java。以下是我讨厌的事情:

5.缺乏指针
 4.)异常捕获
 3.)布尔类型
 2.)BigDecimal类型
 1.)C#粉丝和Java粉丝

Boolean可以为null。我发现这违反直觉。

BigDecimal是一个库而不是语言功能。我对BigDecimalException的困扰主要来自编写测试类,这些测试类必须跳过一堆箍才能完成实际的工作。我应该澄清我对这些事感到恼火,我不打算游说改变。

答案 43 :(得分:6)

的Python:

  1. 太慢了!
  2. list操作不返回列表,因此你不能做list.append(4).append(5)。 (我的意思是对同一个清单的引用,而不是副本)。这是一个小小的抱怨;它只出现了几次。
  3. 语句不返回值(if,print,while,for等)。这只是处理lambda时的一个问题。
  4. lambdas只能是一个表达式。这种限制并不是真正需要的,因为它们与其他方式的功能相同。如果我想要一个调用两个功能的按钮按下事件怎么办?我需要创建一个命名函数来为动作监听器提供该功能,同时执行“lambda:f1(); f2()”不会受到伤害。
  5. 您只能将标准的a-zA-Z_0-9作为名称。有像“真的?”这样的功能。和“+”会很棒。当然,这可能导致可怕的混淆,但我并不是说我们立即将所有函数重命名为“p @ $%3”。你觉得哪个更清楚:“dec2bin”或“dec-&gt; bin”? (“store_results”或“storeResults”)或“store-results”?

答案 44 :(得分:6)

的Groovy / Grails的

  1. 鸭打字
  2. 约定配置,假设你知道公约
  3. 你讨厌春天的一切
  4. 你讨厌Hibernate的一切
  5. [Groovy]跨集合的常见操作不是(但最近的版本改进了这个)

答案 45 :(得分:6)

的ColdFusion

  1. 编译大型Flash表单的时间。
  2. 动态变量类型(有时我讨厌它们。)
  3. CFScript缺乏功能。
  4. CFTable(永远无法让它显示正确)。
  5. CFChart缺少图表类型。
  6. 完全缺乏NTLM支持(企业就绪 - 是的)#/ li>
  7. CFCs中的Moronic var范围
  8. 没有真正的NULL概念 - 你的变量就消失了!
  9. 无法测试某些事物的存在(如范围,只是其中的成员)

答案 46 :(得分:6)

<强>的JavaScript

  1. 函数对象语法:

    f = new Function( "foo", "bar", "return foo+bar;" );
    

    (它需要n个参数,第一个n-1 那么是函数的参数 nth是实际的函数,in 字符串形式。这真是太傻了。)

  2. 函数参数可以是 重复。

    f = new Function( "foo", "foo", "return foo;" );
    

    最后一次重复是唯一的重复 但是曾经使用过:

    f( "bye", "hi" ) // returns "hi"
    f( "hi" ) // returns undefined
    
  3. E4X应该死了。我的用户是 总是抱怨它没有 以他们认为的方式工作。 当你需要一个页面时,让我们面对它吧 和一半的伪代码 塞特,是时候重新考虑事情了。

  4. 标准概念 stdin / stdout / stderr(和文件!) 会很好。

  5. null!= undefined

    必须处理这令人恼火 他们俩。有时它很有用, 但大多数语言都设法跛行 一个人很好。

答案 47 :(得分:6)

<强>的Python

  • __init__
  • 有些库很尴尬,比如smtplib
  • 'self'必须在方法声明中!!!
  • (对于3.0之前的版本)有点差的unicode支持
  • 缺乏内联try-catch
  • 没有直接引用“this”/ current模块(而是必须使用sys.modules[__name__]

答案 48 :(得分:6)

ActionScript / AS3

  • 没有抽象类
  • 没有私有构造函数(所以单例是黑客)
  • FP10之前没有类型化数组
  • Flash IDE中的编译/发布时间非常缓慢
  • 内置函数(例如Math)的性能很慢

否则它实际上是一种很好的语言 - 比JavaScript更好,与流行的看法相反,比PHP好一百万倍。

答案 49 :(得分:6)

<强> C#

这是一种很棒的语言,尤其是LINQ,但与C ++相比,泛型支持。它有很大的潜力,但目前的实现仅对强类型集合和类似的琐碎事物有用。它失败的一些例子:

  • 通用参数不能仅限于枚举(仅限类或结构)。
  • 泛型参数不能是静态类。为什么?这似乎是一种完全人为的限制。
  • 您不能指定泛型类型必须具有带有特定签名的构造函数,因为您不能在接口上具有构造函数。为什么不?这只是另一种使用特殊名称“.ctor”的方法。
  • 同样,您不能指定泛型类型必须具有静态方法,因为那些也不能在接口上声明。像static T Parse(string s)这样的东西通常会很有用。
  • 编译器过于急于禁止某些程序员知道实际工作的强制转换,所以它们需要像(TheRealType)(object)value
  • 这样的丑陋
  • 没有协方差,例如。 IList<string>无法转换为IList<object>,即使string[]可以转换为object[]。 (不过,微软可能会在C#4.0中修复此问题。)

答案 50 :(得分:6)

的Python。

虽然已经提到了python处理范围的奇怪方式,但我认为最糟糕的结果是这是有效的:

import random

def myFunction():

    if random.choice(True, False):
        myString = "blah blah blah"

    print myString

也就是说,if块内部与函数的其余部分具有相同的范围,这意味着变量声明可以在condional分支内发生,并且可以在它们之外访问。大多数语言会阻止你这样做,或者至少为你提供某种严格的模式。

此功能有时会成功,有时会抛出异常。虽然这是一个人为的例子,但这可能会导致一些微妙的问题。

答案 51 :(得分:6)

Haskell中:

  • 空间泄漏 - 默认为懒惰付出的代价 - 可能价格过高?
  • 即使像headtail这样的纯函数也可以调用error并将您引导至IO
  • 来自fail
  • Monad - 带回MonadZero
  • Num班级 - (+)应该在AdditiveGroup或类似名称。
  • Monad不是Applicative

答案 52 :(得分:6)

Perl 5的更多内容,从创建了大量Perl模块的人的角度出发,特别是在Moose上工作。

  1. 重载和绑定变量的可怕破碎。这两个功能都试图允许透明扩展内置类型。

    它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说“永远不要将重载的对象传递给foo()方法”。这两种选择都不是真的可以接受。

  2. 缺少适当的钩子进入编译过程和元模型。如果Perl核心允许我们通过一个允许我们挂钩到元模型(包,类等)的合理API来影响编译过程,那么Moose,特别是角色使用可以变得更加安全。 p>

  3. 语言中缺少命名参数。相反,每个人都重新改造。这很烦人。

  4. 同样,缺少可选类型。我不想要静态语言,但是指定类型和约束的能力,特别是函数/方法参数,将是很好的。 Perl 6做对了。类型是可选的,但非常丰富,内置类型和用户定义类型之间没有根本区别。

  5. 向后兼容警察。这更像是一个文化问题。由于Perl 5对向后兼容性的强烈承诺,因此上述许多问题永远无法解决。因此,即使要添加某些东西,有效地取代当前的束缚和重载球,这些功能也永远不会被删除。当然,向后兼容性也是Perl 5的最大优势之一。

  6. Bonus hate :Perl的内置异常机制是一个笑话。异常可能是一个字符串或对象这一事实使得异常的异常捕获代码永久存在,并且语言语法中缺少一个问题就是疣上的疣。

答案 53 :(得分:5)

我有一本书在SNOBOL中探索各种项目。第一章探讨了围绕SNOBOL编程和语言的历史和文化,并花了一些时间来讨论一个优秀的程序员喜欢一种语言,而不是因为它的缺陷,而是在中尽管

我最喜欢的语言是Icon / Unicon。但仍有一些事情让我烦恼:

  1. 它并不为人所熟知,也不是很受欢迎。
  2. 与PHP,Perl,Java等相比,它有一个小得多的库。数据库访问是通过ODBC完成的,实际上非常烦人。
  3. 对于所有其他优秀的列表处理,我想念PHP的内置explode()implode()
  4. 它没有表常量。列表,是的,表格,没有。
  5. 这是一种编译(实际翻译)的语言。

答案 54 :(得分:5)

<强> C ++

  • 与char *和std :: string相关的库中的不一致。所有C ++库都应该使用std :: strings。

  • 字符不是iostream的字节数。我做了很多面向字节的工作。具有“字节”类型和“字符”类型将显着地使其更简单。这也将允许更容易扩展到Unicode。

  • 位操作在值上应该很容易。我应该能够访问和设置值的第n位,而无需播放和/或跳舞。

  • 缺少GUI的标准化界面。这就是微软真正能够很好地利用C#定位的地方。 OS制造商提供的标准接口绑定对我的工作来说非常有用。

答案 55 :(得分:5)

<强> F#

  1. 类型推断是有限的。

    1. 它只向前传播。

    2. F#不会尝试根据使用的方法和属性推断对象类型:当它没有线索时,你会得到“查找不确定对象类型”错误。

      < / LI>
  2. 不能混用浮点数和整数:1 + 2.3是类型错误。

  3. 为了定义monad或计算表达式,必须创建一个构建器对象有点尴尬。在Haskell或Scala中,您可以直接在monadic对象上定义monad操作。

  4. 虽然首选#light语法,但缩进规则有时不太直观或变得麻烦。

答案 56 :(得分:5)

PHP

  1. 没有构造函数重载
  2. 函数命名不一致(str_replace,但是strtolower)
  3. define()不像C ++那样直接替换全局变量。
  4. 当与XHTML结合使用时,if语句之类的语句必须以没有缩进的方式开始,即使XHTML是缩进的,如果你想保持XHTML缩进的一致性。
  5. 例如:

    您必须输入:

    <?php
    if($x == NULL)
    {
    ?>
                         <p><?= $x . ' is null' ?></p>
    <?php
    }
    ?>
    
    1. 错误捕获很糟糕
    2. (不知道为什么SO再次将#5改为#1但是无论如何)

答案 57 :(得分:5)

C:

  • 缺少功能指针(可执行文件)和数据指针之间的区别(你真的不想执行它)。
  • 极端不可读性。使代码看起来像它所做的那样,比首先完成​​任务要难几个数量级。
  • 缺乏对lisp-think的明确支持。做功能性的事情是可能的,但是,目前尚不清楚。
  • 库之间关于如何返回错误代码的严重不一致。
  • 过时的字符串处理。字符串不是字符串,它们是以空值终止的blob。这是各种令人畏惧的方式。

Lisp的:

  • ()涉及按下shift键。每次我做很多口齿不清,我交换它和[]。

答案 58 :(得分:5)

德国

我的母语......虽然它听起来比克林贡语更美,但这是一个语法地狱......

  1. 结合:即使是常规动词也有不同形式的每个人和时间(少数例外)......例如:我看,你看,他/她/它看到了,我们看到了,你看,他们看到翻译成:Ich sehe,du siehst,er / sie / es sieht,wir sehen,ihr seht,sie sehen。
  2. 礼貌的地址:等于第三人称复数,习惯于在中年等于第二人称复数...我真的很讨厌区分“Du”和“Sie”的概念哲学是每个人在尊重它应得的数量上应该被认为是平等的(我的意思是,什么是发誓的话,嗯?)
  3. 标点符号:告诉我一种定期使用更多逗号的语言!
  4. 缺少合适的字词:例如。没有真正的德语相当于“方便”或这个词的任何衍生物......几乎在每种情况下你都无法将它翻译成另一个德语单词并保留其含义......相反,你会必须组成一个完整的子集来描述它有点足够......
  5. Anglicisms和Denglish :当然,英语有“幼儿园”或“恶作剧者”,除了德语之外什么都没有人们需要的英语语言......更糟糕的是:我们重新定义了我们采用的一些词,例如。在德语中“Handy”意味着一部手机,与英语形容词无关......语法也有涌入,导致“Denglish”表达(见维基百科的链接文章) 还有更多,但我不想夸大这一点,这些是我个人对德语语言的讨厌...

答案 59 :(得分:5)

的Python:

  • 您通常在文件末尾有程序的入口点。 (因为如果它调用模块中定义的任何函数,它必须在源中的那些函数之后发生。) 当你不得不花时间寻找程序的入口点时,我讨厌它,所以我总是有一个简单的main.py文件:

    def main():
        ...
    
    if __name__ == '__main__':
        main()
    
  • 引发异常时,只能由主线程捕获。 或类似的东西。

  • 析构函数没用,因为用Python编写时可能会破坏垃圾收集IIRC。

  • 我从来没有想过相对导入在Python 2中是如何工作的。

  • 我想在标准库中看到更多的集合。 例如:链接列表,线程安全集合,......

答案 60 :(得分:5)

Perl 5 从最烦人到最少。

1。)向后兼容警察。是的backcompat是一种力量,但Perl 5太过分了。现在我们甚至没有用我们的语言获得新功能而无需明确启用它们。我更喜欢反向,如果一个新功能导致问题让我禁用它或强制执行旧的行为。例如perl 5.10已添加say如果我实施了自己的no feature 'say',我宁愿拥有say,而不是use feature 'say';use 5.010;  如果5.8工作,但5.10没有。我宁愿让use 5.008;限制我的代码只使用可用的功能,如果没有定义use version;则包括5.8,那么它应该默认为你正在运行的任何版本,以及推荐的做法除非必须,否则不要限制它。

2。)过多的锅炉

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use autodie;
use English '-no_match_vars';
use 5.010;
package Package::Name;

BEGIN {
    Package::Name::VERSION = 0.1;
}

sub somesub {
    my $self = shift;
    my ( $param1, $param2 ) = @_;
}
1;

现在你可以开始编码了。由于#1,这不会改变。当然,像use common::sense;use modern::perl;这样的东西有捷径可以缩短上面的内容,你可能需要一些稍微不同的模块或编译指示。但由于#1,我们永远无法将其减少到。

#!/usr/bin/perl
package Package::Name 0.01;

sub somesub ( $param1, $param2 ) {
}

有些模块正在帮助解决这个问题,5.0.12中有新的软件包版本,虽然我认为首先需要use 5.012;,但Method::Signatures但它永远不会是完全解决了,(用语言)。

3。)糟糕的变量选择

啜饮文件

#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;

wtf是$!$/?重写要清晰易懂。

#!/usr/bin/perl
use strict;
use warnings;
use English '-no_match_vars';
open my $fh, "< foo" or die $ERRNO;
local $INPUT_RECORD_SEPARATOR; # enable localized slurp mode
my $content = <$fh>;
close $fh;

并且不要忘记,如果您不希望性能受到影响,'-no_match_vars'必须存在。

怎么'没有直接的方法来创建一个匿名标量?

#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };
他们不能提出一些事情吗?

#!/usr/bin/perl
my $scalar_ref = <>;
哦,以及perl如何线程不友好,因为默认情况下所有变量(包括特殊变量)都是全局变量。至少现在你可以将my $_;用于词法范围,并在其他范围内使用local

4。)非常难看的语法

MooseX :: Declare是一种更好的语法。我也希望 - &gt;被替换为。 (个人喜好并不重要)

5。)太多的TIMTOWTDI 太多的最佳实践好像你必须阅读3-5本书才能弄清楚你应该怎么做做事

6。)之前(不再适用)。 Un-sane release 。 5.10.0具有功能5.10.1具有没有设置时间的功能直到下一个版本。现在它是每年发布的季度更新功能。

7。)象牙塔透视。社区问题,似乎是大量想要进入高门槛的开发者,并认为可以不尊重地对待 n00bs (或者真的是不同意他们的人)。

8。)疯狂版本数字/字符串 Perl有浮点版本号,它们很难看。哦,开发人员不知道并非所有下游都以相同的方式处理版本比较。不是真正的语言问题

0.012 # simple
5.012001 # semantic 
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease

perl中的所有有效版本..我们不能只使用...

0.12 # simple
5.12.1 # semantic
20100713 # time based (just use the date and be careful not to need to release more than 1 a day)
0.35-beta2 # prerelease

<强>除了

9。)升级后没有明显的方法重新安装所有XS模块

答案 61 :(得分:5)

Python(3.1)

  • 条件语句的奇怪的无序T if C else F语法。
  • bytes文字看起来太像str文字了。我们应该有x'414243'而不是b'ABC'
  • str在某些平台上为UTF-16,在其他平台上为UTF-32。 (虽然至少它比2.x字符串有所改进。)
  • 具有相同的运算符以进行添加和连接。这会像numpy.array
  • 这样的类型受到伤害
  • 慢慢跑。

答案 62 :(得分:4)

的Python

  • 调试时错误/异常含糊不清
  • 我不在工作中使用它
  • 在类
  • 中使用__init __,__repr __,__ rs__等
  • 不能简单地编译可执行文件(.exe或其他)
  • 我尚未尝试过的其他一些事情,但我肯定会让我感到烦恼

对于所有那些C-ish语言程序员来说,自我对我来说比这更有意义,因为对象指的是它自己

答案 63 :(得分:4)

的Python:

  • 数字运算缓慢。这不会是一个问题,除了它......
  • 没有一种简单的方法可以将C代码包含在导入时自动编译的程序中。
  • 我们仍然需要遵循愚蠢的整数除法规则,直到py3k接管。
  • 我们仍然需要像imap和izip这样的好东西一起生活在一个单独的模块中,直到py3k接管。
  • 在py3k接管之前我们必须做很多工作。

答案 64 :(得分:4)

Emacs Lisp

  • 没有足够的商业市场在elisp全时编码
  • GNU Emacs与XEmacs不兼容
  • Scheme中的嵌套函数很整洁,我希望elisp有概念[1]
  • 用于简单循环列表的do循环或其他工具不是标准的(授予,你现在可以用lambda mapc)[1]
  • 应该有(function(lambda(...)))[1]
  • 的简写

[1]当然,关于Lisp的一个美妙的事情是,用一行代码在你自己的代码中解决这些问题并不困难。仍然让我觉得它没有内置。

好问题;我有点尴尬,我无法想出更好的东西来讨厌,但老实说,你的荣誉,没有太多可恨。

答案 65 :(得分:4)

<强>自

  • 没有真正的代码浏览器 数以百计的小窗户飞舞 周围。
  • 只有一个研究项目,     不够稳定,没有活跃     社区。
  • 没有相当快的版本     适用于Linux或Windows。只有Mac OS X。
  • 不支持标准键盘     命令。
  • 哦!关于编写本机插件的文档已经过时了!

答案 66 :(得分:4)

C#(嗯,部分是VisualStudio IDE,我猜):

  • 即使类型Class<D>派生自类型Class<B>,也不能使用D代替B等协方差。
  • 图形设计人员不支持基于泛型的继承(或从抽象类继承),即使继承本身可以正常工作,如果你通过添加额外的继承级别来解决设计器问题,这样设计师总能看到具体的非泛型变体你的代码。
  • 没有构造函数继承
  • 在泛型类型参数的where子句中没有构造函数
  • 在打开解决方案时,VisualStudio似乎有神秘地检出文件(如项目文件和/或单元测试定义)的倾向,即使这些文件似乎没有实际改变。
如果你明天再问我,可能会有不同的清单。尽管协方差和设计师的麻烦将在我的前5名中解决(在C#4.0中添加了差异,但这似乎至少发生在其中一个......)。

答案 67 :(得分:4)

Oracle SQL

  1. DUAL表。

  2. 无法GROUP BY别名。

  3. 我永远不会记住分析函数的语法,所以我忘了/懒得使用它们。

  4. 缺少合并的LIKEIN条件运算符。 (10g之后,有一个REGEX_LIKE运算符可以解决这个问题。)

  5. 尴尬的连接语法。

  6. SQL并不是我最喜欢的语言,但它是我每天使用的前三种语言之一。可能有更多项目,但这些是最重要的。

    SQL*PLUS我遇到了很多问题。我写了一个Perl替换,它从命令行执行我想要的操作,并在Emacs中使用sql.el进行交互式SQL会话。这些工具可以帮助我解决SQL*PLUS个问题。


    说到:

    的Perl

    1. “只有perl才能解析Perl。” (但这主要是语法突出显示中的一个问题,我不喜欢对任何语言使用太多。)

    2. 我有时会对“简单(但偶尔令人惊讶)的规则感到惊讶......:它看起来像一个函数,因此它是函数,优先级无关紧要。” (来自perlfunc(1)

    3. 解除引用复杂的数据结构有时会让人感到困惑。我无法确定这是否是Perl的真正缺陷,或者仅仅是因为拥有非常强大的数据结构设施。无论哪种方式,我通常可以花几分钟思考我正在做的事情。

    4. 没有选项可以导致系统调用引发错误,例如DBI模块。 (感谢brian d foy,我现在知道CPAN上的autodie模块是这样的,但我希望它内置。)

    5. 脚本中默认情况下未启用警告和限制。 (-e选项会将它们关闭以供命令行使用。)

    6. 同样,必然会有更多的东西,但这些是我最近注意到的问题。我在=over中添加了对=backL<...>以及古怪POD语法的需求,但也许这应该是一个单独的列表。


      现在为三连胜:

      KornShell

      1. 使用参数获取文件会替换父脚本参数的值。 (执行. file arg1arg1置于$1。)

      2. ksh不是理想的交互式shell,默认为vi键绑定,而不是emacs。 (我的解决方案是使用bash进行交互式shell。)

      3. 常用实用程序(例如grep)在不同平台上的实现方式不同,从而妨碍了完美的可移植性。一些有用的命令需要在某些平台上安装,并且在其他平台上是OS核心的一部分。

      4. 条件语法过于沉重。 (if [ ... ]; then ... fi

      5. 虽然它是Turing Complete,但你最终还是希望转向像Perl这样更具表现力的语言。

      6. #4的一个解决方案是习惯短路评估:

        [ ... ] && ...
        

答案 68 :(得分:4)

d

  • 我们有运营商,但没有!在运营商?
  • 动态数组'长度'属性 - 你可以做

    array.length += 512;

  • 没有退出语句 - 就像在python的sys.exit()中一样。当然,你可以调用C的退出,但是未刷新的输出不会被刷新
  • 关联数组文字+字符串文字suck

    在关联数组文字中找到的字符串文字被解释为静态,因此,由于长度不同的字符串文字,这个

    char[][char[]] hash = ["hello":"world","goodbye":"angels"];

    在没有额外的强制转换的情况下不起作用尽管
    一个。我没有要求它被解释为静态数组
    湾无论如何,关联数组中不允许使用静态数组

  • 不允许循环依赖(想要移植那个java lib?有趣的是重新设计类层次结构)

有人检查我这些;不确定它们是否仍然相关。

答案 69 :(得分:4)

<强>爪哇

  1. 已检查例外情况
  2. type erasure
  3. 缺少运算符重载(例如,对于BigInteger / BigDecimal)
  4. 缺少正则表达式/日期/持续时间/复杂文字
  5. 对不变性的不良支持

答案 70 :(得分:4)

第一篇文章,所以请放轻松对我:) ...真棒社区网站,顺便说一句!

我尝试阅读所有其他C#回复,因此我的重叠

C# ...没有特别的顺序:

1)对于switch语句中的案例没有任何影响。如果没有通过...为什么必须明确键入break;无论如何?它只是迟钝和混乱,因为它意味着没有休息的能力; !!!

2)不能在子范围中声明具有相同名称的变量,但是您可以使用与类变量相同的名称声明变量吗?允许两者兼有或不允许两者。否则,它没有意义。

3)功能

中没有可选/默认参数

4)finally {}中的异常应该为每一行隐式捕获。或者至少,只是NullReferenceException异常。例如,在访问数据库之后,应该始终清理数据库。所以,finally块看起来应该是这样的:

finally
{
  if(par1 != null)
    par1.Dispose();
  if(comm != null)
    comm.Dispose();
  if(conn != null)
    conn.Dispose();
}

如果它可以写成:

那将会更加清晰
finally
{
    par1.Dispose();
    comm.Dispose();
    conn.Dispose();
}

但是,没有......你必须检查你是否正在访问一个null对象,否则它可能会从finally块中抛出一个NullReferenceException ..并且无论如何谁最终需要在finally块中出现异常?

5)泛型:您可以指定new()以便能够实例化您的通用对象,但该对象需要具有默认构造函数。为什么你不能指定一个签名,所以如果它没有它们就不需要创建空构造函数,只需使用它所拥有的构造函数。

答案 71 :(得分:4)

Haskell中。

  1. 默认情况下会导入Prelude。
  2. 类型类的范围是通用的。
  3. 模块不是一流的。
  4. 类型不能依赖于值。
  5. Monad不与Functor统一。

答案 72 :(得分:4)

我无法相信,我最喜欢的Python宠儿仍未被提及:

  1. (3.x之前)相对导入看起来像绝对导入。

    import foo
    

    这是从您所在的目录还是从sys.path导入foo?

  2. 拉链的鸡蛋,导致一个充满shite的sys.path。拉链蛋意味着您无法使用grepfind(除其他外调试问题1)!幸运的是,有点。使用pip。
  3. 部分电池是单声道的。它会使用它们。
  4. 可能是发行版和打包程序的错,但仍然是:sourcefile-encoding在安装/编译时设置为fscking ASCII。 WTF?意味着我必须在每一个.py中都使用“#coding:UTF-8” - 。
  5. Py3k修复了我的其他几个烦恼,例如坚持认为字符串是unicode,而8位字符的处理方式不同......

答案 73 :(得分:4)

C ++:

1:头文件。

链接代码比编译代码更难。此外,要求模板在该翻译单元中拥有完整的源是荒谬的。它在那个其他文件中结束了......两秒前编译的那个。去看那里。愚蠢的编译器。

2:清空标准库。

我的意思是,是的,在C ++ 0x中有std :: thread,但没有std :: socket或类似的东西。没有跨平台代码的主要原因是因为您必须为要在多个平台上执行的每个功能学习新库。如果没有作为标准提供的OS头文件或OS函数,C ++只适用于推动位。

3:没有多次返回或返回值重载

double x,int y,char z = func();与void func一样有效(double x,int y,char z);.请。没有返回值重载的唯一原因是因为我们“可能”编写模糊代码。威力!当我真正写出含糊不清的代码时,请让我感到悲伤,而不是之前。

4:无反射

可以编译反射编译时间。它确实是。没有任何使得编写大量图书馆的工作充其量困难,并且严重惹恼了我。我可以滥用预处理器但是......

5:在模板上打字鸭子

Yaargh。请,概念和正确的模板错误消息。使用像Boost这样的库几乎是不可能的,因为如果你弄错了,你就是在黑暗中拍摄。

答案 74 :(得分:4)

的Lua:

  • Metatables在“点击”
  • 之前一直很混乱
  • 缺少像a += 20这样的赋值操作符很痛苦
  • 没有集成面向对象的解决方案意味着每个人和他的狗都会使用自己的味道
  • 用于评论的语法(--)排除了增加/减少运算符前后的可能性
  • 在不攻击C方的情况下,不可能有任何先发制人的多任务处理系统

答案 75 :(得分:3)

C / C ++

  1. 缺乏完整的SWAP功能
  2. 模板语法
  3. 你不能#define #define(没有多遍)
  4. 编译器之间的结构包装不兼容性
  5. char是签名还是未签名?
  6. 爪哇

    1. 边缘的不变性
    2. 没有像C#
    3. 这样的ref关键字
    4. 尝试/捕捉无处不在的块
    5. 运行时性能不佳
    6. 所有与字符串相关的内容
    7. 的Python

      1. 没有“主”(我已经习惯了!)
      2. 强调关键字
      3. 有限的线程支持
      4. “self”而不是“this”
      5. 缺乏类似C / C ++的语法

答案 76 :(得分:3)

此处对C ++的另一次投票......仍然是我最喜欢的几个密切关注者--C和Python。这是我当前的仇恨列表,没有特别的顺序:

  • 从C继承的大量整数类型 - 签名与无符号错误导致的问题太多
  • 复制构造函数和赋值运算符 - 为什么编译器不能自动创建另一个?
  • 变量参数疯狂 - va_list只是不能与对象一起工作,我对使用sprintf(),snprintf(),vsnprintf()及其所有亲属创建的问题感到厌烦。
  • 模板实现需要在编译时完全可见 - 我在考虑缺少“导出”实现或至少可用的实现
  • 缺乏对属性的支持 - 我希望有一个像“a.x”这样的只读成员,可以公开阅读,只在内部分配。我真的很讨厌“val = obj.getX()”和“obj.setX(val)”。我真的想要具有访问控制和一致语法的属性。

答案 77 :(得分:3)

Perl 5:

  1. 现在所有非常好的东西似乎都需要mod_perl,在我想去的地方,它的可用性很低。
  2. 一些真正令人难以置信的功能可以封装在模块中,但引擎盖下的内容往往是脆弱或可怕的:源过滤器,typeglobs,无论Moose在做什么......
  3. DateTime非常出色,但仍然做出了一些非常糟糕的设计决策(not returning a stopwatch duration when subtracting two DateTime objects
  4. 核心和CPAN上的双重生命模块仍会导致冲突
  5. 模块作者仍在其模块配置脚本中放置交互式内容,以便无法自动安装

答案 78 :(得分:3)

.NET 框架(库)

  • 很少使用的嵌套类型(例如MessageBoxButton应为MessageBox.Button
  • 可变结构(RectPoint
  • System命名空间
  • 中的内容过多
  • 太多不同的平等概念(Object.EqualsObject.ReferenceEqualsoperator ==operator !=IComparable.CompareTo() == 0
  • 数组具有可变成员但不可变长度。

还有一个:

  • XmlSerialization不适用于不可变类型

答案 79 :(得分:3)

<强> C#

我的大多数抱怨都与假设C ++约定自动成为C#

的最佳选择有关
  • 类接口中不允许静态。它仍然是类的一部分。为什么它不能成为界面的一部分?!我必须为此创建这样愚蠢的hack-y解决方案。
  • 区分大小写。我知道这会破坏遗留应用程序,但为什么不是不区分大小写而不是从一开始的规则

.NET (不是C#特定)

奖励一个
  • 编译器不够聪明。在.NET 3.x中,编译器可以在编译时找出“var”,为什么不进行其他常见的优化呢?我们都知道字符串与StringBuilder / immutable和可变的东西。为什么编译器不能为你转换它在很多情况下很明显StringBuilder比多个concat.s更好?我确信默认情况下编译器可以为我们做很多其他优化(可以选择否决)并节省大量时间。

答案 80 :(得分:3)

C#

  1. 当枚举的集合中的对象发生更改时,foreach命令会发生爆炸,
  2. UI控件吐出虚拟对象,因为它们是在错误的线程上访问的。当然所有的dispatcher.invoke调用都可以移动到CLR管道中,
  3. PInvoke,编组等,
  4. 我花了两年时间学习远程学习,
  5. 它没有Ruby那么性感。

答案 81 :(得分:3)

Objective-C / Cocoa / Cocoa Touch:

  • 缺少名称空间
  • 使用Cocoa的任何有趣且强大的技术使用原始值的困难,例如,分布式对象,通知,KVO
  • 使用快捷点语法访问属性不一致,通常不得不使用全长访问者
  • iPhone上没有GC,而且一般来说GC对于一种高度动态的语言来说已经很晚了
  • 不一致的图书馆支持,至少在Cocoa Touch中;一些非常基本的东西最近才得到高水平的支持,例如音频处理。
  • 缺少积木!

答案 82 :(得分:3)

Haskell(所有GHC扩展,而不仅仅是基本的Haskell'98规范)。

我讨厌它的一件事:它不是主流。

答案 83 :(得分:3)

我最喜欢的是C#,但C#已有很多答案,所以我会选择下一个“最爱”:

T-SQL

  1. GO语句,以及您需要它用于所有DDL / DML脚本编写的事实,以及它还会破坏事务语义的事实,这使得编写一个事务要困难得多原子脚本,你真的需要它来升级生产数据库。
  2. 分号语义不一致。 99%的语法不需要它,MERGE语句必须以它结尾,WITH语句必须以它开头......下定决心!
  3. WITH CHECK CHECK / WITH NOCHECK CHECK。 UUUU - 甘氨酸
  4. UDF中的可选参数实际上不是可选的。来电者必须指定DEFAULT(甚至不要尝试使用NULL)。与他们 真正可选的SP比较。
  5. “......可能导致循环或多个级联路径。” 仇恨仇恨恶意仇恨恶意仇恨恨恶恨

答案 84 :(得分:3)

<强> TCL

这是我几乎所有事情中最喜欢的语言。多年来,它已经(慢慢地,非常缓慢地)进化,以解决困扰我的大多数事情。语言非常灵活,很容易实现语法糖来覆盖仍然让我烦恼的事情。但是有一些关于语言的东西不能轻易改变只是打破它的禅宗:

  • 数组(关联类型,Perl调用哈希)没有正确的值语义。这使得它们难以传递到函数并从函数返回。此外,这意味着它们不能嵌套。出于这个原因,dicts(词典)被发明但是太晚了,很好的数组访问语法:

    $array($foo)

    现在永远被愚蠢的数组用于向后兼容。我们现在坚持:

    dict get $dict $foo

    更冗长,对我来说感觉不那么可读。

  • 没有真正的关闭。虽然它可以通过全局变量或命名空间进行一些模拟,但首先会破坏闭包的原因。虽然,我现在还不能真正看到如何在纯值语义系统中实现闭包。

  • 与其他所有存储库工具相比,Teacup难以使用,并且完全不直观。这是比tcl-core更多的ActiveState错误,并且在编码时并没有真正破坏tcl的Zen,但它仍然非常烦人。

答案 85 :(得分:3)

C ++

(除了lambda函数,我已经避免了在Cpp0X中可用的东西)

  • 不强制使用“this”来访问成员变量,:: GlobalFunction来访问全局命名空间。
  • 所有内容(更具体地说,算法中缺少lambda函数,将在0x中修复)
  • 处理依赖项/标题和源文件
  • 基本数据类型的愚蠢名称(应命名为uint8,int16等)
  • const_cast功能

答案 86 :(得分:3)

二郎

  • 没有静态推断 打字就像在Haskell中找到的那样。这个 可能导致运行时错误和一个 仔细编写代码或使用 dialyzer(1)发现 差异。动态类型是 也被认为是缓慢的;
  • 与C,Java等相比,
  • 几乎是未知的;
  • lists(3)模块有时非常精简 我缺乏列表处理的有用功能 (例如Haskell中Data.List中的那些);
  • 让我把,放在每个陈述的末尾 在子句中,.在后​​者的末尾。

答案 87 :(得分:3)

Erlang不在此列表中。在我最喜欢的语言中,但肯定有一些缺陷:

  • 语法。这包括3个终止令牌(,;。)和美学,但更一般地说,包括如何在文本中表达代码的语义。一个例子是所有小写标记都是原子,所以要引用一个不能只命名的函数,你必须fun my_function/1?PRECEDE_CONSTANTS_WITH_QUESTION_MARKS。来自Scheme,Haskell等,您只希望使用名称。

  • 图书馆支持很蹩脚。这主要是外部库,但即使是旧的标准库。较新版本的Erlang具有合理的POSIX正则表达式,但旧版本有一个非常可怕的基本字符串操作库。您也永远不知道何时获得该值,或{ok, Value}

  • 相关:用于构建和分发的非统一工具。 Ruby有gemrake,RSpec。 Perl有CPAN。我不知道Erlang中的等价物。

  • 少数Erlang特定工具非常奇怪。 Mnesia是一个很棒的数据库,但是来自SQL,你有很多值得学习的东西。与文档@spec相同,后者有一种描述签名的奇怪方式。

  • 当你只想要一点点变异时,功能范例通常会受到伤害。假设你想要一个哈希表,你不能像在Scheme或SML中那样破解它。 etsdets减轻了一些痛苦,但并不多。

第六,奖金:

  • 模块的导入和导出语法是一堆失败,与Java的80多行import语句不同。

所有这一切,Erlang是一种快乐^ _ ^

答案 88 :(得分:3)

<强> - [R

不是我最喜欢的语言,但我经常使用它并且有很多抱怨...

  • S3对象只是美化lists而S4类仍然将所有数据都暴露给用户
  • 分配运算符可以是<- ->=,请参阅Mike Dewar's rant
  • my.var是一种非常令人困惑的OO语言变量命名约定,请参阅Google's style guide
  • 我不应该后悔使用循环
  • 隐秘错误消息

答案 89 :(得分:3)

Scala是我最喜欢的语言。有五件事要讨厌?易:

  1. 需要很长时间才能正确学习。我知道你可以把Scala写成'更好的java'。这就是我们过去常说的关于C ++和C的内容。我同意这是语言深层思想的必然结果。但仍然......

  2. 方法与函数:def f(x: Int) = x*x定义方法f,而不是函数f。尽管很多早期的Scala教程材料模糊了这种区别,但方法并不是函数。该语言也试图模糊它,因为如果你在某些的地方提供了一个方法,那里接受了一个函数。我们必须同时拥有方法和功能吗?是的,这是根本的。但它最初让我感到困惑。

  3. 以'蛋糕'模式从mixin中编写类或对象很容易产生NPE。例如trait X { val host: String; val url = "http://" + host }是一个在实例化时是NPE的mixin,取决于它在类声明中的位置。编译器可以告诉您它是否会失败但不会。 (无论如何,在2.7中。)在复杂的继承图中很难诊断出问题。

  4. 2.8中的数组依赖于implicits与主要的scala集合类型进行网格划分。但是暗示并不适用于所有地方。可以在预期Array的地方提供Seq。但是,如果预期Option[Array],则无法提供Option[Seq]。我知道没有完全“正确”的方法来处理java数组。

  5. 类型擦除。够了。

答案 90 :(得分:3)

C#。

我最讨厌的是:

  1. 没有多重继承 - 假设您可以提供与MVC相关的东西等任何GUI框架基类(Control,Window,等等)......框架/基类不可知!

  2. 没有“朋友”关键字...我知道,RAD - 受害者会滥用它来处理各种恶臭的代码和搞笑的渎职行为,但对于OOD来说,这对于执行法律是很好的。蒂美

  3. 没有语言集成的DBC功能,有合同,但我宁愿使用Spec# - 具有通用性的“!” - 后缀运算符

  4. 没有AOP(我不明白......这种语言有属性,在编译器中添加拦截代码就太容易了!)

  5. 没有弱事件委托 - 观察者模式只会变成现在的内存泄漏诱饵......: - (

答案 91 :(得分:3)

我讨厌所有语言的五件事(我至少知道):

  1. 我说的是什么/打字,不是我的意思
  2. 毫无疑问会遇到那些认为自己是语言专家的人,但只是弄得一团糟(例如,坚持删除评论/未使用的局部变量的人会加快程序的执行时间)
  3. 除非语言过时,否则它可能会继续发展(无论是实际的语言,还是有效使用它的概念),要求你积极开发,以免落后。
  4. 无法修改词法分析器/编译器(添加自己的上下文敏感语法)
  5. 没有完美的语言(每种语言都缺少一些有用的功能,通常无法模拟,不可避免地会有一个丑陋的界面,或者只需要太多时间来实现并正确使用)

答案 92 :(得分:2)

我使用Java,而我最大的优点是字符串操作效率低下。当你使用+运算符时。说真的,编译器不能弄清楚我要添加多少个字符串然后在后台为我生成StringBuffer的东西?

使用+的代码通常比StringBuffers操作序列更具可读性。

另外,我讨厌本机数组和集合框架之间的冗余。 .toArray()的语法非常难看。

答案 93 :(得分:2)

目标Caml

  1. 缺乏命名空间。
  2. Wordy class and object nortation。
  3. 复杂构建系统。
  4. 制作中缀不方便。

答案 94 :(得分:2)

的Python:

  1. Global Interpreter Lock - 处理此问题会使并行处理变得复杂。
  2. Lambdas的功能有点笨重。
  3. 没有内置的有序字典类型。
  4. 根据Python的编译方式,它可以使用UCS-2和UCS-4进行内部Unicode编码,对于超出默认宽度的多字节字符,许多字符串运算符和迭代器可能会产生意外结果。字符串切片和迭代取决于位宽,而不是检查和计算字符。 (大多数其他编程语言也做类似的事情,并且对这些字符也有类似的奇怪行为。)
  5. 围绕Python的GUI框架存在不一致。

答案 95 :(得分:2)

方案:

  • 缺乏用户/小社区

答案 96 :(得分:2)

<强>的Lua

我喜欢在Lua中编程,但这就是让我感到害怕的事情:

  1. 没有办法用语言写下API - 就像C .h文件或Java接口一样
  2. 该语言具有一流的功能,但有人忘了告诉设计图书馆的人。
  3. 编写函数的语法太重了。
  4. 语法在语句和表达式之间分开。
  5. 表达形式很贫穷:没有'let'形式,没有真正的条件表达,...
  6. 尽管所有这些我都会坚持认为Lua非常棒: - )

答案 97 :(得分:2)

方案

  • 缺乏静态类型
  • 没有静态函数重载(由于上述原因)导致字段访问者的长名称
  • 没有统一的对象系统
  • 有点慢
  • 相对较小的社区

答案 98 :(得分:2)

<强> C ++:

  • 缺乏象征意义的进口。
  • 过度痴迷C兼容性。
  • 非常复杂的预处理器。
  • 模板错误几乎无法理解。
  • 没有垃圾收集。

答案 99 :(得分:2)

的Javascript;

  1. 如果您不确切知道自己在做什么,那么“this”的动态绑定会非常混乱和危险。
  2. 函数声明需要关键字“function”。这不是我反对的打字,当我想做一些略显聪明的事情时,就是读它。 Hrm现在我想起来也许这是一个加号。劝阻我做一些聪明的事情。
  3. 作为数字2的结果,复制/粘贴代码段的代码(就字符而言)通常少于将其声明为函数,如果它是一个相当短的习语。不幸的是,这促进了不良做法,特别是在我自己的代码中。
  4. Javascript通过使用第一类函数和闭包来使动作成为一种函数式语言,但是无论是在运行时还是在编译时,都无法验证函数中的引用透明性。如果没有这个,一些架构会变得冒险或笨重。
  5. 它声名狼借,因此我无法在没有被人嘲笑的情况下向任何人说“我用javascript编程”。

答案 100 :(得分:2)

R(R-Project for statistics)

  1. 可怕的,可怕的字符串支持
  2. 对于一些简单的描述性任务,例如交叉制表
  3. ,令人惊讶地困难
  4. 大数据集操作在内存中完成。

答案 101 :(得分:2)

<强>的Perl

我喜欢这种语言,而且我不想添加已经使用过的东西,但是还没有人提到这个,所以我会把它扔到底池上。当我使用这个功能时,我发现它是我生命中最恐怖的经历(我使用汇编语言):

  • write()format()函数。

他们拥有可以想象的最糟糕,最丑陋,最可怕的语法,然而他们却无法为你提供任何更多的功能,而不是你已经实现的一些(无限更漂亮){{1工作。 没有人应该永远尝试使用这两个函数来做任何输出,只是因为它们有多糟糕。

我相信有人会不同意,但当我调查他们,希望他们能解决我的问题时,我发现他们是一个“痛苦的世界”(引用Big Lebowski),并希望Perl6有废除它们,或者更好地完全重写它们,使它们更有用和有用。

答案 102 :(得分:2)

C

  1. 位字段 - 它们没有被语言很好地指定,它们的工作方式取决于编译器和体系结构。
  2. 通常很难找到在大量代码中定义特定符号的位置,尤其是如果该符号是由宏生成的。这让我想起......
  3. 预处理器是一个相当丑陋的黑客,适合各种各样的滥用。
  4. 缺少标准大小的整数(最近由uint * _t补救,但是有大量的旧代码在那里浮动,有自定义typedef或#defines用于DWORD,WORD,BYTE等)。
  5. 缺少类似于Perl的cpan.org的东西(希望对那个错误。)
  6. 编辑: 在考虑用于C的CPAN时,我想......我会称之为“ccan”,然后使用Google搜索,我发现了这个: http://ccan.ozlabs.org/

    它似乎还处于起步阶段。

答案 103 :(得分:2)

因为我不能全职使用它,所以我要出去了,但我还是会尝试的!

Perl 6

  1. func(“frew”)!= func(“frew”)
    • 这令我很生气,但这是有充分理由的。在Perl 5中打印(5 + 6)* 10 仍然偶尔得到我
  2. 在许多地方解析比Perl 5更容易,但有时候它仍会杀死我的编辑
  3. 它仍然有很多线路噪音Perl 5让很多人感到害怕。这意味着让他们兴奋等等更难。
  4. 还没有图书馆。
    • 如果Perl 6确实最终支持Perl 5,这将是一个非问题,但这可能是一个不值得承担的负担。
  5. 没有REPL,或者rubyists会称之为irb。
    • 具有标签完成,颜色编码等的可靠的交互式Perl 6将使得使用和学习它变得更好。
  6. 目前documentation基本上是英文规格。不太容易阅读。
  7. 我知道这是一个愚蠢的陈词滥调,但还没有出来!
    • (我被允许抱怨,因为我正在帮助:-P)
  8. 前三个是语言;其余的不是语言本身,而是它还没有出来。

答案 104 :(得分:2)

<强> C

  • 它非常灵活和强大,很容易编写非常糟糕或非常危险的代码(或者,如果您愿意,“以强大的力量来承担巨大的责任”)。
  • '='用于赋值,'=='用于赋值;容易混淆'if'陈述。
  • 该语言的许多基本部分的实现依赖于编译器;例如基本类型的大小,位域中的位顺序,填充中的填充和字节顺序。
  • Bitfields不是可参数化的(即你可以使用int数组,但是你不能有一个位数组。)
  • 可以改进字符串处理。

答案 105 :(得分:2)

<强>的Python

  • lambda中没有陈述。 GRRRR
  • foo( a for b in c if d )感觉不对,每次我逃脱它都会让我感到惊讶。不应该是foo( (a for b in c if d) )吗?
  • 我能理解一下吗?
  • map和filter运算符在列表推导中有特殊的语法,如何减少?还是排序?
  • 只需在其中加上yield语句,就可以将一个函数神奇地转换为生成器,并且其界面完全改变。此外,该生成器在第一个next()之前无法执行任何工作。至少,不是没有使用返回生成器的函数。

<强>的JavaScript

  • 没有制作模块化代码库的简短语法。您必须调用一个返回公共方法字典的函数。每次改变模块的界面时,你必须在(至少)两个地方编辑它。
  • 创建闭包涉及从一个函数返回它,该函数从('sup dog)yo'函数返回一个函数。杂波!
  • for each ( foo )语法和行为感觉像是事后的想法。
  • 知道你的代码实际运行的时间(以及以什么顺序)更像是一种黑暗艺术。确保正确行事的唯一方法是将所有内容(是的,也是如此)放在一个大文件中。即便如此,你仍然需要等待document.onload
  • 我错过了什么吗?有没有简单的方法来获取json序列化值而不用手工构建它们? (是的,jQuery可以做到这一点,有点)。

答案 106 :(得分:2)

VBA (因为您认为自己的语言不好)

  1. 一条线内的空白是严格的 执行。
  2. 语句刚刚结束,并要求“_”打破下一行, 但不是每条线都可以被打破。
  3. 没有++, - ,+ =, - =陈述。真的吗?
  4. 数组可以从任何索引开始,而不仅仅是0.
  5. 某些类型(即:定点“十进制”值)必须是Variant的子类型,并且不能作为自己的类型使用。
  6. !=和&lt;&gt;。
  7. “=”用作比较器和分配,而不是分成“=”和“==”。
  8. “Option Explicit”。
  9. 自2000年以来,UI尚未更新。
  10. Office2k7未升级到VB.NET
  11. 大多数对象模型都是非敏感且过于冗长的。

答案 107 :(得分:2)

C#:

1)静态方法必须是类

的成员

2)静态扩展方法只能添加到静态类

3)接口函数的实现没有标记为“覆盖”之类的东西,以显示它们来自基类或接口(这使得很难确保覆盖您期望的方法(具有正确的签名)代码审查)。

我只有3.我猜这很不错。

答案 108 :(得分:2)

的Python:

我仍然是python的温和用户,所以我的抱怨可能就是锁定知识或误用。欢迎评论。我喜欢这种语言。

  1. 糟糕的线程支持和GIL。如果您想使用多核平台,大多数python程序员可能会推荐多处理或某种类型,不要使用线程。它不会给你你期望的表现。
  2. 属性仅用于实例变量。 _class_var = property(classmethod(some_method))就行不通了。如何获取属性包装的类变量?
  3. 无访问控制。所有访问控制都是语法错误。就像private是__private一样,protect是_protected等等...并希望每个程序python遵循命名约定。来吧,我们可以做得更好。
  4. 我同意python的理念是简单明了的语法,但是在我看来,一些简单明了的语法不被支持似乎锁定了良好的判断力。比如,a ++,++ a,a - 和--a,self-de / increment,那些有什么问题? foo =(a&gt; b?a:b)一元操作,那些有什么问题? (我知道py2.6引入了类似的东西,但是对于那些简单的语法几乎所有其他语言的大量支持,为什么要重新发明轮子?为什么不遵循最佳实践呢?不应该只是保持良好的状态“形式”?)
  5. 程序界面。 Python没有接口或抽象类概念(py3k有一些叫做abc的东西),一切都是具体的。提供一个“接口”或“抽象”关键字来构建类骨架和保护类继承和扩展我认为不是一个坏主意。它有助于自上而下的设计。目前,我只需要使用NotImplementedError填充每个方法,这是一项相当繁琐的工作。
  6. 我必须加上这个。小于3.x的版本具有str和unicode类型。这是一场真正的噩梦。它使ascii和非ascii / unicode混合最容易失败(坏,坏)
  7. 我看到有人抱怨速度。我不明白。它是一种解释语言,代码直到运行时才编译到机器代码,这就是它的本质。您无法将解释语言的速度与编译语言进行比较。据我所知,在解释/脚本语言中,python并不慢。

答案 109 :(得分:2)

C ++ 缺乏良好的重构工具,缺少经过检查的异常

Java 缺少模板,缺少const关键字

答案 110 :(得分:2)

PHP

  • 几乎所有标准功能都在全球范围内
  • 函数参数顺序不一致
  • 功能命名不一致
  • 不区分大小写的函数
  • 脚本的行为可能会有所不同,具体取决于php.ini文件
  • 能够使用未定义的变量
  • 在某些情况下,必须先将结果分配给变量才能在函数中使用

更主观地说:

  • 动态打字

答案 111 :(得分:2)

Common Lisp

  • 缺乏更现代功能的标准库(套接字,线程......)
  • 可以使用映射到本机窗口系统的标准化UI
  • Scheme将lambda表达式赋值给变量并将该变量直接用作函数调用的能力看起来更适合于应用于FUNCALL。有多个名称空间的副作用,我想
  • 图书馆的标准化源级包装系统,以便从多个实施中轻松使用

我想知道一个强类型的lisp会是什么样的

答案 112 :(得分:2)

<强> C#

  • 缺少基于方法参数的运行时类型的多次分派。 dynamic应解决大部分问题,但尚未发布。
  • 接口实现是声明性的而非结构性的。我非常喜欢Google的 Go 语言正在做类型的方式
  • 进行异步方法调用非常笨重(而且我很确定所有线程都是OS线程,而不是轻量级线程)
  • 没有宏系统。我不是在谈论C风格的宏;我在说LISP / Scheme风格的宏
  • 操作符是静态方法,它们的签名过于受约束(并且您无法创建新的签名)。

  • 答案 113 :(得分:2)

    <强> C#

    • 默认情况下,引用类型可以为空; in-language null关键字是无类型的。
    • 缺乏受歧视的工会
    • 例外默认,非特殊错误处理方法 - 没有太多替代方案。
    • 古老的switch语句语法和限制
    • 不需要区分构造函数+静态方法
    • 静态方法不能是接口的一部分
    • 缺乏形状接口实现而不是显式接口实现 - 导致许多语言设计攻击,例如linq查询语法,foreach,collection&amp;对象初始化器 - 没有一个可以灵活地重用。例如,对象初始化程序语法可能很好,但对不可变对象的效果很差。
    • 不能独立于实现继承类的“接口” - 导致代码重复和提供接口,抽象基类,一些常见实现的分层代码,并且无法选择每个要使用的位。也;导致太多的代码与特定的实现紧密耦合,因为通常明确地引用实现类型而不是接口。
    • 由于类“接口”与其实现紧密耦合,因此不能通过合成乘法继承;实际上缺乏混合物。
    • 接口的上述限制导致几乎相同的接口激增,这些接口在任何类型的层次结构中都不会自然重叠。 IComparableIEquatable vs. IComparable<T> vs object.Equals vs. operator ==等等。通过扩展,制作满足所有这些内容的自定义类型比必要的(特别是对于集合类)。显然,语言设计者意识到这一点,因此对于像linq,foreach和集合初始化器这样的事物的各种解决方法,它们通过形状而不是通过接口工作。
    • 使用括号和括号的冗余,而不是layout-is-structure。
    • 可以忽略返回值,限制类型推断的有效性。
    • 枚举不是普通类型,不能有方法。此外,枚举值不是类型安全的,并且可以初始化为0,尽管没有0值。通过将标志和非标志枚举结合在一起来混合隐喻。
    • 缺乏适当的价值类型支持。值类型不能被继承,具有不同的构造函数语义,并且由于CLR限制而表现不佳。此外,关于值类型的语义混淆:一些值实际上是值(并且不能被修改),而其他值实际上是非别名的非空引用(变量)。对于下一期问题,这尤其令人困惑:
    • 字段和属性之间的语义区别,特别是缺少可变性修饰符(ala C ++的const
    • 不能专门化泛型
    • 无法提供默认的通用类型参数(例如工厂通用)
    • 缺少typedef会使泛型使用起来很麻烦(using是一个有限但很有名的替代品!)
    • 不能对类型以外的内容进行泛型化(例如函数,普通值或名称)。这意味着你不能做一些事情,比如制作一个依赖属性的泛型实现,这会导致一些令人讨厌的实现,比如依赖属性和代码片段的过度使用以及结果是不可读的代码。
    • 指定通用类型要求的能力有限,例如通用求和方法,它接受int,double和bigint(没有棘手且通常很慢的黑客攻击)。
    • 接口方法实现或虚方法覆盖不能返回更具体的类型或接受更通用的类型;即使在C#4中也有限的共同/逆转支持。

    答案 114 :(得分:2)

    我在 Nemerle 中怨恨的五件事:

    • 本地功能无法产生
    • 编译lambda的能力有时取决于它是否内联
    • 元组的值/引用类型语义不一致
    • 数组索引和类型参数之间偶尔存在歧义
    • 缺乏普遍采用

    答案 115 :(得分:2)

    <强> Clojure的

    • 功能定义中缺少可选和关键字参数的内置语法。当然,您可以轻松添加它,但这意味着库编写者不会使用它。普遍的解构还没有被证明是一个很好的替代品
    • 缺少方法组合(在Common Lisp中找到的排序方法之前/之后/周围)
    • 过分依赖Java互操作,例如没有内置文件IO
    • 有时我想要静态输入。这个不是纯粹的仇恨;我通常更喜欢动态,并试图将两者混合在很大程度上令人不满意
    • 内置数据结构没有内置的快速二进制序列化格式,但我听说有人正在研究它

    答案 116 :(得分:2)

    Python ,再次:

    1. 没有切换关键字。不,字典不是它的替代品。甚至没有一堆elif语句。

    2. 不一致的换行处理。我为什么要这样做:

       test = (1,
               2,
               3)
      

      而不是:

      from itertools import cycle,
                            islice,
                            izip
      

      为什么我不能这样做:

      if stuff \
         and foo \
         or bar:
          return "Formated string with %(arg)s" % \
                 {'arg': "bloody slash"}
      

      不使用斜杠?

    3. 没有一种显而易见的方法可以做到这一点。 Python失败的座右铭就像Java在“Write once runs anywhere”中失败一样。

      # what somebody from an another language would do
      if not test.has_key('foo'):
          test['foo'] = 0
      n = test['foo'] = test['foo'] + 1
      

      VS

      # what an agnostic beginer would do 
      try:
          test['foo'] += 1
      except KeyError:
          test['foo'] = 1
      n = test['foo']
      

      vs

      # what you end up after looking for dictionary default value in the python doc
      test.setdefault('foo', 0)
      n = test['foo'] = test['foo'] + 1
      

      VS

      # what I would do
      n = test['foo'] = test.get('foo', 0) + 1
      

      最糟糕的是,他们并没有完全同样的事情。有微妙的差异。

    4. 空格和制表符之间的选择。应该别无选择。选择,把它放在石头上并停止战斗。

    5. 你为什么这样做:

      test = {}
      test['foo'] = 0
      

      但不是:

      test = []
      test[] = 0
      
    6. P.S:" ".join(l)是好人。停止抱怨它,它并不明显,但考虑到迭代器模式,这是正确的方法。

    答案 117 :(得分:2)

    Common Lisp

    • 条件不是类(因为类以后出现),即使它们的界面几乎相同
    • 有些名字很奇怪,例如flet / labels(只有差异:范围),defvar / defparameter(唯一的区别:已经定义的行为),或任何bit-twiddling函数(dpb,ldb,等)
    • 包裹......真的很难做对 - 每当我认为我理解它们时,它们就不会做我想做的事情
    • 内置的数据结构和函数并不像它们那样通用(例如,为什么我不能手动定义自己的哈希函数?)
    • 函数,变量等的多个命名空间(原则上我并不反对这一点,但CL使它太复杂; Norvig说他不能从规范中说出来,但似乎至少有7个命名空间)

    答案 118 :(得分:2)

    的Haskell

    1. 有时类型系统感觉倒退。如果我不希望编译器为我的变量推断类型怎么办?如果我想要相反的话,它会对所述变量进行约束检查,该怎么办?例如,它不是推断列表元素的类型,而是确保它们都属于特定的类型类。这是一个微妙但巨大的差异,这使我很难编程UI。它可以完成,但它需要比其他语言更多的努力。 Haskell针对非UI部分进行了研究,但是我将UI留给了无类型的语言。

    2. 允许构建无限值有时会导致一些非常令人沮丧的错误。

    3. NoMonomorphismRestriction。

    4. Bytestring处理有时会让我陷入困境,直到你的程序崩溃,你才会知道它,因为你把它们混合得不正确。当我们丢失应该防止这种情况的类型信息时,这里出了点问题。

    5. 对于琐碎的案件,例如证人类型,应该自动派生类型类别,但是在那里滥用的可能性非常大。

    答案 119 :(得分:2)

    C#

    我知道它很愚蠢,但我希望数据类型能够自行转换为我想要的内容,而无需添加(int)Convert.ToInt32或其他任何内容。这会节省我的时间。令我很生气的是,如果我写了一些内容来输出int,然后事实证明我需要一个long,那么我经常需要通过改变我所做的一切来使其工作。就这样做吧!

    抱歉,想不到五个,但我是新手,所以也许我会回来再添加更多:P

    答案 120 :(得分:2)

    我讨厌C ++的五件事

    • 链接时间。使用分布式构建,我可以在我们的链接器运行的同时重建整个项目。
    • 没有标准方法来阻止内存操作的重新排序。使用写入组合内存通常需要滥用volatile关键字。防止读取重新排序(通常对于处理SIMD数学流水线时的优化至关重要)通常是通过在例程中注入空ASM块来实现的。
    • 解决字符串化问题的多步宏:
    #define STR_LINE2(x) #x
    #define STR_LINE(x)   STR_LINE2(x)
    #define LINE_NUMBER STR_LINE(__LINE__)

    • 进行字符串操作通常很痛苦。
    • 非标准化printf变体的扩散(vsnprintf_s vs _vsnprintf_s)。

    答案 121 :(得分:2)

    <强> C ++

    • 涉及模板时的神秘错误消息
    • 缺少模板约束(很多情况下可以使用模板元编程,但这会导致代码不可读(至少对于普通程序员来说)大多数情况下)
    • 指向成员函数语法的指针
    • c ++标准委员会应该更频繁地发布官方标准(或者至少发布标准库本身的单独更新),我的意思是真的TR1是2005年发布的,我们仍然没有标准库中的shared_ptr,bind和类似。
    •   -

    答案 122 :(得分:2)

    关于C#:

    1. 我讨厌没有关键字来指定从方法中抛出哪些异常 喜欢在java中。与使用XML注释相比,它是记录异常的更好方法。
    2. 我还想要一个更好的语法来处理通用约束,例如oring和anding of constraints。
    3. 为什么方法不能返回多个值?
    4. 缺乏对语言中面向方面编程的支持。
    5. 为什么不能用属性注释每个属性访问器?
    6. 缺乏内置的regexp支持,如perl。

    答案 123 :(得分:2)

    <强>的Python

    1. 标准图书馆在许多地方违反了他们自己的风格指南。 (PEP-8)
    2. Py3k的超级关键字充满了不必要的魔法(你不能把它分配给另一个名字,没有 self ,为什么我们有这个显式参数?)
    3. Py2k中的Unicode支持不完整,Py3k很糟糕(unicode中的标准输入,没有二进制数据!WTF?创建一个新的WSGI标准很糟糕。)
    4. GIL。非常有限的多线程支持(使用CPython)
    5. PyPI(Python Package Index)很糟糕。 羡慕一眼rubygems

    答案 124 :(得分:2)

    PHP:

    • Absurd assert()函数......它在
    • 里面的代码上运行eval()
    • &GT?; tag会删除它后面的任何换行符吗?!
    • 数字字符串的奇怪处理(将它们作为数组键使用)
    • 似乎不再的痛苦的unicode支持将由PHP 6解决
    • 低入门成本意味着95%的人给PHP程序员一个可怕的名字 - 并试图找到5%的人来招聘是疯了。

    答案 125 :(得分:2)

    Python

    1. Python 3没有Django。
    2. 静态输入。是的,动态打字很棒,但有时我确实希望它是静态的。
    3. 正确的unicode支持(在Python 3中修复)
    4. 建筑师命名。我讨厌所有这些下划线__in__我的代码。
    5. 线程效率不高

    答案 126 :(得分:2)

    EL - 表达式语言,JSP页面中的${...}#{...}内容以及用于从底层Java代码中提取数据的JSF 2.0 Facelets。

    • 所有有趣的事情,例如带参数和基于注释的命名的方法调用仅存在于Java EE 6中的EL中,该版本仅在Glassfish v3中可用。
    • 1)为早期的Servlet 2.5容器获取正确的罐子,以及2)让它们工作而不干扰容器中任何先前的实现,这是一种皇家的痛苦。
    • 只有像1.2这样的早期版本的JSF,取消了方法调用并让你使用f:setPropertyActionListener - http://weblogs.java.net/blog/2009/07/22/say-sayonara-spal - 相信我,这不是很好。
    • EL解析器没有想知道它解析和解释的片段来自哪里,所以你倾向于给所有内容一个id,这样你至少可以识别哪个标签让它变得脾气暴躁。
    • Eclipse在每次EL方法调用时都会发出警告,因为它是JSF 1.2。也是。

    答案 127 :(得分:2)

    到目前为止,我最讨厌我最喜欢的语言的是我的选择不断改变。每次我认为我找到了 The One ,我发现了五件(或更多)我讨厌它的事情。然后那边的草看起来更绿......

    答案 128 :(得分:1)

    Python:数组部件选择不能满足您的要求。

    a [1]给你一个元素
    a [1:2]给你一个元素,而不是[a [1],a [2]]
    a [1:3]给出2个元素

    我讨厌这个,但也许那只是因为我主要在Verilog工作。

    答案 129 :(得分:1)

    C ++

    1. 制作一段简单的代码需要花费很多时间。
    2. for(std :: vector :: const_iterator iter = [...]
    3. vector.remove()不会删除。
    4. vector.push_front()不存在。
    5. 标题文件
    6. 没有lambda
    7. 如果至少有一个虚函数,则不会自动清空虚拟析构函数。

    答案 130 :(得分:1)

    C#

    • 通用参数不变 C#4.0引入了泛型类型的协方差和逆变
    • 可以将可覆盖的类成员明确标记为虚拟

    爪哇

    • 缺少无符号数字数据类型
    • 原始数据类型不是对象

    答案 131 :(得分:1)

    的Python:

    • 速度
    • 静态分析(缺乏)
    • 匿名函数仅限于一个表达式

    答案 132 :(得分:1)

    红宝石:

    • 重要的空白。对于解释器,行尾=语句结束,除非看起来语句应该继续(或者你明确地转义换行符)。
    • 在线文档不如Python(在辩护中,Python的优秀)
    • 我提到慢吗?

    答案 133 :(得分:1)

    红宝石

    1. 无类型推断
    2. 方法/功能不是一流的对象
    3. 虽然块变量的范围是词汇
    4. ,但变量的范围不是词法
    5. def def def
    6. super和super()
    7. 之间的区别

    答案 134 :(得分:1)

    我觉得无法选择喜欢的语言。动态类型和静态类型无法进行比较,因此我将列出我使用的哪个

    C ++:

    • 模板元编程语法很难看。隐式::value会使其更加简洁
    • ->.为什么编译器无法确定我正在为ptr.thing->而只为我做vector<vector<int>>
    • 我讨厌空白。所以整个vector<vector<int> >必须是int[][]让我感到紧张,然后每当我看到这行代码时我都无法集中注意力,而我最终想要找到一种方法来使用{{1
    • 宏。我个人喜欢宏的概念。但是使用C ++,我认为系统是一个黑客
    • 我是;
    • 的仇敌

    的Python:

    • 字符串是不可变的。这样做我不能只做字符串[4] =“b”
    • 列表通过引用隐式复制。哪个泄漏到[[0] *宽度] *高度问题
    • 缺少尾递归(每当我错误输入递归函数时,我不得不装IDLE以不吐出1000条错误消息)
    • 词典键不接受列表/词组
    • 缺乏深度范围。当我进行列表理解时,我不希望其中的变量影响外部范围

    答案 135 :(得分:1)

    我可以为Python添加另一个:

    给定一个列表l = [l1, l2, ..., ln],然后repr(l) = [repr(l1), repr(l2), ..., repr(ln)],但str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l))。这是因为可能是列表中的模糊内容,例如l = ["foo], [bar,", "],["]str(l)会返回"[foo], [bar, ], []",这可能会“混淆用户”。但是,这使得str无法仅用于转储数据,因为列表会以“可读格式”删除“只转储数据”。 Augh!

    答案 136 :(得分:1)

    MEL(Maya表达语言):

    • 单维数组:强制我手动同步两个或多个列表,或使用分隔字符串来模拟更复杂的数据结构。当然,它们也是不变的。
    • 单线程且缓慢:导致整个Maya应用程序在完成任务时挂起。奖励点是因为无法杀死长时间操作,而是必须关闭并重新打开Maya。
    • 脚本源路径不是递归的:意味着您要存储脚本的每个目录都必须添加到脚本路径中。
    • 无名称空间:强制不一致地使用命名约定以确保全局过程不会发生冲突。
    • 模态命令:每个命令都是模态的,这意味着Create,Modify和Query操作都是通过设置标志来处理的。这也迫使开发人员使大多数命令返回数组
    • 命令样式不一致:大多数数组命令实际上返回数组,但Tokenize命令必须将数组作为引用然后填充,而不是吐出数组。这有其他不一致之处。

    这些以及其他几个原因是为什么AutoDesk采用Python作为第二种脚本语言,这会带来一些令人讨厌的因素:

    • 并非所有MEL命令都受支持:大多数都是,但是你时不时会发现自己必须使用mel()函数执行一些任意代码。更糟糕的是你必须做的所有令人讨厌的逃避。
    • 继承模态命令样式:必须使用相同的create = True,query = True,edit = True stuff。

    答案 137 :(得分:1)

    C是我的最爱,但它也很可怕。

    • 它拥有最糟糕的预处理器。他们为什么不使用像m4这样的东西?
    • 整个标头与源文件 模特坏了。帕斯卡说得对 与单位。
    • 需要案例范围 switch语句。
    • 来自void *的工会和演员破坏了类型系统。这使得垃圾收集器变得不可能。
    • 没有嵌套函数。 GNU C有这个,但它应该是标准的。
    • 没有边界检查分配的内存。有些工具可以发现这个但是 他们不会检测到一段代码错误计算地址和写入的错误 到一个完全没有关系的分配区域。我讨厌整个指针 算术。
    • 没有边界检查数组。
    • 关于可移植性的问题太多了。甚至wchar_t也因平台而异。

    答案 138 :(得分:1)

    <强> REBOL

    REBOL 是我最喜欢的语言中的。我不能说我有一个最喜欢的,虽然Haskell也很高。

    1. 它的奇怪语法在他们尝试尝试之前吓跑了许多开发人员。

      use [email rules url] [
      
      
      ; A small DSL that sends email to people about URLs.
      rules: [
          some [
              into [
                  set email email!
                  set url url!
                  (send/subject email url reform [ "Check Out" url ])
              ]
          ]
      ]
      
      ; Global context
      notify: func [ [catch] dsl [block!] ] [
          unless parse dsl rules [
              throw make error! "You screwed up somehow."
          ]
      ]
      
      ] notify [ [ a@b.com http://www.google.com ] [ b@c.com http://www.yahoo.com ] ]
    2. 使用PARSE非常容易验证递归方言,但很难评估。 (Stacks在这里很有帮助。)

    3. REBOL与许多流行技术(尤其是XML)的集成非常差。我怀疑这部分是傲慢,因为REBOL BLOCK!数据类型几乎可以完成XML所能做的所有事情。但是,现实世界中有XML。
    4. 没有Unicode。
    5. 感谢AltMe,REBOL的用户社区非常孤立。我可以理解他们为什么要使用AltMe。它是用REBOL编写的,展示了它的优点。不幸的是,它也将它们放在了自己的小岛上。
    6. 即将推出的REBOL 3将有望解决其中的许多问题,除了最后一个问题。

    答案 139 :(得分:1)

    C#

    1)缺乏为值类型编写泛型的实际能力。例如,任何白痴(大多数白痴)都可以编写一个例程来计算C ++中int,float,double等列表的标准偏差,它编写简单,易于阅读并执行快速非通用代码。我想如果你能用C#写一些接近于其中任何一个的东西而不是另外一个2,那么你就是一个非常优秀的程序员。

    2)协方差和对立方差,尽管这被添加到4。

    3)LINQ的文档极差(好吧,不是语言的真正部分)。

    4)当我想每次都做同样的事情时,尝试使用foreach / iterators,除了上次稍微不同的东西(比如在它们和单词之间以及最后两个之间用逗号连接一串字符串)。如果我用IEnumerable写它,它很难写和读,并且使用for(int i = 0 i&lt; ...)它不是更好而且效率较低。

    5)我知道我会得到关于此的投诉,但缺乏经过检查的例外情况。这不需要像在java中那样实现(框架开发人员确实对他们为什么不这样做做了一些非常好的观点),但是我会很高兴编译器警告那些不喜欢检查异常的用户可以关掉。

    答案 140 :(得分:1)

    昆雅

    •社区太小。当附近找不到另一个演讲者时,几乎不可能有一个好的语言浸入式课程 • 不规则动词。是的,我知道英语和西班牙语也提到了它们,但Quenya是发明的。为什么还需要不规则动词?
    •没有Unicode支持。在我能阅读大多数消息之前,我必须在我的计算机上安装三种不同的Tengwar字体,其中一些字体很难被修改。鉴于存在罗马化的转录,这不会是一个巨大的问题,但Tengwar是如此美丽,你不想不使用它。
    •并非所有概念都可以在昆雅语中轻易引用,导致烦人的迂回曲折,或诉诸Sindarin,Númenórean或(Manwë救救我)Klingon来表达我的观点。

    答案 141 :(得分:1)

    <强> C#

    一直以来宠爱C#的头号人物必须是:

    (1)事件具有对所有侦听器的强引用,从而防止对侦听事件的任何内容进行垃圾回收。如果你想看到问题,那么只能通过创建某种“弱引用事件处理程序”来尝试解决问题的所有人在网上搜索。

    (2)在调用之前需要检查事件是否等于null似乎应该由语言处理。

    (3) XML序列化程序无法在XML文件中读/写注释。在手动和使用C#编写的工具修改XML文件的环境中,效果不佳。可以通过使用原始的XmlDocument来解决这个问题,但能够更好地将其抽象为类。

    (4)构建过程不允许您直接访问xsd文件之类的内容,而是需要一个创建C#分部类的中间步骤。这也会导致XAML文件出现问题,有时需要重建两次以使更改正确流通。

    (5)不支持MMX和SSE 1,2,3,4等CPU内在函数,因此在运行C#应用程序时,这些宝贵的CPU功能无法使用。

    其他没有进入前5名的人:

    (6)无法将字段标记为属性,必须从get go显式实现所有属性:

    E.g。目前有:

    public class MyClass {
        private int someInt;
    
        public int SomeInt {
            get {
                    return someInt;
            }
            set {
                    someInt = value;
            }
        }
    }
    

    想要

    public class MyClass {
        [IsProperty(public, get, set)]
        private int someInt;
    }
    

    (7)不支持多个返回值,例如:

    public int, string, double MyFunction()
    {
        ....
        return x,y,z;
    }
    
    
    public void TestMyFunction()
    {
        int x, string y, double z = MyFunction();
    }
    

    (8)不支持协变返回类型

    我对仿制药实施有一些抱怨,但我会把它剪掉。我认为C#是一种很好的语言,可用于完成所有的GUI,网络和配置管道,是我从头到尾可以支持的方式快速完成工作的第一语言。

    答案 142 :(得分:1)

    <强>的Python

    我不明白的那些......

    • math.ceil()math.floor()返回浮点数,而不是整数(可能是为了避免底层C函数中的整数溢出 - 但为什么不将其强制转换为Python?)
    • len()是一种功能而不是方法
    • reload()非常有限,不会重新加载模块9次,只会重新加载导入的标签(如果它是模块) - 即如果foo本身不是模块,则无法执行from bar import foo; reload(foo) < / LI>
    • 可变默认参数有一个引用(为什么不是每个函数调用的新实例?!)
    • 所有这些强调的变量 - 如果它们如此私密,我们怎么会在代码中看到内置的变量呢?获取命名空间!
    • 字符串不可变 - 也许这是有充分理由的,但我遇到过很多情况,我想调整一个特定的角色......

    基于实施而有意义的但是很烦人......

    • array.sort()不返回数组(我认为它就地发生)
    • 列表/生成器理解没有定义新的范围(只是for循环的语法糖,对吗?)

    以及在Python 3中修复的一对

    • 默认情况下为整数除法
    • global只能引用顶级命名空间

    答案 143 :(得分:1)

    Scala的:

    • 标准库怪异:它并不总是显示最佳实践,并且未得到充分记录
    • 硬编码的FunctionX,TupleX类
    • 缺乏属性:getter和setter是分开的,这违反了DRY,并使得像FRP这样的东西几乎不可能
    • 需要= _来初始化属性

    答案 144 :(得分:1)

    我的5 for Delphi:

    1. 如果没有参数化,程序和函数不一定与变量区分开(例如,我可以使用x:= GetPositionOnScreen等语句;而不是x:= GetPositionOnScreen();)
    2. 尝试/最后和Try / Except需要嵌套(之前说过一次,但它仍然是我的一个)。
    3. 不区分大小写。
    4. 可以将多个对象(函数,全局变量,局部变量)命名为相同,Delphi将很乐意尝试找出您的意思。名称应该是唯一的。
    5. 奇怪,如果条件规则。单个条件检查不需要围绕它的a(),但是如果我进行多次检查,我需要围绕每个检查一个(),有时需要多个嵌套集来进行更大的检查。
    6. 没有继承包含。如果我需要在基本和继承的表单中引用Windows单元的功能,我必须在两者中包含Windows。

    答案 145 :(得分:1)

    经过一番思考后重写了这个......

    我讨厌PHP的五件事虽然我喜欢它(没有特别的顺序):

    • 内置函数中的命名和参数顺序不一致。
    • 由于SPL而面向对象的数组方法,但遗憾的是没有字符串(还)。
    • PHP本身没有真正的并发性,只能通过托管Web服务器多处理
    • 没有像JavaScript中那样的异步调用
    • 仅通过扩展程序进行操作码缓存。不是很糟糕,但只是讨厌。

    这些是令我烦恼的语言特征(或缺乏),但更大的问题是这些更多人/社区相关的事情:

    1. 许多使用PHP的人对一般的编程和良好实践一无所知并且产生非常混乱的代码。 JavaScript也存在同样的问题。

    2. 教授真正糟糕的做法和风格的大量教程/书籍。这可能是#3的主要原因。

    3. 它的声誉很差,主要是因为#3和#4。

    答案 146 :(得分:1)

    不得不假设我们有语言。我们呢?

    答案 147 :(得分:1)

    C#

    我对C#非常满意,但这两个让我非常恼火:

    • 基于构造函数的不可变类初始化不太方便,不太直观(当您阅读代码时,您不了解分配给什么的代码),IDE支持比内联对象初始化少。这使你不可避免地倾向于可变类。我知道之前已经提到过,但我对不可变类的初始化语法严格存在问题。

    • switch太冗长了。每当我看到一个开关适当的情况时,我真的倾向于使用if..else if..,因为它更简洁(打字减少约30%)。我认为切换应该没有漏洞,break应该隐含,case应该允许以逗号分隔的值列表。

    答案 148 :(得分:1)

    根据许多人的说法,Java很慢,但我同意某种程度的使用。

    Java非常引人注目。他们有很多课程只是为了你想做的一件事。但是你知道灵活性属性XD。

    Java起初很难,但一如既往的乐趣。

    当您编写一个简单的代码来打印“Hello,World!”时请不要使用JAVA! XD我确信我有理由。

    Java是一种混合体,所以不要说它纯粹是一种OOP语言。

    还有更多,但我只限于五个XD。谢谢!

    答案 149 :(得分:1)

    C#

    1. 没有简单的方法来检查类型是否为数字
    2. 这意味着你可能会使用大部分的微软堆栈,IIS和MSSQL
    3. C#不是针对特定问题的特定工具,而是尝试成为每种范例的语言。
    4. 缺乏社区。当然,C#开始有开源框架和库。 Java开发人员多年来可以使用的相同内容。
    5. 很难找到很好的帮助。互联网上充斥着如何解决C#问题的不良例子。这可以追溯到问题#3。

    答案 150 :(得分:1)

    <强>的JavaScript

    来自ECMAScript 5规范:

    • 7.6.1.2未来保留字:

      class,enum,extends,super,const,export, 进口

      在严格模式下:实现,让,私有,公共,接口,包,保护,静态,收益

    • 11.9.4严格等于算子(===)与11.9.1 TheEqualsOperator(==)
    • 11.9.6严格的等式比较算法(NaN === NaN为假)
    • 8.5数字类型 - 没有真正的整数,一切都是浮点数。
    • 4.2.1对象 - 原型继承

    好的,我有点喜欢最后一个,但这是7种令人困惑的

    答案 151 :(得分:1)

    VB .NET,但仅仅是因为VB6毒害了整整一代程序员

    我在VB .NET商店工作,曾经是VB6商店,在这里工作的每个人都曾经是VB6开发人员,他们顽固地拒绝学习任何有关.NET的知识。他们编码好像它仍然是VB6,他们的应用程序就像VB6应用程序一样糟糕。我的老板积极劝阻任何使用LINQ,因为她担心别人难以理解,这是真的,因为没有人想要理解它。

    我认为如果MS刚刚使用C#,我们会好起来的,这让我很难说,因为我觉得花括号远远不如VB的冗长结束语。

    答案 152 :(得分:1)

    红宝石。

    1. 奇怪的范围规则 - 变量,常量和方法各自的行为不同。规则也会根据您用于创建闭包的关键字而更改。或者你是在一个类,特征类,对象,模块或模块的自我。然后是instance_eval,它将规则更改为一组不同的规则。当模块被“包含”或“扩展”时,它们会再次发生变化,这些模块本身会对范围做出不同的处理。并且元编程无法模拟一些规则集,因此您必须使用eval。除非你使用ruby 1.9,否则所有这些都不同。
    2. 命名空间基本没用。如果你有Foo :: File,那么stdlib文件可能会因为所有Foo而被破坏。
    3. require语句已损坏。如果两个文件彼此需要,那么这些文件的行为可能会发生很大变化,具体取决于首先从其他地方加载的文件。
    4. 库会显着地突然更改API,因此您必须要求所有依赖项的特定次要修订版本号。对于系统上的每个ruby应用程序。
    5. ruby​​gems软件包系统会覆盖“require”而不是将文件放在搜索路径中 - 因为为什么在可以替换它时使用系统?

    答案 153 :(得分:1)

    Python 3

    • 两个标签&amp;允许缩进的空间
      你会认为人们从过去学习(Makefile)。只需选择空格并禁止标签。 YAML做得对。
    • 缺乏受欢迎的第三方图书馆
      标准库很棒,但是很多使Python 2如此强大的东西在于第三方领域。 Python 2做对了: - )。
    • IEEE浮动
      编程语言中的浮点令人困惑,因为它们与我们在数学中使用它们的方式不同。相反,应将数字操作视为仅在需要时(即打印到屏幕)转换为小数点格式的表达式。 Maple和Mathematica我认为这是正确的。
    • 标识符的字符集太受限制
      list.empty?优于list.is_empty甚至len(list) != 0。同样,process.kill!会优于process.kill Ruby和lisp做对了。
    • 调用函数时,您必须始终编写括号
      如果我们可以在明确的情况下省略它们,那将是很好的。再怎么样? dict.itemsdict.items() Ruby也是正确的。

    答案 154 :(得分:1)

    的Python:

    1. 没有标准的GUI工具包(社区围绕这个问题四处走动,但似乎永远不会解决任何问题)。

    2. 分发和安装Python应用程序和库的工具和方法的发展一直很糟糕。 (虽然最近这似乎正在接近修复。)

    3. CPython仍然很慢,因为翻译人员去了(虽然PyPy现在看起来很不错,如果它成为“标准”Python,这个问题就会消失)。

    4. 你不能在没有覆盖很多方法的情况下对内置类(例如list和dict)进行子类化,即使你想做的只是一个事件的简单钩子(例如,钩住一个要添加到列表中或从列表中删除的项目,您需要覆盖 delitem ,追加,扩展,插入,弹出和删除 - 没有可子类化的“更改”事件通知,也没有任何“受保护”方法这是所有上述方法使用的公共代码的因素。)

    5. 直到virtualenv被发明为止,在一台机器上为不同目的保留单独的Python环境真是一件痛苦的事。

    答案 155 :(得分:1)

    Java - 不支持语言级别的作文

    答案 156 :(得分:1)

    爪哇:

    1. 非常不一致。
    2. 图形API有时候很难使用
    3. NullPointerExceptions不告诉你什么是null
    4. 我编写的程序有时不能在不同的JVM上工作,这是一个巨大的痛苦,与Java的“一次编写,随处运行”声明相矛盾。
    5. 摆动并不像应该的那样好。

    答案 157 :(得分:0)

    VB.NET

    1)如果不是x是“foo”(而不是&lt;&gt;“foo”)
    2)“OrElse”和“AndAlso”短路(而不是简单的“Or”和“And”,其行为不同)
    3)没有(而不是空)

    答案 158 :(得分:0)

    C#中没有预处理器。

    我知道他们把它遗弃了,因为有些人可以滥用它,但我认为他们把婴儿扔出洗澡水。代码生成被视为一件好事,在C ++中,预处理器是我的第一行代码生成器。

    答案 159 :(得分:0)

    Java:

    • 没有程序编码,它编译成程序代码,所以让我使用它!
    • 没有多重继承,尝试用15,000个接口做同样的事情。
    • 日期课,我还需要说更多。
    • 我不能完全使用多态性。 Java不会覆盖要触发的不同参数类型。
    • 我想不出第五个原因,如果我回来编辑这篇文章。

    答案 160 :(得分:0)

    的Python:

    1)它是一种脚本语言而不是完全编译的语言(我更喜欢能够编译二进制文件 - 我不关心字节码)。如果我必须使用非常多的库(即使用我的程序的每个人都必须安装所有库,这基本上意味着没有普通人能够,或者有耐心,正确设置它,这非常烦人 - 除非我做了大量应该不必要的工作。我知道如何制作二进制文件,但是它们总是工作,而且我猜它们无论如何都会将解释器捆绑在二进制文件中(我不希望这样)。现在,如果我能得到一个字节码编译器,它将包含我导入的所有文件的副本(并且只包括那些)放在我程序的文件夹中,这可能是一个合适的折衷方案(那么没有人必须下载额外的库和这样)。如果编译好的python文件可以压缩成一个文件,并且在完成此操作之前将一个文件指定为运行程序的文件,那也很好。

    2)有时似乎有点儿马车;曾经有几次代码本来应该没有(没有程序员错误),特别是与“from moduleX import *”相关的代码,以及其他与导入相关的问题,以及一些相关的问题全球和地方变量。

    3)最大递归深度可能更高。至少有一次我觉得我需要它更高。

    4)没有switch语句(更不用说允许数字,字符串和范围的语句)

    5)较新的Python版本似乎消除了许多有用的字符串操作,并且它们似乎没有关于如何在没有它们的情况下执行相同操作的简单文档。

    6)强制自动垃圾收集(我希望能够手动完成它,但不一定强制这样做。)

    7)没有使用GUI就没有预先制作的Timer类(好吧,可能有一个,但是经过我所做的所有搜索,确实找不到方便!我确实找到了一些东西,但它当我尝试它时根本不起作用。)通过一个计时器,我的意思是每x秒执行一次指定函数的排序,能够在需要时关闭它等等。

    8)社区中提供示例的人很少会告诉他们导入了哪些模块,以及他们如何导入这些模块。

    9)与Lua的整合没有太多支持。

    10)似乎没有办法向类的特定实例(而不是整个类)添加额外的函数,除非你动态地将对象变量添加到具有对象的对象的类中所需的功能(但仍然需要为此制作另一个类)。

    答案 161 :(得分:0)

    C#

    <强> 5。空合并运算符

    ??运算符允许您编写:

    x = y ?? z;
    

    而不是:

    x = (y == null) ? y : z;
    

    我喜欢这个操作符,但我想要另一个操作符:

    x = y ??? y.foo() : z.foo();
    

    而不是

    x = (y == null) ? y.foo() : z.foo();
    

    我一直都在使用这种东西,我觉得输入== null部分很烦人。


    <强> 4。等于应该有更好的支持

    我必须使用以下方法启动每个Equals(object obj)方法:     MyClass other = obj as MyClass;     if(other == null)return false;

    你应该只写:

    public override bool Equals(MyClass other) {...}
    

    语言应该注意提供Equals(object obj)方法 注意:其他应保证不为空。


    第3。不能使用不同类型的三元运算符

    这不能编译,我认为应该编译!

    string foo = "hello";
    int bar = 4;
    object baz = foo == null ? foo : bar;
    

    <强> 2。缺乏名称空间隐私

    我喜欢internal保护,但我希望有一种保护只允许在同一个名称空间内进行访问。这样可以更好地控制大型类库中的访问。


    <强> 1。没有多重继承

    我实际上只对接口的默认实现使用实现(类)继承,但是有很多次我想要这样做。

    答案 162 :(得分:0)

    HyperTalk:

    • 很久以前死了
    • 没有简单的作业(你不能只说a := 3,你必须说put 3 into a
    • 没有嵌套函数
    • 没有真正的数据结构,只有字符串。要制作“列表”,您可以使用itemDelimiter分隔项目并手动转义它们。您还可以获取get word 2 of line 5 of txt
    • 等字符和单词

    顺便说一句,我认为HyperTalk独有的最酷功能之一就是特殊的it变量:

    ask "How many years old are you?"
    answer "You are " & it*12 & " months old."
    

    答案 163 :(得分:0)

    的Python

    • 没有名称空间。
    • 伪私有属性/名称修改(主要使用getattr)。
    • 文件路径操作分布在多个模块中。将os.path调用串在一起是丑陋的,难以阅读,并且在大多数情况下,违反了DRY。常见的文件路径操作仍然没有便利功能,例如获取目录中的文件列表。解决此问题的path - 类型模块被拒绝。

    [f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))]

    • Python文档(我非常,非常,非常感谢有文档,并且它的格式非常好,但我讨厌浏览5000行快速启动用法示例以查找特定的单独功能文档模块(我正在看你的optparse和日志))。内置类型在近10个不同的地方逐个记录。

    答案 164 :(得分:0)

    <强>的Lua

    • 如果你做foo.bar(1,2)那么'self'在bar方法中是nil。你必须记得做foo:bar(1,2)。我宁愿切换(默认情况下应该定义'self',除非你使用':'运算符,或者你调用的函数不是方法)。
    • 默认情况下,变量是全局变量。我宁愿放弃'local'关键字,而是改为使用'global'关键字。
    • 未声明的变量分配为nil。我宁愿收到错误信息。您可以通过操纵全局环境的metatable来回避这个问题,但我宁愿在默认情况下实现它并且能够将其停用。
    • 参数的多个返回值未得到很好的处理。假设你有一个函数foo()返回1,2,3(三个值),bar()返回4,5(两个值)。如果你打印(foo(),bar()),你会得到“1,4,5”......只有“最后一个”元组才会被调用。
    • #(表长度)运算符仅适用于使用连续整数索引的表。如果你的表不是那样的,你想知道它有多少个元素,你需要用循环解析它,或者每次插入/删除一个元素时更新一个计数器。

    答案 165 :(得分:0)

    我刚刚发现在c#中创建Generic方法时我不能使用Enum作为类型约束。

    微软已经解释了原因,但仍然如此。我是MAD

    public static T MyFunc<T>(string arg) where T:Enum //wont work :(
    

    答案 166 :(得分:0)

    JavaFX的

    • 类型推断有时不起作用    就像你期望的那样,所以你经常这样    需要明确声明    类型。
    • def表现为C中的const而不是Java中的final
    • 您可以通过访问索引&gt; = seq.length来插入序列中的值,这实际上会引发编译器错误(根据参考)。
    • 如果为String指定null,则默认为“”。如果为整数分配null,则抛出编译器错误(与引用所说的相反)。
    • 以与RuntimeExceptions相同的方式处理CheckedExceptions

    答案 167 :(得分:0)

    C#

    • 无法创建引用(var&amp; t = struct)
    • 没有本地范围的析构函数(IDispose接近但不一样)
    • ToString,我几乎不喜欢每个对象都有它,但事实证明我不喜欢使用它像string.format那样。我喜欢接受某种类型的东西(比如整数,浮点数,文本,字符)。因此,我不需要传入任何对象,而是需要使用隐式类型转换或接口传递内容。我最后写了这样的东西来安全地逃避html的文本,这非常有用。
    • 不能使用虚拟类型转换(blah)obj;如果obj没有继承/有一个blah接口,则不起作用。简单的解决方法是提供具有转换功能的接口。
    • 没有本地创作。而不是写var o = new Item();我想写(类似于)Item o()(如果有的话,自动处理)。

    答案 168 :(得分:0)

    • length属性很容易与length()函数混淆;使用size()而不是
    • 在选择器字符串中插入变量的语法('“+ $。month +”')stinks
    • $(event.currentTarget)并不总是用于冒泡和捕获
    • 属性语法在选择器语法(“.foot”)不返回任何内容的地方工作(“[class ='foot']”)
    • 包含选择器([class~ = done])有时会失败,其中JavaScript(this.className.search(“done”)&gt; 0)工作

    答案 169 :(得分:0)

    的Python:

    • 没有分隔符信号通知块的结尾引入歧义,使得自动缩进不适用于格式不良的代码。
    • 没有宏(装饰者不计算)
    • 像haskell的cabal或perl的CPAN没有库自动提取
    • 不能声明变量const(是的,它可以扮演你自己的角色但是......)
    • 元编程是神经紧张的
    • 几乎忘记了Global Interpreter Lock

    答案 170 :(得分:0)

    我只有一个,但我相信值得分享。

    CSharp / .NET

    我们有Length属性来获取数组中的元素数,使用Count属性来获取集合中元素的数量。如果你考虑CLR自动将IList,ICollection,IEnumerable添加到场景背后基于零的一维矩阵的事实,这看起来更奇怪。

    我相信CLR团队和BCL团队很难讨论这个问题;)

    答案 171 :(得分:0)

    Object Pascal:

    • 在你正在编辑的文件中来回跳转很多,因为界面和实现被分成两部分但仍然卡在同一个文件中。
    • 数组的动态索引,字符串从1开始,在声明固定数组时指定起始索引,动态分配的数组始终从0开始。
    • 类和对象(不是说接口)被固定在语言之上,除了其他东西之外,不能像记录一样分配堆栈。
    • 当调用没有参数的函数时,()是可选的,当你处理函数指针或尝试使用函数名称引用函数的结果时会导致很多痛苦。
    • 如果没有外部类型定义,参数列表将无法处理固定数组类型或函数指针类型。

    这只是语言,标准库和片状IDE的遗憾理由值得拥有自己的列表。

    答案 172 :(得分:0)

    Objective-C 2.0

    严格遵守语言和运行时,而不是库,而不是任何特定的顺序:

    1. 缺乏cVars。
    2. 没有模块。我对缺少命名空间并不十分不满意,但模块会很好。
    3. 基于Ivar的属性语法要求在3个位置使用变量名称进行声明。这很可怕。
    4. C传承。除了OO和GC之外,还存在任何讨厌C语言的东西。
    5. 对象不能存在于堆栈中。 Obj-C不是问题,而是它对其他语言编程实践的影响。例如,当我在C ++中获得堆栈的返回值时,我发现它很奇怪。如果我在编写代码时实际上并没有查看库文档,我会假设每个函数都返回一个指针,这通常会在以后进行一些重要的清理工作。

    答案 173 :(得分:0)

    的Python:

    1)行继续语法:“... \”有效,但“... \”没有,并且尾随空格通常是不可见的,没有编辑器的异常eol标记。
    2)在堆栈跟踪中看不到裸'raise',因为堆栈跟踪看起来像先前引发的异常 3)慢
    4)与Web服务器的集成很差(mod_python:dead,mod_wsgi:操作范围有限)。这很复杂,需要守护程序或某种记忆持久性来表现良好 5)过度容忍混合标签和空格,允许更改控制流有时保持隐藏。 (可能在最近的版本中修复)

    答案 174 :(得分:0)

    <强>的Lua:

    • 内置错误系统绝对可怕

      您可以通过修改Lua解释器来实现try-catch系统;但它与内置函数抛出的错误无法兼容。

    • 事实上他们有__newindex而不是__setindex作为setter

      ...和__newindex仅在密钥尚不存在时触发。如果确实如此,则根本不会调用metamethod。

    • 没有良好的类型比较系统。

      有type()函数,但它只处理基本类型(所有表都是表)。它确实需要一种类型比较的元方法。我之前使用'is'运算符和__type元方法实现了它,它的效果非常好。

    • 定义新关键字是个蠢事。

      你可以这样做,但是Lua中的代码没有很好的记录,因此找出如何获得你想要的结果是一种试验和错误。当你想要实现我自己上面提到的东西时,这是一个主要问题(尽管如此,__setindex,这是一个很容易的修改)。

    • 我无法在网络浏览器中使用它。

      是的,语言本身并不是真正的问题,但该死的,我是否愿意能够使用Lua而不是Javascript ......:)

    答案 175 :(得分:0)

    C

    • 字符串处理
    • 内存管理(决定谁应该分配以及谁应该释放它)
    • 没有名称空间(最大的)
    • 标准库中没有列表/数组和其他基本DS


    的JavaScript

    • 使用不带var的变量会自动将其设为全局
    • 分号不是强制性的
    • 比较运算符“==”和“===”以及有关其使用的混淆
    • 没有适当的支持来处理二进制数据
    • 再次..没有命名空间
    • 变量没有块范围。 (来自C世界的相当恼人)

    答案 176 :(得分:-1)

    <强>的Python

    • 我终于习惯了print语句,现在有了这个打印功能??? (py3k)
    • 从未让py2exe或cxFreeze正常工作
    • 未标准化(轻微挑剔)
    • 递归深度仅为100(iirc)

    答案 177 :(得分:-1)

    <强> VB.NET

    • 默认情况下输入错误(Option Strict修复此问题,但默认情况下不启用)
    • 方法(myFunction而不是myFunction()等)不需要括号
    • 是否使用括号进行数组定义/使用(myArray(12)而不是myArray [12])
    • 不支持直接递增(i ++)
    • 是否支持旧版On Error关键字和整个VB6-Namespace

    答案 178 :(得分:-1)

    C#4.0

    “动态”关键字,适合滥用。如果你想/需要使用Reflection,请使用并明确表示你正在使用它,不要试图用动态伪装它。

    答案 179 :(得分:-2)

    我讨厌的事情 Python

    • 没有编译器
    • 没有认真对待

    让我烦恼的关于Python的事情:

    • (self,
    • private
    • 破坏兼容性

    <小时/> 我讨厌的五件事 PHP

    • “按预期工作”,当它显然是一个错误
    • goto
    • 错误引用(foreach $arr => &$val ... foreach $arr => $val
    • 没有多重继承
    • 在没有牺牲一只羔羊给黑暗神的情况下,没有真正有效的编译器

    答案 180 :(得分:-2)

    SAS

    • 从来没有自己的想法(每件事都是借来的)。

    • 为大型数据集贪婪。

    • 使用Java,但从未学过什么是对象。

    • 窃取Perl,但将其隐藏在数据步骤中。

    • 总是和统计人员说谎!

    答案 181 :(得分:-7)

    Perl代表了一种可怕的语言。

    1. 没有“公开”或“私人”或“受保护”的声明/定义。
    2. “my $ variable_name;”不会在子例程之外声明全局。
    3. “my $ variable_name;”通过子程序访问,但“use strict;”或其他“使用”会产生警告。
    4. 功能原型最终无法解释,未说明,不需要或其他一些借口。
    5. 当阅读符号的大小时,过度使用符号的使用会变得“酷而快”。
    6. 当一个人变热时,他们喜欢保持热,不需要冷却它们。
    7. 经过一周的Perl,我最终无法编写函数并将其原型化。
    8. 模块究竟是什么,实际上需要“.pm”扩展名?
    9. 如果您想创建一个公共变量并从子程序内部访问它,那么如何在不创建警告的情况下完成此操作?
    10. 你在哪里找到一些简洁的脚本来教一个整洁的Perl?