Pergunta

Eu estava lendo algumas coisas sobre como projetar bem uma biblioteca ou API e tropeçaram na grande conversa de Joshua Bloch nas palestras do Google Tech. Agora, embora eu não esteja nem perto de um desenvolvedor profissional de API, acho que programar várias classes/funções é uma versão semelhante, embora muito reduzida da mesma coisa-separação clara de ações, facilidade e uso agradável, incentivando o código limpo , etc.

Eu estava passando por algum código Java de código aberto amplamente usado e consegui essa ideia (nada de novo, mas apenas colocando -o lucidamente ...)

Vamos dar um exemplo pseudo-código (ou pode ser algum dialeto do básico):

1. new label
2. set name 'hello world'
3. set color 'blue'
4. show 'topmost'
5. on click hide

Agora inspirado no código Java, eu gostaria de poder fazer algo assim:

1. Label l = new Label()
2.          .setName('Hello World')
3.          .setColor('blue')
4.          .show(zindex.top);
5. l.onClick = l.hide() ;

Minha pergunta é a seguinte:
Alguém mais projeta APIs a partir de pseudo-código como este?

É uma boa ideia para algo pequeno? Diga até 10 classes, cada uma com talvez 10 métodos, cada método não mais de 5-6 linhas codificando dentro dele. Obviamente, isso é apenas um conjunto aproximado de números para mostrar o tamanho das classes a serem projetadas - nem perto de uma API completa e não apenas um projeto de hobby - um pacote profissional que faz algo pequeno, mas faz bem.

Alguém encontrou alguma desvantagem grave para essa abordagem?

Eu acho que o um benefício real É isso força você a escrever seus casos de uso primeiro.

A outra coisa é que o substantivos e verbos permanecem simples, permitindo que seu produto final evite o MultiPHRASEABSTRATPARADIGMDESIGNPATTERNIMPLEMENTOR Síndrome: D

Foi útil?

Solução

Este é um padrão de design bastante comum chamado A interface fluente. É comum em idiomas funcionais e está ganhando popularidade em outros lugares. Eu vi pela primeira vez no esquema.

É um idioma muito conveniente e legível, mas lembre -se de que muitas vezes haverá momentos em que você realmente deseja inicializar mais de uma variável em uma única chamada de função. Por exemplo, quando há estado interno que deve ser definido, dependendo de uma combinação de dados ou quando a configuração e substituição dos valores padrão é caro. Assim, como em todos os "padrões", use criteriosamente e com premeditação.

Outras dicas

JQuery faz exatamente isso. A partir de 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!');  
    }  
}); 

ou para pré-1.4:

jQuery('<div/>')  
   .attr('id', 'foo')  
   .css({  
       fontWeight: 700,  
       color: 'green'  
   })  
   .click(function(){  
       alert('Foo has been clicked!');  
   });  

Eu também fiz coisas semelhantes no C# gerando wpf no código:

new StackPanel {
   Children = {
      new TextBlock { Text = "Hi there", Width = 50 },
      new TextBox { Width = 100 },
      new Border { 
          Content = new ListBox()
      }
   }
};

Sim, é assim que o jQuery é projetado, ele sempre acaba retornando para que você possa encadear métodos como esse.

Costumo começar com classes e métodos vazios. É realmente uma questão do design de cima para baixo vs de baixo para cima.

Eu realmente prefiro um enorme esboço de quadro branco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top