Programming languages 关于你最喜欢的语言,你最讨厌的五件事是什么?
最近出现了一系列关于堆栈溢出的Perl仇恨,所以我想我应该把我的“”问题带到堆栈溢出。用你最喜欢的语言告诉我五件你讨厌的事情。这些可能只是让你烦恼的事情,承认的设计缺陷,公认的性能问题,或任何其他类别。你必须讨厌它,它必须是你最喜欢的语言 不要将它与另一种语言进行比较,也不要谈论你已经讨厌的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只想听到你讨厌但能容忍的东西,这样你就可以使用所有其他东西,我想听到你希望其他人使用的语言 每当有人试图把他们最喜欢的语言强加给我时,我都会问这个问题,有时是作为面试问题。如果有人找不到他最喜欢的工具的五个讨厌的地方,那么他对它的了解就不足以支持它或者利用它赚大钱。他没有在足够多的不同情况下使用它来充分探索它。他把它作为一种文化或宗教来宣传,这意味着如果我不选择他最喜欢的技术,我就错了 我不太在乎你用哪种语言。不想使用特定的语言?那就不要。你通过尽职调查做出了明智的选择,但仍然没有使用它?好的有时候,正确的答案是“你有一个强大的编程团队,拥有良好的实践和丰富的酒吧经验。换成Foo会很愚蠢。”Programming languages 关于你最喜欢的语言,你最讨厌的五件事是什么?,programming-languages,language-agnostic,Programming Languages,Language Agnostic,最近出现了一系列关于堆栈溢出的Perl仇恨,所以我想我应该把我的“”问题带到堆栈溢出。用你最喜欢的语言告诉我五件你讨厌的事情。这些可能只是让你烦恼的事情,承认的设计缺陷,公认的性能问题,或任何其他类别。你必须讨厌它,它必须是你最喜欢的语言 不要将它与另一种语言进行比较,也不要谈论你已经讨厌的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只想听到你讨厌但能容忍的东西,这样你就可以使用所有其他东西,我想听到你希望其他人使用的语言 每当有人试图把他们最喜欢的语言强加给我时,我都会问这个问题,有时是作为
对于代码审查来说,这也是一个很好的问题。真正了解代码库的人会有各种各样的建议,而那些不太了解代码库的人会有非特定的抱怨。我会问这样的问题:“如果你能重新开始这个项目,你会有什么不同?”在这个幻想的世界里,用户和程序员会抱怨他们不喜欢的任何事情。“我想要一个更好的界面”、“我想要将模型从视图中分离出来”、“我想使用这个模块而不是另一个模块”、“我想重命名这组方法”,或者他们对当前情况不喜欢的任何东西。这就是我了解特定开发人员对代码库了解多少的方法。这也是一条线索,说明程序员的自我意识在多大程度上与他告诉我的内容有关 仇恨并不是了解人们知道多少的唯一维度,但我发现这是一个非常好的维度。他们讨厌的东西也给了我一个线索,他们对这个问题的思考有多好。C#/NET:
- 默认情况下,类应该是密封的
- 不应该有
语句-相反,应该有特定的锁定对象,应该有lock
等返回一次性锁令牌的方法。推论:不应该每个对象都有监视器Acquire
和GetHashCode()
不应该在Equals()
-不是所有东西都适合进行哈希运算。相反,要有一个执行相同操作的系统中。Object
,并保留标识比较程序
、IComparer
、IComparable
和IEqualityComparer
接口,以便进行自定义比较IEquatable
- 对不变性的支持不足
- 发现扩展方法的糟糕方法——这应该是一个比我使用名称空间更明智的决定
- 字符串操作李>
必须手动处理字符串缓冲区是一种容易出错的痛苦。由于如此多的计算实际上是在移动和修改字符串(计算机并不像人们想象的那样用于处理大量的数字运算),能够使用托管语言或C++的字符串对象来处理这些问题真是太好了。当我必须用C语言来做这件事时,感觉就像在流沙中游泳。以下是我不喜欢Java(它不是我最喜欢的语言)的一些地方:
- 泛型类型擦除(即没有具体化的泛型)
- 无法在单个catch块中捕获多个异常(不同类型)
- 缺少析构函数(finalize()是一个很差的替代品)
- 不支持闭包或将函数视为数据(匿名内部类是非常冗长的替代)
- 一般来说,检查异常,或者更具体地说,检查不可恢复的异常(例如SQLException)
- 不支持文字集合的语言级别支持
- 当调用泛型类的构造函数时,没有类型推断,即类型参数必须在“=”的两侧重复
- 缺少静态类型
- 默认参数处理(特别是您可以为将来的调用者提供默认参数处理!)
- 所需下划线太多(必须调用构造函数
)\uuuu init\uuuu
- 缺乏适当的私有成员和函数(惯例只是说,大多数以下划线开头的东西都是私有的,除了所有像
这样的东西都不是)\uuuuu getattr\uuuuu
ing到文件的有趣语法(但他们正在Python 3中修复)print
- 我们永远无法确定某些几乎通用的扩展是否在所有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;