对于我们每天使用的流行语言和库: 一些糟糕的设计,令人尴尬的API或一般糟糕的可用性的例子是什么?设计错误是我们必须付出的,因为它们会引入微妙的错误,我们必须使用笨拙的解决方法或记住不直观的方法来完成任务。
我特别想到的问题是:OO语言中的一个类实际上不应该从其他类继承。有一种特殊的操作符使得某种语言难以解析,并且结果证明它是未使用的。一个被错误命名或经常用于其他事物的函数(我正在考虑std::getline
来标记字符串)。
我不正在寻找抨击语言的贡献,并声称Perl或其他语言设计得很糟糕。我更多地寻找具体的例子或关于显然本来应该采取不同的事情的轶事。 (也许设计师抓得太晚了,并试图在后续版本中修复它,但必须保持向后兼容性。)
答案 0 :(得分:6)
在确定URL对象的hashCode时,Java的URL类(或几年前)确实进行了DNS查找。因此,不仅将URL作为键的哈希表非常慢,而且如果两个连续的DNS请求返回不同的值或者拔掉网络电缆,它可以在运行时更改!
答案 1 :(得分:4)
Java类名为“NullPointerException”
从C ++迁移到Java后,我发现在使用“无指针”的语言中找到NullPointerException很有趣
答案 2 :(得分:2)
大多数C ++都存在设计缺陷,但大多数人都学会接受它。 [大量仇敌的鸭子downvotes]
答案 3 :(得分:2)
PHP有一大堆它们,($ needle,$ haystack)($ haystack,$ needle)不一致。 该字符串以mb_为前缀,以启用多字节支持。 我最喜欢的mysql_escape_string和mysql_real_escape_string ...... 让我们不要开始OO部分...... :)
答案 4 :(得分:2)
我个人最喜欢的是C标准库的atoi
。
int atoi ( const char * str );
嗯,不幸的是,用这个函数转换“0”是很痛苦的,因为你从来不确定它是错误还是“0”。
答案 5 :(得分:2)
Java“Calendar”API。它容易出错且难以使用。
列举一些问题:
答案 6 :(得分:1)
我的最爱来自Smalltalk的世界。 Squeak具体而言。在Squeak中,Semaphore类继承自LinkedList。信号量可以使用链表,但它们本身不是链表。这使得一个非常奇怪的接口。这是糟糕的OO设计。
答案 7 :(得分:1)
API函数在返回空项时返回null ...然后不记录它们何时,如何或为什么返回null。
答案 8 :(得分:1)
Java中的已检查与未检查的异常。大多数Java开发人员要么不知道何时使用哪个,要么他们不同意。
然后我们有像IOExeption
这样的东西,当它们发生时你永远无法处理它们但是必须把它们抛出(在所有的意义上)。当你最终到达一个你可以处理它们的地方时,你不知道如何找出可能导致它们的原因,所以你只能向用户展示消息和堆栈跟踪,并希望她能弄明白(这里“她“是知道Java是一种咖啡的普通用户。”
答案 9 :(得分:0)
http://www.infoq.com/presentations/effective-api-design
跳到大约40分钟,他谈到了Java中的一些XML API。
总的来说,这是一个非常有趣的演示文稿。
答案 10 :(得分:0)
我在Ruby的Dir.glob()中找到了一个。
我还没能证明它与我的特定环境无关,因为我的环境已经陈旧并且手工拼凑在一起,我不得不继续支持它。似乎至少有5个案例:
让我把头发拉出来,因为文档没有这样描述。
答案 11 :(得分:0)
在Java中,我将使用InterruptedException作为已检查的异常。如果你需要知道你的睡眠方法提前醒来,那应该是从方法返回的布尔值。没有什么能给已检查的异常提供像InterruptedException这样的错误名称。