有没有人以这种方式设计 api 或库代码?
Posted
技术标签:
【中文标题】有没有人以这种方式设计 api 或库代码?【英文标题】:Does anyone design api or library code in this way? 【发布时间】:2011-01-08 08:42:33 【问题描述】:我正在阅读一些关于如何设计好库或 API 的内容,并偶然发现了 Joshua Bloch 在 Google Tech Talks 上的精彩演讲。现在,虽然我离专业的 API 开发人员还差得很远,但我认为编写一堆类/函数是相似的,尽管同一件事的缩小版 - 动作的明确分离,易用性和令人愉悦的使用,鼓励干净的代码等。
我浏览了一些广泛使用的开源 Java 代码并得到了这个想法(没有什么新鲜的,只是把它清楚地提出来......)
让我们举一个例子伪代码(或可能一些BASIC方言):
1. new label
2. set name 'hello world'
3. set color 'blue'
4. show 'topmost'
5. on click hide
现在受到 Java 代码的启发,我希望能够像这样做一些事情:
1. Label l = new Label()
2. .setName('Hello World')
3. .setColor('blue')
4. .show(zindex.top);
5. l.onClick = l.hide() ;
我的问题是: 有其他人从这样的伪代码开始设计 API 吗?
小东西是个好主意吗?说最多 10 个类,每个类可能有 10 个方法,每个方法里面的代码不超过 5-6 行。这显然只是一组粗略的数字,用于显示要设计的类的大小 - 远不及完整的 API,而不仅仅是一个爱好项目 - 一个专业的包,做一些小事但做得很好 em>。
有没有人发现这种方法有任何严重的缺陷?
我认为一个真正的好处是它迫使你首先写下你的用例。
另一件事是名词和动词保持简单,使您的最终产品能够避开MultiPhraseAbstractParadigmDesignPatternImplementor综合症:-D
【问题讨论】:
【参考方案1】:这是一种相当常见的设计模式,称为fluent interface。它在函数式语言中很常见,并且在其他地方越来越受欢迎。我第一次看到它是在 Scheme 中。
这是一种非常方便且易读的习惯用法,但请记住,有时您确实希望在单个函数调用中初始化多个变量。例如,当必须根据数据组合设置内部状态时,或者当设置和覆盖默认值代价高昂时。因此,与所有“模式”一样,请谨慎使用并深思熟虑。
【讨论】:
【参考方案2】:Jquery 正是这样做的。来自http://net.tutsplus.com/tutorials/javascript-ajax/jquery-1-4-released-the-15-new-features-you-must-know/:
jQuery('<div/>',
id: 'foo',
css:
fontWeight: 700,
color: 'green'
,
click: function()
alert('Foo has been clicked!');
);
或对于 1.4 之前的版本:
jQuery('<div/>')
.attr('id', 'foo')
.css(
fontWeight: 700,
color: 'green'
)
.click(function()
alert('Foo has been clicked!');
);
我在 C# 中用代码生成 WPF 也做过类似的事情:
new StackPanel
Children =
new TextBlock Text = "Hi there", Width = 50 ,
new TextBox Width = 100 ,
new Border
Content = new ListBox()
;
【讨论】:
【参考方案3】:是的,这就是 jQuery 的设计方式,它总是最终返回自己,以便您可以像这样链接方法。
【讨论】:
【参考方案4】:我倾向于从空的类和方法开始。这确实是自上而下与自下而上设计的问题。
不过,我真的更喜欢巨大的白板草图。
【讨论】:
以上是关于有没有人以这种方式设计 api 或库代码?的主要内容,如果未能解决你的问题,请参考以下文章
使用 UI 编辑 MS Office 或 Open Office 文件的 Java API 或库
在 Linux 中是不是有 API、接口或库来访问电力硬件以获取状态、健康和历史数据? [关闭]