有没有人以这种方式设计 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、接口或库来访问电力硬件以获取状态、健康和历史数据? [关闭]

“日期”给出编译器错误“找不到项目或库”(VB6)

我仅在某些 Excel 2010 版本中收到“编译错误:找不到项目或库”。很难测试这个

为 Android 制作可再发行组件或库