有没有人用这种方式设计api或库代码?

时间:2010-01-22 19:40:07

标签: class pseudocode api-design method-chaining

我正在阅读有关如何设计图书馆或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而不仅仅是一个爱好项目 - 一个专业的软件包,可以做一些小而且做得很好的

有没有人发现这种方法有任何严重的缺点?

我认为一个真正的好处强迫您先写下您的用例

另一件事是名词和动词保持简单,使你的最终产品能够躲避 MultiPhraseAbstractParadigmDesignPatternImplementor 综合症:-D

4 个答案:

答案 0 :(得分:3)

这是一种相当常见的设计模式,称为fluent interface。它在函数式语言中很常见,并且在其他地方越来越受欢迎。我第一次在Scheme中看到它。

这是一个非常方便和可读的习惯用法,但请记住,在一次函数调用中,实际上通常会想要初始化多个变量。例如,当必须根据数据组合设置内部状态时,或者设置和覆盖默认值的代价很高时。因此,正如所有“模式”一样,谨慎使用并且经过深思熟虑。

答案 1 :(得分:1)

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()
      }
   }
};

答案 2 :(得分:0)

是的,这就是jQuery的设计方式,它总是最终返回自己,这样你就可以链接这样的方法。

答案 3 :(得分:0)

我倾向于从空类和方法开始。这真的是自上而下与自下而上设计的问题。

我真的更喜欢巨大的白板素描。