流行语言或库中最大的设计错误是什么?

时间:2009-02-12 05:23:11

标签: api programming-languages

对于我们每天使用的流行语言和库: 一些糟糕的设计,令人尴尬的API或一般糟糕的可用性的例子是什么?设计错误是我们必须付出的,因为它们会引入微妙的错误,我们必须使用笨拙的解决方法或记住不直观的方法来完成任务。

我特别想到的问题是:OO语言中的一个类实际上不应该从其他类继承。有一种特殊的操作符使得某种语言难以解析,并且结果证明它是未使用的。一个被错误命名或经常用于其他事物的函数(我正在考虑std::getline来标记字符串)。

正在寻找抨击语言的贡献,并声称Perl或其他语言设计得很糟糕。我更多地寻找具体的例子或关于显然本来应该采取不同的事情的轶事。 (也许设计师抓得太晚了,并试图在后续版本中修复它,但必须保持向后兼容性。)

12 个答案:

答案 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 );
  • 成功时,函数将转换后的整数作为int值返回。
  • 如果无法执行有效转换,则返回零值。

嗯,不幸的是,用这个函数转换“0”是很痛苦的,因为你从来不确定它是错误还是“0”。

答案 5 :(得分:2)

Java“Calendar”API。它容易出错且难以使用。

列举一些问题:

  • 误导性名称:一个Calendar对象应该为“日历系统”建模,但实际上封装了一个时间对象,即它是一种Date(这本身就是一个问题,因为Date应该更好地命名为DateTime或TimeStamp )
  • 只有一个Calendar(GregorianCalendar)的具体子类,但抽象的Calendar类包含仅在这种特定情况下有用的常量(JANUARY,MONDAY,AM_PM,ERA)
  • 使用常量修改字段(“MONDAY”,“WEEK_OF_MONTH”等);这些是整数,可以很容易地混淆。
  • 实际上,几乎每个参数和返回值都是一个整数;适用基于0和1的数字的常见问题(1月0日或1月?=
  • 像“HOUR”和“HOUR_OF_DAY”这样的常量只有在使用AM / PM系统时才有意义(无论如何,美国以外的人都无法理解; - )

答案 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这样的错误名称。