最近Stack Overflow上出现了一组Perl-hate,所以我想我会把我的“Five things you hate about your favorite language”问题带到Stack Overflow。拿你最喜欢的语言告诉我你讨厌的五件事。那些可能是让你烦恼,承认设计缺陷,公认的性能问题或任何其他类别的东西。你只需要讨厌它,它必须是你最喜欢的语言。
不要将它与其他语言进行比较,也不要谈论你已经厌恶的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只是想听听你讨厌但容忍的事情,这样你就可以使用所有其他东西了,我想听听你希望别人会用的语言。
每当有人试图将他们最喜欢的语言推到我身上时,我就会问这个问题,有时候这也是一个面试问题。如果有人找不到讨厌他最喜欢的工具的五件事情,他就不会很清楚地提倡它或者使用它来获取大笔资金。他没有在足够多的情况下使用它来充分探索它。他主张将其作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,我就错了。
我并不关心你使用哪种语言。不想使用特定的语言?然后不要。您是否经过尽职调查以做出明智的选择但仍然不使用它?精细。有时候正确的答案是“你有一个强大的编程团队,有很好的实践和很多Bar的经验。改变Foo会是愚蠢的。”
这也是代码审查的一个很好的问题。真正了解代码库的人会对它有各种各样的建议,那些不太了解代码库的人会有非特定的投诉。我问的问题是“如果你能重新开始这个项目,你会做些什么不同的事情?”在这个幻想的土地上,用户和程序员会抱怨任何他们不喜欢的东西。 “我想要一个更好的界面”,“我想将模型与视图分开”,“我会使用这个模块而不是另一个”,“我会重命名这套方法”,或者他们真的不喜欢不喜欢目前的情况。这就是我如何处理特定开发人员对代码库的了解程度。这也是一个线索,关于程序员的自我与他告诉我的内容有多大关系。
仇恨并不是弄清楚人们知道多少的唯一方面,但我发现这是一个非常好的方面。他们讨厌的事情也让我知道他们对这个主题的思考程度。答案 0 :(得分:216)
哇,我很惊讶 SQL 还没有在这里搞定。猜猜这意味着没有人喜欢它:)。
......还有一些额外的理由来讨厌它,不收取额外费用
答案 1 :(得分:182)
我讨厌Java的五件事:
我知道,我应该查看Scala。
答案 2 :(得分:160)
<强>的JavaScript 强>:
所有最酷的事情都是非常复杂的,但是,所有的冷静也包含在如此少量的代码中,让你感到愚蠢的努力追随它
'+'是一种荒谬的运算符选择,用于弱类型语言的连接。他们尝试来吓跑新手?
这是一个跨浏览器兼容性的雷区(如果它甚至没有打开,也不介意)
它通常是不受信任的 - 与诸如阻止后退按钮,永不死亡的弹出窗口等的捣乱有关。
调试几乎是不可能的,因为只有几个不同的错误消息和几个不同的类型(数字,字符串,对象等)
如果不是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 ++
答案 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 (目前,这是我最喜欢的语言)并没有特别的顺序。
答案 9 :(得分:73)
Ruby 有很多与其速度相关的缺陷,但我不讨厌这些。它也有社区传福音过火的缺陷,但这并没有真正困扰我。这些是我讨厌的:
块传递给函数的方式很愚蠢。没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield)。我认为块应该被赋予一个不那么模糊的语法(或者哈希可以使用不同的分隔符;也许&lt;&gt;而不是{}),并且作为参数传递给方法应该像所有其他参数一样。
object.method(1, {|a| a.bar}, "blah")
这些奇怪的东西,比如块必须是传递的最后一个参数,并且传递多个块是不同的,语法更长,真的很烦我。
答案 10 :(得分:72)
混合使用符号
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)。其他功能只是 使用不同的命名方案: bin2hex,strtolower, cal_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的东西(这不是我最喜欢的语言):
答案 13 :(得分:40)
<强> C ++ 强>
<强>的Python 强>
答案 14 :(得分:37)
<强>目标C 强>
1)没有命名空间,只是手动命名约定 - 我不介意在类分离方面,但我确实错过了能够在一行中导入命名空间中的所有类定义(如import com.me) .somelibrary。*)。
2)图书馆在RegEx支持等重要领域仍然存在一些漏洞。
3)属性语法有点笨拙,需要三行(在两个单独的文件中)来声明属性。
4)我喜欢保留/释放模型,但它比发布引用更容易,然后在以后意外地使用它。
5)虽然不是真正的语言功能,但Xcode与Objective-C的使用密切相关,我不禁想到这个方面......基本上自动完成,非常不确定。它更像是一个奖励你找到你想要的东西的系统,然后把它作为一个选择。但后来我想我从来没有喜欢自动完成引擎。
答案 15 :(得分:36)
C ++
<强>字符串。强>
它们不能与平台字符串互操作,因此您最终会在一半的时间内使用std :: vector。未定义复制策略(写入或深层复制时复制),因此无法为直接语法提供性能保证。有时它们依赖于不太直观的STL算法。太多的库自己滚动,不幸的是使用它们更加舒适。除非你必须将它们结合起来。
各种字符串表示
现在,这是一个平台问题 - 但是我仍然希望在早期可用的不那么顽固的标准字符串类时会更好。我经常使用以下字符串表示:
构建模型。
我厌倦了所有的时间花在与谁包括什么,前进声明,优化预编译标题和包括至少保持增量构建时间可以忍受等等。这在八十年代是伟大的,但现在?包装一段代码有很多障碍,所以可以重复使用,甚至妈妈们也会听我的话感到无聊。
难以解析
这使得外部工具特别难以编写,并且正确。今天,我们C ++人员大多缺乏工具链。我喜欢我的C#反思和代表,但我可以没有它们。如果没有很好的重构,我就不能。
线程太难
语言甚至不识别它(到现在为止),编译器的自由 - 虽然很棒 - 但是很痛苦。
静态和按需初始化 从技术上讲,我在这里作弊:这是“重复使用的代码”中的另一个难题:只有在需要时才能初始化某个东西是一场噩梦。所有其他redist问题的最佳解决方案是将所有内容放入标题中,这个问题说“neeener - 你不能”。
当然,其中很多都超出了严格的语言范围,但IMO需要对整个工具链进行评判并需要进化。
答案 16 :(得分:35)
<强>的JavaScript 强>:
可以修改Object
原型。程序中的每个对象都会获得新的属性,并且可能会中断。
所有对象都是哈希映射,但很难安全地使用它们。特别是,如果您的某个密钥恰好是__proto__
,那么您就遇到了麻烦。
在功能参考时没有对象关闭。实际上,根本没有对象闭包 - 相反,只要使用对象表示法或this
运算符调用函数,就会设置new
。导致很多混乱,尤其是在创建事件回调时,因为this
未设置为程序员所期望的。
new
运算符会导致this
设置为等于全局对象,从而导致严重破坏。尽管两个操作根本不同,但加法运算符重载也会执行字符串连接。当您期望作为数字的值实际上是一个字符串时,会导致痛苦。
==
和!=
运算符执行类型强制。不同类型之间的比较涉及一系列规则,凡凡人都无法完整记住。 ===
和!==
运算符的存在减轻了这种情况。
null
和undefined
都存在,具有微妙的不同但冗余的含义。为什么呢?
设置原型链的奇怪语法。
parseInt(s)
需要一个C风格的数字,因此将前导零的值视为八进制等。您至少可以parseInt(s, 10)
,但默认行为会令人困惑。
没有区块范围。
可以多次声明同一个变量。
可以使用变量而不声明它,在这种情况下它是全局的,可能会破坏你的程序。
with { }
。
真的难以使用类似工具的JavaDoc进行记录。
答案 17 :(得分:34)
的Python:
__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 强>
答案 20 :(得分:25)
C(好吧,这不是我最喜欢的,但还没有完成。)
答案 21 :(得分:24)
Common Lisp:
答案 22 :(得分:24)
<强> BrainF * CK 强>
您的亮点是您图灵完整?!我可以用Perl正则表达式做更多的事情!
缺少物品。来吧,人们!就像,你好 ...
没有网络库。我想要的只是刮一个网页,GOSH。
没有一流的功能。恭喜你 - 你得与你的Java朋友同情。
用于存储的无限磁带,没有别的。这非常自命不凡,我们不妨写Lisp。
答案 23 :(得分:23)
<强>的JavaScript 强>
答案 24 :(得分:20)
PHP:
然而,PHP是 (脚本)语言。 ; - )
答案 25 :(得分:18)
VB6
答案 26 :(得分:18)
Ruby是我最喜欢的语言,这是我不喜欢的:
答案 27 :(得分:17)
的Delphi:
答案 28 :(得分:16)
<强>的JavaScript 强>
每个脚本都在一个全局“命名空间”中执行...在处理来自不同来源的脚本时您必须注意的事项
如果使用了变量但尚未预先定义,则将其视为全局变量
浏览器供应商按照自己的意愿制定标准,为使用这种美丽语言的开发人员编写代码应该比应该更难
区分大小写 - 考虑到使用编译时检查开发js没有合适的IDE
解决方法(例如使用hasOwnProperty
方法)执行某些操作,否则操作简单。
答案 29 :(得分:15)
Haskell中:
($)
运算符的关联性可以更改为使某些表达式更漂亮。其中大多数都没有达到仇恨的程度,并且有人试图为这些中的每一个修复或构建固体解决方法。
编辑:关于第5点存在一些混淆。特别是有些人似乎认为我的意思是参数的顺序,而我没有。我不会解释我的意思,而只是将人们指向以下链接,http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity,它表达得很好。
答案 30 :(得分:13)
Smalltalk中
答案 31 :(得分:13)
我知道我迟到了,但仇恨是永恒的!
的Java
答案 32 :(得分:12)
我喜欢这种语言,但有些事情让我困扰多年!
答案 33 :(得分:11)
VB.NET
AndAlso
/ OrElse
和And
/ Or
似乎倒退了。也许他们应该换掉。When
只能用于异常捕获。执行When
条件的能力对于其他一些事情会很好。 Not <obj> Is Nothing
。是的,这已由IsNot
补救,但出于某种原因,我发现Not Is
过于频繁使用。 (对于那些把英语作为第二语言的开发者来说,我更频繁地看到它,从这个角度来看它是否更有意义?)()
和大多数功能都不需要ToString()
。 (导致草率的编码习惯)_
。UpperBound
完成,而不是由容量完成。 “Dim arr(2)as String”
实际上会持有3个元素。 =
成为比较和赋值运算符。 答案 34 :(得分:11)
1-3:包装/构建/文档系统没有一个明显的选择(例如Perl的cpan
,POD
或Ruby的{{1 },gem
,rake
)。
4:Python 3.0与每个Python项目需要两个源分支(2.x和3.x)不兼容。但是Python 3.0 不不兼容,足以证明它的合理性。大多数py3k的优点都太微妙了。
5:Jython,IronPython,CPython不兼容。
答案 35 :(得分:10)
目标Caml
非并发垃圾收集器。我可以整天编写多线程程序,但它们一次只能获得我的八个核心之一。这让我很难过。
否型类(或他们的道德当量)。有古濑桑的GCaml,但它是A)并不像类型类和B一样好)不INRIA发行。
非常需要Cocoa桥。说真的。如果我用基于DNA的生命形式的实际接口编写更多代码,那么我可能会分解并自己编写这个该死的东西。为什么没有其他人这样做呢?
Functors很可恶。说真的,模块应该是一流的价值观。应该只有一种功能。在你激怒我之前,请先阅读Montagu and Rémy。
应该使用LLVM作为后端。我是谁必须谋杀才能让OCaml为我愚蠢的小型ARM6内核编译?
所以是的,我有一些问题。我仍然喜欢这种语言。这真是太棒了。
答案 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。
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
关键字,反之亦然。if (type(var) == "string") then stuff() end
很痛苦。PHP:
$function($arg);
,但这不算数。C / C ++:
答案 40 :(得分:7)
红宝石:
答案 41 :(得分:7)
<强> C 强>
snprintf
的标准。使用sprintf
创建格式字符串太困难了,然后使用它以安全的方式再次创建一个包含sprintf
的字符串。HAS_NO_SIDE_EFFECTS
放在不同的地方。为什么我不能抓住函数,切换编译器类型,然后通过宏调用将它插入到正确的位置?<强> C ++ 强>
for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it)
。foo(bar, &baz)
能够和不能修改的内容。答案 42 :(得分:6)
我的语言是Java。以下是我讨厌的事情:
5.缺乏指针
4.)异常捕获
3.)布尔类型
2.)BigDecimal类型
1.)C#粉丝和Java粉丝
Boolean
可以为null。我发现这违反直觉。
BigDecimal
是一个库而不是语言功能。我对BigDecimal
和Exception
的困扰主要来自编写测试类,这些测试类必须跳过一堆箍才能完成实际的工作。我应该澄清我对这些事感到恼火,我不打算游说改变。
答案 43 :(得分:6)
的Python:
答案 44 :(得分:6)
的Groovy / Grails的
答案 45 :(得分:6)
答案 46 :(得分:6)
<强>的JavaScript 强>
函数对象语法:
f = new Function( "foo", "bar", "return foo+bar;" );
(它需要n个参数,第一个n-1 那么是函数的参数 nth是实际的函数,in 字符串形式。这真是太傻了。)
函数参数可以是 重复。
f = new Function( "foo", "foo", "return foo;" );
最后一次重复是唯一的重复 但是曾经使用过:
f( "bye", "hi" ) // returns "hi"
f( "hi" ) // returns undefined
E4X应该死了。我的用户是 总是抱怨它没有 以他们认为的方式工作。 当你需要一个页面时,让我们面对它吧 和一半的伪代码 塞特,是时候重新考虑事情了。
标准概念 stdin / stdout / stderr(和文件!) 会很好。
null!= undefined
必须处理这令人恼火 他们俩。有时它很有用, 但大多数语言都设法跛行 一个人很好。
答案 47 :(得分:6)
<强>的Python 强>
__init__
sys.modules[__name__]
)答案 48 :(得分:6)
ActionScript / AS3
否则它实际上是一种很好的语言 - 比JavaScript更好,与流行的看法相反,比PHP好一百万倍。
答案 49 :(得分:6)
<强> C#强>
这是一种很棒的语言,尤其是LINQ,但与C ++相比,泛型支持。它有很大的潜力,但目前的实现仅对强类型集合和类似的琐碎事物有用。它失败的一些例子:
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中:
head
和tail
这样的纯函数也可以调用error
并将您引导至IO
。fail
的Monad
- 带回MonadZero
。Num
班级 - (+)
应该在AdditiveGroup
或类似名称。Monad
不是Applicative
。答案 52 :(得分:6)
Perl 5的更多内容,从创建了大量Perl模块的人的角度出发,特别是在Moose上工作。
重载和绑定变量的可怕破碎。这两个功能都试图允许透明扩展内置类型。
它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说“永远不要将重载的对象传递给foo()方法”。这两种选择都不是真的可以接受。
缺少适当的钩子进入编译过程和元模型。如果Perl核心允许我们通过一个允许我们挂钩到元模型(包,类等)的合理API来影响编译过程,那么Moose,特别是角色使用可以变得更加安全。 p>
语言中缺少命名参数。相反,每个人都重新改造。这很烦人。
同样,缺少可选类型。我不想要静态语言,但是指定类型和约束的能力,特别是函数/方法参数,将是很好的。 Perl 6做对了。类型是可选的,但非常丰富,内置类型和用户定义类型之间没有根本区别。
向后兼容警察。这更像是一个文化问题。由于Perl 5对向后兼容性的强烈承诺,因此上述许多问题永远无法解决。因此,即使要添加某些东西,有效地取代当前的束缚和重载球,这些功能也永远不会被删除。当然,向后兼容性也是Perl 5的最大优势之一。
Bonus hate :Perl的内置异常机制是一个笑话。异常可能是一个字符串或对象这一事实使得异常的异常捕获代码永久存在,并且语言语法中缺少一个问题就是疣上的疣。
答案 53 :(得分:5)
我有一本书在SNOBOL中探索各种项目。第一章探讨了围绕SNOBOL编程和语言的历史和文化,并花了一些时间来讨论一个优秀的程序员喜欢一种语言,而不是因为它的缺陷,而是在中尽管。
我最喜欢的语言是Icon / Unicon。但仍有一些事情让我烦恼:
explode()
和implode()
。答案 54 :(得分:5)
<强> C ++ 强>
与char *和std :: string相关的库中的不一致。所有C ++库都应该使用std :: strings。
字符不是iostream的字节数。我做了很多面向字节的工作。具有“字节”类型和“字符”类型将显着地使其更简单。这也将允许更容易扩展到Unicode。
位操作在值上应该很容易。我应该能够访问和设置值的第n位,而无需播放和/或跳舞。
缺少GUI的标准化界面。这就是微软真正能够很好地利用C#定位的地方。 OS制造商提供的标准接口绑定对我的工作来说非常有用。
答案 55 :(得分:5)
<强> F#强>
类型推断是有限的。
它只向前传播。
F#不会尝试根据使用的方法和属性推断对象类型:当它没有线索时,你会得到“查找不确定对象类型”错误。
< / LI>不能混用浮点数和整数:1 + 2.3是类型错误。
为了定义monad或计算表达式,必须创建一个构建器对象有点尴尬。在Haskell或Scala中,您可以直接在monadic对象上定义monad操作。
虽然首选#light语法,但缩进规则有时不太直观或变得麻烦。
答案 56 :(得分:5)
PHP
例如:
您必须输入:
<?php
if($x == NULL)
{
?>
<p><?= $x . ' is null' ?></p>
<?php
}
?>
(不知道为什么SO再次将#5改为#1但是无论如何)
答案 57 :(得分:5)
C:
Lisp的:
答案 58 :(得分:5)
我的母语......虽然它听起来比克林贡语更美,但这是一个语法地狱......
答案 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
对于所有那些C-ish语言程序员来说,自我对我来说比这更有意义,因为对象指的是它自己
答案 63 :(得分:4)
的Python:
答案 64 :(得分:4)
Emacs Lisp
[1]当然,关于Lisp的一个美妙的事情是,用一行代码在你自己的代码中解决这些问题并不困难。仍然让我觉得它没有内置。
好问题;我有点尴尬,我无法想出更好的东西来讨厌,但老实说,你的荣誉,没有太多可恨。
答案 65 :(得分:4)
<强>自强>
答案 66 :(得分:4)
C#(嗯,部分是VisualStudio IDE,我猜):
Class<D>
派生自类型Class<B>
,也不能使用D
代替B
等协方差。 答案 67 :(得分:4)
DUAL
表。
无法GROUP BY
别名。
我永远不会记住分析函数的语法,所以我忘了/懒得使用它们。
缺少合并的LIKE
和IN
条件运算符。 (10g之后,有一个REGEX_LIKE
运算符可以解决这个问题。)
尴尬的连接语法。
SQL并不是我最喜欢的语言,但它是我每天使用的前三种语言之一。可能有更多项目,但这些是最重要的。
SQL*PLUS
我遇到了很多问题。我写了一个Perl替换,它从命令行执行我想要的操作,并在Emacs
中使用sql.el
进行交互式SQL
会话。这些工具可以帮助我解决SQL*PLUS
个问题。
说到:
“只有perl
才能解析Perl。” (但这主要是语法突出显示中的一个问题,我不喜欢对任何语言使用太多。)
我有时会对“简单(但偶尔令人惊讶)的规则感到惊讶......:它看起来像一个函数,因此它是函数,优先级无关紧要。” (来自perlfunc(1)
)
解除引用复杂的数据结构有时会让人感到困惑。我无法确定这是否是Perl的真正缺陷,或者仅仅是因为拥有非常强大的数据结构设施。无论哪种方式,我通常可以花几分钟思考我正在做的事情。
没有选项可以导致系统调用引发错误,例如DBI模块。 (感谢brian d foy,我现在知道CPAN上的autodie
模块是这样的,但我希望它内置。)
脚本中默认情况下未启用警告和限制。 (-e
选项会将它们关闭以供命令行使用。)
同样,必然会有更多的东西,但这些是我最近注意到的问题。我在=over
中添加了对=back
和L<...>
以及古怪POD
语法的需求,但也许这应该是一个单独的列表。
现在为三连胜:
使用参数获取文件会替换父脚本参数的值。 (执行. file arg1
将arg1
置于$1
。)
ksh
不是理想的交互式shell,默认为vi
键绑定,而不是emacs
。 (我的解决方案是使用bash
进行交互式shell。)
常用实用程序(例如grep
)在不同平台上的实现方式不同,从而妨碍了完美的可移植性。一些有用的命令需要在某些平台上安装,并且在其他平台上是OS核心的一部分。
条件语法过于沉重。 (if [ ... ]; then ... fi
)
虽然它是Turing Complete,但你最终还是希望转向像Perl这样更具表现力的语言。
#4的一个解决方案是习惯短路评估:
[ ... ] && ...
答案 68 :(得分:4)
d
array.length += 512;
在关联数组文字中找到的字符串文字被解释为静态,因此,由于长度不同的字符串文字,这个
char[][char[]] hash = ["hello":"world","goodbye":"angels"];
在没有额外的强制转换的情况下不起作用尽管
一个。我没有要求它被解释为静态数组
湾无论如何,关联数组中不允许使用静态数组
有人检查我这些;不确定它们是否仍然相关。
答案 69 :(得分:4)
<强>爪哇强>
答案 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)
答案 72 :(得分:4)
我无法相信,我最喜欢的Python宠儿仍未被提及:
(3.x之前)相对导入看起来像绝对导入。
import foo
这是从您所在的目录还是从sys.path导入foo?
grep
和find
(除其他外调试问题1)!幸运的是,有点。使用pip。Py3k修复了我的其他几个烦恼,例如坚持认为字符串是unicode,而8位字符的处理方式不同......
答案 73 :(得分:4)
C ++:
链接代码比编译代码更难。此外,要求模板在该翻译单元中拥有完整的源是荒谬的。它在那个其他文件中结束了......两秒前编译的那个。去看那里。愚蠢的编译器。
我的意思是,是的,在C ++ 0x中有std :: thread,但没有std :: socket或类似的东西。没有跨平台代码的主要原因是因为您必须为要在多个平台上执行的每个功能学习新库。如果没有作为标准提供的OS头文件或OS函数,C ++只适用于推动位。
double x,int y,char z = func();与void func一样有效(double x,int y,char z);.请。没有返回值重载的唯一原因是因为我们“可能”编写模糊代码。威力!当我真正写出含糊不清的代码时,请让我感到悲伤,而不是之前。
可以编译反射编译时间。它确实是。没有任何使得编写大量图书馆的工作充其量困难,并且严重惹恼了我。我可以滥用预处理器但是......
Yaargh。请,概念和正确的模板错误消息。使用像Boost这样的库几乎是不可能的,因为如果你弄错了,你就是在黑暗中拍摄。
答案 74 :(得分:4)
的Lua:
a += 20
这样的赋值操作符很痛苦--
)排除了增加/减少运算符前后的可能性答案 75 :(得分:3)
C / C ++
爪哇
的Python
答案 76 :(得分:3)
此处对C ++的另一次投票......仍然是我最喜欢的几个密切关注者--C和Python。这是我当前的仇恨列表,没有特别的顺序:
答案 77 :(得分:3)
Perl 5:
答案 78 :(得分:3)
.NET 框架(库)
MessageBoxButton
应为MessageBox.Button
)Rect
,Point
)System
命名空间Object.Equals
,Object.ReferenceEquals
,operator ==
,operator !=
,IComparable.CompareTo() == 0
)还有一个:
答案 79 :(得分:3)
<强> C#强>
我的大多数抱怨都与假设C ++约定自动成为C#
的最佳选择有关为 .NET (不是C#特定)
奖励一个答案 80 :(得分:3)
C#
答案 81 :(得分:3)
Objective-C / Cocoa / Cocoa Touch:
答案 82 :(得分:3)
Haskell(所有GHC扩展,而不仅仅是基本的Haskell'98规范)。
我讨厌它的一件事:它不是主流。
答案 83 :(得分:3)
我最喜欢的是C#,但C#已有很多答案,所以我会选择下一个“最爱”:
GO
语句,以及您需要它用于所有DDL / DML脚本编写的事实,以及它还会破坏事务语义的事实,这使得编写一个事务要困难得多原子脚本,你真的需要它来升级生产数据库。MERGE
语句必须以它结尾,WITH
语句必须以它开头......下定决心!WITH CHECK CHECK
/ WITH NOCHECK CHECK
。 UUUU - 甘氨酸DEFAULT
(甚至不要尝试使用NULL
)。与他们 真正可选的SP比较。答案 84 :(得分:3)
<强> TCL 强>
这是我几乎所有事情中最喜欢的语言。多年来,它已经(慢慢地,非常缓慢地)进化,以解决困扰我的大多数事情。语言非常灵活,很容易实现语法糖来覆盖仍然让我烦恼的事情。但是有一些关于语言的东西不能轻易改变只是打破它的禅宗:
数组(关联类型,Perl调用哈希)没有正确的值语义。这使得它们难以传递到函数并从函数返回。此外,这意味着它们不能嵌套。出于这个原因,dicts(词典)被发明但是太晚了,很好的数组访问语法:
$array($foo)
现在永远被愚蠢的数组用于向后兼容。我们现在坚持:
dict get $dict $foo
更冗长,对我来说感觉不那么可读。
没有真正的关闭。虽然它可以通过全局变量或命名空间进行一些模拟,但首先会破坏闭包的原因。虽然,我现在还不能真正看到如何在纯值语义系统中实现闭包。
与其他所有存储库工具相比,Teacup难以使用,并且完全不直观。这是比tcl-core更多的ActiveState错误,并且在编码时并没有真正破坏tcl的Zen,但它仍然非常烦人。
答案 85 :(得分:3)
C ++
(除了lambda函数,我已经避免了在Cpp0X中可用的东西)
答案 86 :(得分:3)
dialyzer(1)
发现
差异。动态类型是
也被认为是缓慢的; 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有gem
和rake
,RSpec。 Perl有CPAN。我不知道Erlang中的等价物。
少数Erlang特定工具非常奇怪。 Mnesia是一个很棒的数据库,但是来自SQL,你有很多值得学习的东西。与文档@spec
相同,后者有一种描述签名的奇怪方式。
当你只想要一点点变异时,功能范例通常会受到伤害。假设你想要一个哈希表,你不能像在Scheme或SML中那样破解它。 ets
和dets
减轻了一些痛苦,但并不多。
第六,奖金:
import
语句不同。所有这一切,Erlang是一种快乐^ _ ^
答案 88 :(得分:3)
<强> - [R 强>
不是我最喜欢的语言,但我经常使用它并且有很多抱怨...
lists
而S4类仍然将所有数据都暴露给用户<-
->
或=
,请参阅Mike Dewar's rant my.var
是一种非常令人困惑的OO语言变量命名约定,请参阅Google's style guide 答案 89 :(得分:3)
Scala是我最喜欢的语言。有五件事要讨厌?易:
需要很长时间才能正确学习。我知道你可以把Scala写成'更好的java'。这就是我们过去常说的关于C ++和C的内容。我同意这是语言深层思想的必然结果。但仍然......
方法与函数:def f(x: Int) = x*x
定义方法f,而不是函数f。尽管很多早期的Scala教程材料模糊了这种区别,但方法并不是函数。该语言也试图模糊它,因为如果你在某些的地方提供了一个方法,那里接受了一个函数。我们必须同时拥有方法和功能吗?是的,这是根本的。但它最初让我感到困惑。
以'蛋糕'模式从mixin中编写类或对象很容易产生NPE。例如trait X { val host: String; val url = "http://" + host }
是一个在实例化时是NPE的mixin,取决于它在类声明中的位置。编译器可以告诉您它是否会失败但不会。 (无论如何,在2.7中。)在复杂的继承图中很难诊断出问题。
2.8中的数组依赖于implicits与主要的scala集合类型进行网格划分。但是暗示并不适用于所有地方。可以在预期Array
的地方提供Seq
。但是,如果预期Option[Array]
,则无法提供Option[Seq]
。我知道没有完全“正确”的方法来处理java数组。
类型擦除。够了。
答案 90 :(得分:3)
C#。
我最讨厌的是:
没有多重继承 - 假设您可以提供与MVC相关的东西等任何GUI框架基类(Control,Window,等等)......框架/基类不可知!
没有“朋友”关键字...我知道,RAD - 受害者会滥用它来处理各种恶臭的代码和搞笑的渎职行为,但对于OOD来说,这对于执行法律是很好的。蒂美
没有语言集成的DBC功能,有合同,但我宁愿使用Spec# - 具有通用性的“!” - 后缀运算符
没有AOP(我不明白......这种语言有属性,在编译器中添加拦截代码就太容易了!)
没有弱事件委托 - 观察者模式只会变成现在的内存泄漏诱饵......: - (
答案 91 :(得分:3)
我讨厌所有语言的五件事(我至少知道):
答案 92 :(得分:2)
我使用Java,而我最大的优点是字符串操作效率低下。当你使用+运算符时。说真的,编译器不能弄清楚我要添加多少个字符串然后在后台为我生成StringBuffer的东西?
使用+的代码通常比StringBuffers操作序列更具可读性。
另外,我讨厌本机数组和集合框架之间的冗余。 .toArray()的语法非常难看。
答案 93 :(得分:2)
目标Caml
答案 94 :(得分:2)
的Python:
答案 95 :(得分:2)
方案:
答案 96 :(得分:2)
<强>的Lua 强>
我喜欢在Lua中编程,但这就是让我感到害怕的事情:
尽管所有这些我都会坚持认为Lua非常棒: - )
答案 97 :(得分:2)
方案
答案 98 :(得分:2)
<强> C ++:强>
答案 99 :(得分:2)
的Javascript;
答案 100 :(得分:2)
R(R-Project for statistics)
答案 101 :(得分:2)
<强>的Perl 强>
我喜欢这种语言,而且我不想添加已经使用过的东西,但是还没有人提到这个,所以我会把它扔到底池上。当我使用这个功能时,我发现它是我生命中最恐怖的经历(我使用汇编语言):
write()
和format()
函数。他们拥有可以想象的最糟糕,最丑陋,最可怕的语法,然而他们却无法为你提供任何更多的功能,而不是你已经实现的一些(无限更漂亮){{1工作。 没有人应该永远尝试使用这两个函数来做任何输出,只是因为它们有多糟糕。
我相信有人会不同意,但当我调查他们,希望他们能解决我的问题时,我发现他们是一个“痛苦的世界”(引用Big Lebowski),并希望Perl6有废除它们,或者更好地完全重写它们,使它们更有用和有用。
答案 102 :(得分:2)
C
编辑: 在考虑用于C的CPAN时,我想......我会称之为“ccan”,然后使用Google搜索,我发现了这个: http://ccan.ozlabs.org/
它似乎还处于起步阶段。
答案 103 :(得分:2)
因为我不能全职使用它,所以我要出去了,但我还是会尝试的!
Perl 6
前三个是语言;其余的不是语言本身,而是它还没有出来。
答案 104 :(得分:2)
<强> C 强>
答案 105 :(得分:2)
<强>的Python 强>
lambda
中没有陈述。 GRRRR foo( a for b in c if d )
感觉不对,每次我逃脱它都会让我感到惊讶。不应该是foo( (a for b in c if d) )
吗? yield
语句,就可以将一个函数神奇地转换为生成器,并且其界面完全改变。此外,该生成器在第一个next()
之前无法执行任何工作。至少,不是没有使用返回生成器的函数。<强>的JavaScript 强>
for each ( foo )
语法和行为感觉像是事后的想法。答案 106 :(得分:2)
VBA (因为您认为自己的语言不好)
答案 107 :(得分:2)
C#:
1)静态方法必须是类
的成员2)静态扩展方法只能添加到静态类
3)接口函数的实现没有标记为“覆盖”之类的东西,以显示它们来自基类或接口(这使得很难确保覆盖您期望的方法(具有正确的签名)代码审查)。
我只有3.我猜这很不错。
答案 108 :(得分:2)
的Python:
我仍然是python的温和用户,所以我的抱怨可能就是锁定知识或误用。欢迎评论。我喜欢这种语言。
我看到有人抱怨速度。我不明白。它是一种解释语言,代码直到运行时才编译到机器代码,这就是它的本质。您无法将解释语言的速度与编译语言进行比较。据我所知,在解释/脚本语言中,python并不慢。
答案 109 :(得分:2)
C ++ 缺乏良好的重构工具,缺少经过检查的异常
Java 缺少模板,缺少const
关键字
答案 110 :(得分:2)
PHP
更主观地说:
答案 111 :(得分:2)
Common Lisp
我想知道一个强类型的lisp会是什么样的
答案 112 :(得分:2)
<强> C#强>
dynamic
应解决大部分问题,但尚未发布。
答案 113 :(得分:2)
<强> C#强>
IComparable
与IEquatable
vs. IComparable<T>
vs object.Equals vs. operator ==等等。通过扩展,制作满足所有这些内容的自定义类型比必要的(特别是对于集合类)。显然,语言设计者意识到这一点,因此对于像linq,foreach和集合初始化器这样的事物的各种解决方法,它们通过形状而不是通过接口工作。const
)using
是一个有限但很有名的替代品!)答案 114 :(得分:2)
我在 Nemerle 中怨恨的五件事:
答案 115 :(得分:2)
<强> Clojure的强>
答案 116 :(得分:2)
Python ,再次:
没有切换关键字。不,字典不是它的替代品。甚至没有一堆elif
语句。
不一致的换行处理。我为什么要这样做:
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"}
不使用斜杠?
没有一种显而易见的方法可以做到这一点。 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
最糟糕的是,他们并没有完全同样的事情。有微妙的差异。
空格和制表符之间的选择。应该别无选择。选择,把它放在石头上并停止战斗。
你为什么这样做:
test = {}
test['foo'] = 0
但不是:
test = []
test[] = 0
P.S:" ".join(l)
是好人。停止抱怨它,它并不明显,但考虑到迭代器模式,这是正确的方法。
答案 117 :(得分:2)
Common Lisp
答案 118 :(得分:2)
的Haskell
有时类型系统感觉倒退。如果我不希望编译器为我的变量推断类型怎么办?如果我想要相反的话,它会对所述变量进行约束检查,该怎么办?例如,它不是推断列表元素的类型,而是确保它们都属于特定的类型类。这是一个微妙但巨大的差异,这使我很难编程UI。它可以完成,但它需要比其他语言更多的努力。 Haskell针对非UI部分进行了研究,但是我将UI留给了无类型的语言。
允许构建无限值有时会导致一些非常令人沮丧的错误。
NoMonomorphismRestriction。
Bytestring处理有时会让我陷入困境,直到你的程序崩溃,你才会知道它,因为你把它们混合得不正确。当我们丢失应该防止这种情况的类型信息时,这里出了点问题。
对于琐碎的案件,例如证人类型,应该自动派生类型类别,但是在那里滥用的可能性非常大。
答案 119 :(得分:2)
C#
我知道它很愚蠢,但我希望数据类型能够自行转换为我想要的内容,而无需添加(int)
或Convert.ToInt32
或其他任何内容。这会节省我的时间。令我很生气的是,如果我写了一些内容来输出int
,然后事实证明我需要一个long
,那么我经常需要通过改变我所做的一切来使其工作。就这样做吧!
抱歉,想不到五个,但我是新手,所以也许我会回来再添加更多:P
答案 120 :(得分:2)
我讨厌C ++的五件事
#define STR_LINE2(x) #x
#define STR_LINE(x) STR_LINE2(x)
#define LINE_NUMBER STR_LINE(__LINE__)
答案 121 :(得分:2)
<强> C ++ 强>
答案 122 :(得分:2)
关于C#:
答案 123 :(得分:2)
<强>的Python 强>
答案 124 :(得分:2)
PHP:
答案 125 :(得分:2)
Python
答案 126 :(得分:2)
EL - 表达式语言,JSP页面中的${...}
和#{...}
内容以及用于从底层Java代码中提取数据的JSF 2.0 Facelets。
答案 127 :(得分:2)
到目前为止,我最讨厌我最喜欢的语言的是我的选择不断改变。每次我认为我找到了 The One ,我发现了五件(或更多)我讨厌它的事情。然后那边的草看起来更绿......
答案 128 :(得分:1)
Python:数组部件选择不能满足您的要求。
a [1]给你一个元素
a [1:2]给你一个元素,而不是[a [1],a [2]]
a [1:3]给出2个元素
我讨厌这个,但也许那只是因为我主要在Verilog工作。
答案 129 :(得分:1)
C ++
答案 130 :(得分:1)
C#
爪哇
答案 131 :(得分:1)
的Python:
答案 132 :(得分:1)
红宝石:
答案 133 :(得分:1)
红宝石
答案 134 :(得分:1)
我觉得无法选择喜欢的语言。动态类型和静态类型无法进行比较,因此我将列出我使用的哪个
C ++:
::value
会使其更加简洁->.
为什么编译器无法确定我正在为ptr.thing
做->
而只为我做vector<vector<int>>
?vector<vector<int> >
必须是int[][]
让我感到紧张,然后每当我看到这行代码时我都无法集中注意力,而我最终想要找到一种方法来使用{{1 ;
的Python:
答案 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表达语言):
这些以及其他几个原因是为什么AutoDesk采用Python作为第二种脚本语言,这会带来一些令人讨厌的因素:
答案 137 :(得分:1)
C是我的最爱,但它也很可怕。
答案 138 :(得分:1)
<强> REBOL 强>
REBOL 是我最喜欢的语言中的。我不能说我有一个最喜欢的,虽然Haskell也很高。
它的奇怪语法在他们尝试尝试之前吓跑了许多开发人员。
use [email rules url] [] notify [ [ a@b.com http://www.google.com ] [ b@c.com http://www.yahoo.com ] ]; 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." ] ]
使用PARSE
非常容易验证递归方言,但很难评估。 (Stacks在这里很有帮助。)
BLOCK!
数据类型几乎可以完成XML所能做的所有事情。但是,现实世界中有XML。即将推出的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的:
答案 144 :(得分:1)
我的5 for Delphi:
答案 145 :(得分:1)
经过一番思考后重写了这个......
我讨厌PHP的五件事虽然我喜欢它(没有特别的顺序):
这些是令我烦恼的语言特征(或缺乏),但更大的问题是这些更多人/社区相关的事情:
许多使用PHP的人对一般的编程和良好实践一无所知并且产生非常混乱的代码。 JavaScript也存在同样的问题。
教授真正糟糕的做法和风格的大量教程/书籍。这可能是#3的主要原因。
它的声誉很差,主要是因为#3和#4。
答案 146 :(得分:1)
不得不假设我们有语言。我们呢?
答案 147 :(得分:1)
我对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#
答案 150 :(得分:1)
<强>的JavaScript 强>
来自ECMAScript 5规范:
7.6.1.2未来保留字:
class,enum,extends,super,const,export, 进口
在严格模式下:实现,让,私有,公共,接口,包,保护,静态,收益
好的,我有点喜欢最后一个,但这是7种令人困惑的
答案 151 :(得分:1)
VB .NET,但仅仅是因为VB6毒害了整整一代程序员
我在VB .NET商店工作,曾经是VB6商店,在这里工作的每个人都曾经是VB6开发人员,他们顽固地拒绝学习任何有关.NET的知识。他们编码好像它仍然是VB6,他们的应用程序就像VB6应用程序一样糟糕。我的老板积极劝阻任何使用LINQ,因为她担心别人难以理解,这是真的,因为没有人想要理解它。
我认为如果MS刚刚使用C#,我们会好起来的,这让我很难说,因为我觉得花括号远远不如VB的冗长结束语。
答案 152 :(得分:1)
红宝石。
答案 153 :(得分:1)
list.empty?
优于list.is_empty
甚至len(list) != 0
。同样,process.kill!
会优于process.kill
。 Ruby和lisp做对了。 dict.items
或dict.items()
? Ruby也是正确的。 答案 154 :(得分:1)
的Python:
没有标准的GUI工具包(社区围绕这个问题四处走动,但似乎永远不会解决任何问题)。
分发和安装Python应用程序和库的工具和方法的发展一直很糟糕。 (虽然最近这似乎正在接近修复。)
CPython仍然很慢,因为翻译人员去了(虽然PyPy现在看起来很不错,如果它成为“标准”Python,这个问题就会消失)。
你不能在没有覆盖很多方法的情况下对内置类(例如list和dict)进行子类化,即使你想做的只是一个事件的简单钩子(例如,钩住一个要添加到列表中或从列表中删除的项目,您需要覆盖 delitem ,追加,扩展,插入,弹出和删除 - 没有可子类化的“更改”事件通知,也没有任何“受保护”方法这是所有上述方法使用的公共代码的因素。)
直到virtualenv被发明为止,在一台机器上为不同目的保留单独的Python环境真是一件痛苦的事。
答案 155 :(得分:1)
Java - 不支持语言级别的作文
答案 156 :(得分:1)
爪哇:
答案 157 :(得分:0)
VB.NET
1)如果不是x是“foo”(而不是&lt;&gt;“foo”)
2)“OrElse”和“AndAlso”短路(而不是简单的“Or”和“And”,其行为不同)
3)没有(而不是空)
答案 158 :(得分:0)
C#中没有预处理器。
我知道他们把它遗弃了,因为有些人可以滥用它,但我认为他们把婴儿扔出洗澡水。代码生成被视为一件好事,在C ++中,预处理器是我的第一行代码生成器。
答案 159 :(得分:0)
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)
<强> 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)
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
path
- 类型模块被拒绝。([f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))]
)
答案 164 :(得分:0)
<强>的Lua 强>
答案 165 :(得分:0)
我刚刚发现在c#中创建Generic方法时我不能使用Enum作为类型约束。
微软已经解释了原因,但仍然如此。我是MAD
public static T MyFunc<T>(string arg) where T:Enum //wont work :(
答案 166 :(得分:0)
JavaFX的
答案 167 :(得分:0)
C#
Item o()
(如果有的话,自动处理)。答案 168 :(得分:0)
答案 169 :(得分:0)
的Python:
答案 170 :(得分:0)
我只有一个,但我相信值得分享。
CSharp / .NET
我们有Length属性来获取数组中的元素数,使用Count属性来获取集合中元素的数量。如果你考虑CLR自动将IList,ICollection,IEnumerable添加到场景背后基于零的一维矩阵的事实,这看起来更奇怪。
我相信CLR团队和BCL团队很难讨论这个问题;)
答案 171 :(得分:0)
Object Pascal:
这只是语言,标准库和片状IDE的遗憾理由值得拥有自己的列表。
答案 172 :(得分:0)
Objective-C 2.0
严格遵守语言和运行时,而不是库,而不是任何特定的顺序:
答案 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
的JavaScript
答案 176 :(得分:-1)
<强>的Python 强>
答案 177 :(得分:-1)
<强> VB.NET 强>
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)
从来没有自己的想法(每件事都是借来的)。
为大型数据集贪婪。
使用Java,但从未学过什么是对象。
窃取Perl,但将其隐藏在数据步骤中。
总是和统计人员说谎!
答案 181 :(得分:-7)
Perl代表了一种可怕的语言。