最近,我一直在开发自己的API,随着对API设计的投入,我一直对如何改善API设计非常感兴趣。
出现了几个方面(不是我的API用户使用,而是在我对该主题的观察讨论中):一个人应该只通过查看调用API的代码来知道它在做什么。
foo.update_pinned(true, true);
仅仅通过查看代码(不知道参数名称,文档等),就无法猜测它会做什么-第二个参数是什么意思?建议的改进措施如下:
foo.pin()
foo.unpin()
foo.pin_globally()
这就清除了一切(我猜第二个参数是是否全局固定foo),在这种情况下,我同意后者肯定会有所改进。
但是我相信,在某些情况下,设置不同但与逻辑相关的状态的方法最好作为一个方法调用而不是单独的方法公开,即使您仅通过查看代码也不知道它在做什么。(因此,您必须求助于参数名称和文档以查明-如果我不熟悉API,我个人将始终这样做)。
例如,我SetVisibility(bool, string, bool)
在FalconPeer上公开了一种方法,并且我承认只看了一下这一行:
falconPeer.SetVisibility(true, "aerw3", true);
您将不知道它在做什么。它设置了3个不同的值来控制falconPeer
逻辑上的“可见性” :仅接受接受密码的加入请求,然后回复发现请求。将其分为3个方法调用可能会导致API的用户设置“可见性”的一个方面而忘记设置其他设置,而我仅通过公开一种方法来设置“可见性”的所有方面而迫使他们考虑。此外,当用户想要更改一个方面时,他们几乎总是会想要更改另一个方面,现在可以在一个呼叫中进行更改。
setSize(10, 20)
不如setSize(width=10, height=20)
或可读random(distribution='gaussian', mean=0.5, deviation=1)
。在具有强制命名参数的语言中,布尔值可以传达与使用枚举/命名常量完全相同的信息量,因此它们在API中可能是很好的。
update
方法:foo.update(pinned=true, globally=true)
。或:foo.update_pinned(true, globally=true)
。因此,对您的问题的回答也应考虑语言功能,因为针对语言X的良好API可能对语言Y不利,反之亦然。