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

Api 流行语言或库中最大的设计错误是什么?,api,programming-languages,Api,Programming Languages,对于我们每天使用的流行语言和库: 什么是一些糟糕的设计、令人尴尬的API或通常糟糕的可用性的例子?我们必须为设计错误付出代价,因为它们引入了微妙的错误,我们必须使用笨拙的变通方法或记住不直观的方法来完成事情 我特别考虑这样的问题:OO语言中有一个类不应该继承另一个类。有一个特殊的操作符使得某种语言很难解析,结果证明它是未使用的。一个命名错误的函数,或者经常用于它设计目的以外的其他用途(我想用std::getline来标记字符串) 我不是在寻找bash语言的贡献,也不是说Perl或其他语言的设计很

对于我们每天使用的流行语言和库: 什么是一些糟糕的设计、令人尴尬的API或通常糟糕的可用性的例子?我们必须为设计错误付出代价,因为它们引入了微妙的错误,我们必须使用笨拙的变通方法或记住不直观的方法来完成事情

我特别考虑这样的问题:OO语言中有一个类不应该继承另一个类。有一个特殊的操作符使得某种语言很难解析,结果证明它是未使用的。一个命名错误的函数,或者经常用于它设计目的以外的其他用途(我想用
std::getline
来标记字符串)

我不是在寻找bash语言的贡献,也不是说Perl或其他语言的设计很糟糕。我更多的是寻找一些具体的例子或轶事,这些事情显然应该有所不同。(也许设计人员发现它太晚了,并试图在后续版本中修复它,但必须保持向后兼容性。)

名为“NullPointerException”的Java类

从C++到java迁移,我总是觉得在java语言的URL类中(或是几年前)在确定URL对象的哈希代码时,发现一个语言中有一个Null PoExtExchange异常,它是“没有指针”< /P> < P> Java的URL类确实做了(或做了几年前)的DNS查找。因此,不仅URL作为键的哈希表速度非常慢,而且如果两个连续的DNS请求返回不同的值或者您拔掉网络电缆,它在运行时也会发生变化

跳到大约40分钟,他谈到了Java中的一些XMLAPI


总的来说,这是一个非常有趣的演讲。

我最喜欢的来自Smalltalk的世界。具体来说。在Squeak中,信号量类从LinkedList继承。信号量可以使用链表,但它们本身不是链表。这就形成了一个非常奇怪的界面。这是一个可怕的面向对象设计。

API,当函数返回空项时函数返回null,然后不记录何时、如何、或为什么返回空。

< P>大多数C++是设计缺陷,但大多数人都学会了用它来生存。[大量反对者投反对票的鸭子]

我在Ruby的Dir.glob()中找到了一个

我还无法证明它与我的特定环境无关,因为我的环境很旧,而且是手工拼凑的,不幸的是,我需要继续支持它。似乎至少有5种情况:

  • 目录中有文件和一些匹配->这些文件的列表
  • 目录中有文件且无匹配->空列表
  • 目录为空->无
  • 目录存在,但当前用户无法读取它(不知道这里发生了什么)
  • 目录丢失(也没有测试过)

它让我毛骨悚然,因为文档没有这样描述它。

Java中的检查异常与未检查异常。大多数Java开发人员要么不知道何时使用哪个,要么,如果他们知道,他们不同意


然后我们有一些东西,比如
IOExeption
,当它们出现时,你永远无法处理它们,但必须扔掉它们(在所有意义上)。当您最终到达一个可以处理它们的地方时,您不知道如何找出可能导致它们的原因,因此您只能向用户提供消息和堆栈跟踪,并希望用户能够找到它(这里的“她”是知道Java是一种咖啡的普通用户)。

PHP有很多这样的原因,例如($Pineder,$haystack)($haystack,$Pineder)不一致。 字符串函数的前缀为mb_uu,用于启用多字节支持。 我最喜欢的mysql\u escape\u字符串和mysql\u real\u escape\u字符串。。。
让我们不要开始OO部分…:)

我个人最喜欢的是C标准库的atoi

int atoi ( const char * str );
  • 成功时,函数将转换后的整数作为int值返回
  • 如果无法执行有效转换,则返回零值
不幸的是,用这个函数转换“0”很痛苦,因为您永远无法确定它是错误还是“0”。

Java“Calendar”API。它容易出错,而且很难使用

仅列举几个问题:

  • 误导性的名称:日历对象被认为是“日历系统”的模型,但实际上它封装了一个时间对象,即它是一种日期(这本身就是一个问题,因为日期最好命名为DateTime或TimeStamp)
  • Calendar只有一个具体的子类(GregorianCalendar),但抽象Calendar类包含的常量仅在这种特定情况下有用(一月、星期一、上午、下午、纪元)
  • 您可以使用常量修改字段(“星期一”、“每月的星期”等);这些是整数,很容易混淆
  • 事实上,几乎每个参数和返回值都是整数;基于0和1的数字通常会出现问题(1月是0还是1=
  • 只有在使用AM/PM系统时才有意义的常数,如“HOUR”和“HOUR\u OF_DAY”(美国以外没有人理解;-)

在Java中,我认为InterruptedException是一个检查过的异常。如果你需要知道你的sleep方法醒得很早,那应该是该方法返回的一个布尔值。没有什么比InterruptedException更能给检查过的异常起坏名字了。

这是否与?主观,我敢说可能是火焰诱饵?Subject/arg:标记为关闭,因为它不是社区wiki,建议用于投票类型的问题,因为没有正确的答案。这不仅仅是主观的。如果它适用于特定的语言或库,这可能是一个好问题。我刚刚检查了Java 5:hashCode()最终调用InetAddress.getByName(主机)…OMFG关于向后兼容性问题,我认为这将像这样持续一段时间,这是一个真正的错误