Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages 关于你最喜欢的语言,你最讨厌的五件事是什么?_Programming Languages_Language Agnostic - Fatal编程技术网

Programming languages 关于你最喜欢的语言,你最讨厌的五件事是什么?

Programming languages 关于你最喜欢的语言,你最讨厌的五件事是什么?,programming-languages,language-agnostic,Programming Languages,Language Agnostic,最近出现了一系列关于堆栈溢出的Perl仇恨,所以我想我应该把我的“”问题带到堆栈溢出。用你最喜欢的语言告诉我五件你讨厌的事情。这些可能只是让你烦恼的事情,承认的设计缺陷,公认的性能问题,或任何其他类别。你必须讨厌它,它必须是你最喜欢的语言 不要将它与另一种语言进行比较,也不要谈论你已经讨厌的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只想听到你讨厌但能容忍的东西,这样你就可以使用所有其他东西,我想听到你希望其他人使用的语言 每当有人试图把他们最喜欢的语言强加给我时,我都会问这个问题,有时是作为

最近出现了一系列关于堆栈溢出的Perl仇恨,所以我想我应该把我的“”问题带到堆栈溢出。用你最喜欢的语言告诉我五件你讨厌的事情。这些可能只是让你烦恼的事情,承认的设计缺陷,公认的性能问题,或任何其他类别。你必须讨厌它,它必须是你最喜欢的语言

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

每当有人试图把他们最喜欢的语言强加给我时,我都会问这个问题,有时是作为面试问题。如果有人找不到他最喜欢的工具的五个讨厌的地方,那么他对它的了解就不足以支持它或者利用它赚大钱。他没有在足够多的不同情况下使用它来充分探索它。他把它作为一种文化或宗教来宣传,这意味着如果我不选择他最喜欢的技术,我就错了

我不太在乎你用哪种语言。不想使用特定的语言?那就不要。你通过尽职调查做出了明智的选择,但仍然没有使用它?好的有时候,正确的答案是“你有一个强大的编程团队,拥有良好的实践和丰富的酒吧经验。换成Foo会很愚蠢。”


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

仇恨并不是了解人们知道多少的唯一维度,但我发现这是一个非常好的维度。他们讨厌的东西也给了我一个线索,他们对这个问题的思考有多好。

C#/NET:

  • 默认情况下,类应该是密封的
  • 不应该有
    lock
    语句-相反,应该有特定的锁定对象,应该有
    Acquire
    等返回一次性锁令牌的方法。推论:不应该每个对象都有监视器
  • GetHashCode()
    Equals()
    不应该在
    系统中。Object
    -不是所有东西都适合进行哈希运算。相反,要有一个执行相同操作的
    标识比较程序
    ,并保留
    IComparer
    IComparable
    IEqualityComparer
    IEquatable
    接口,以便进行自定义比较
  • 对不变性的支持不足
  • 发现扩展方法的糟糕方法——这应该是一个比我使用名称空间更明智的决定
这些都是我脑子里想不出来的-明天问我,我会想出一个不同的5:)

C++

  • 模板语法
  • 钻石继承问题
  • 现代语言所拥有的标准库过多/缺乏(尽管boost已经接近尾声)
  • IOStreams周围使用的语法
  • Python

  • 空格是有意义的(有时)
  • 下划线关键字
  • 有限的线程支持(至少当前)
  • “自我”而不是“这个”
  • 空格是有意义的(有时)
  • C

    • 字符串操作

    必须手动处理字符串缓冲区是一种容易出错的痛苦。由于如此多的计算实际上是在移动和修改字符串(计算机并不像人们想象的那样用于处理大量的数字运算),能够使用托管语言或C++的字符串对象来处理这些问题真是太好了。当我必须用C语言来做这件事时,感觉就像在流沙中游泳。

    以下是我不喜欢Java(它不是我最喜欢的语言)的一些地方:

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

    • 缺少静态类型
    • 默认参数处理(特别是您可以为将来的调用者提供默认参数处理!)
    • 所需下划线太多(必须调用构造函数
      \uuuu init\uuuu
    • 缺乏适当的私有成员和函数(惯例只是说,大多数以下划线开头的东西都是私有的,除了所有像
      \uuuuu getattr\uuuuu
      这样的东西都不是)
    • print
      ing到文件的有趣语法(但他们正在Python 3中修复)
    PHP:

    • 我们永远无法确定某些几乎通用的扩展是否在所有Web服务器上都可用
    • 试图成为一切
      $var = preg_match_all('/regexp/', $str, $ret);
      echo $var; //outputs the number of matches 
      print_r($ret); //outputs the matches as an array
      
      object.method(1, {|a| a.bar}, "blah")
      
      $parts = explode('|', $string);
      $first = $parts[0];
      
      $x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;
      
      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;
      
      $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'
      
      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;
      
      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'}
      }
      
      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
      
      / <?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
      
      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,
        ...
      ;
      
      multi sub infix:<+> (Us $us, Them $them) |
                          (Them $them, Us $us) { ... }
      
      int a[10];
      for (int idx = 0; idx < 15; idx++) a[idx] = 10;