【问题标题】:Does anyone design api or library code in this way?有没有人以这种方式设计 api 或库代码?
【发布时间】: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

【问题讨论】:

    标签: class pseudocode api-design method-chaining


    【解决方案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】:

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

          不过,我真的更喜欢巨大的白板草图。

          【讨论】:

            猜你喜欢
            • 2020-03-11
            • 1970-01-01
            • 2021-06-06
            • 1970-01-01
            • 2014-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多