Combinando getters e setters

16

Bibliotecas JavaScript como jQuery, combinam 'getters' e 'setters' na interface de programação, por exemplo:

 $('element').css({'color','blue'});

irá definir a cor ou

 $('element').css();

receberá o css para um elemento.

Existe um nome para esse padrão e é uma boa prática usar em aplicativos?

yannis
fonte

Respostas:

12

Martin Fowler recentemente nomeou-o Sobrecarregado getter e setter neste artigo :

Estive bisbilhotando Javascript recentemente e uma coisa que me impressionou é o hábito de usar o mesmo nome de função para um getter e um setter. Portanto, se você deseja descobrir a altura do seu banner no jQuery, você usaria $("#banner").height()e se deseja alterar a altura que você usaria $("#banner").height(100).

Essa convenção é familiar para mim, pois foi usada pelo Smalltalk. Você pode obter um valor com banner heighte alterá-lo com banner height: 100. Saber que era uma convenção de conversa fiada é suficiente para esperar que eu goste, já que tenho um amor distante, mas permanente, por esse idioma. Mas mesmo as melhores coisas têm falhas, e não posso esconder minha aversão por esse estilo de codificação ...

Apesar dessa preferência, você precisa seguir as convenções do idioma com o qual está lidando. Se eu estivesse escrevendo Smalltalk novamente, ainda usaria height:100para manter a consistência com as convenções do idioma. Javascript, no entanto, não é conhecido por ter convenções fortes, então aqui eu preferiria evitar essa convenção, mesmo que seja usada pelo jQuery ...

louisgab
fonte
1
Embora eu normalmente concorde com a maior parte do que Fowler diz, discordo de sua antipatia por isso. Seu raciocínio é que o JavaScript não possui convenções fortes como o Smalltalk, o que o torna utilizável lá. No entanto, o jQuery tem convenções fortes e o JavaScript não é o jQuery. jQuery é uma estrutura.
CaffGeek
@ Chad, eu tenho que discordar da sua leitura disso. Seu argumento é que falta explicitação e consistência. Ele diz que o usa no Smalltalk porque a consistência com outros supera suas preocupações. Ele não está argumentando que as convenções de Smalltalk de alguma forma atenuam ou eliminam o problema.
Winston Ewert 21/09
2

É chamado de "sobrecarga de método" em idiomas OO ou "sobrecarga de função" em idiomas não OO.

Se as boas práticas são ou não um tema de quase tanto debate quanto getters / setters vs. membros do público. Aqueles do lado positivo e negativo provavelmente cortam os dentes em idiomas que tinham esse recurso ou não tinham e estão definidos em seus caminhos. Eu o uso e gosto da prática por vários motivos:

  • O contexto em que é usado muito bem separa um do outro.
  • Anexar getou setao nome do método adiciona verbosidade.
  • Se houver vários getters (por exemplo, um para inte outro para double), alterar o tipo no LHS de uma atribuição ( int x = foo.bar()vs. double x = foo.bar()) não requer uma alteração de código ( barAsInteger()vs. barAsDouble()) no lado direito, se a classe fornecer ambos. O lado negativo disso é que, em algum momento, pode ser difícil saber exatamente qual método está sendo chamado apenas olhando o código.
Blrfl
fonte
Também é chamado de "sobrecarga de função" em C ++.
DeadMG
Ambos os termos se aplicam ao C ++ porque ele possui métodos e funções simples.
Blrfl 22/09
1

Como o JavaScript não possui propriedades reais (onde a definição de um valor pode realmente executar código), o padrão é aquele que implementa o idioma da propriedade. (Mesmo se você chamar outra coisa.)

Portanto, nas linguagens que implementam propriedades reais, você faria isso:

element.css = ...
x = element.css

Se você usasse o padrão JavaScript em um idioma que lida com propriedades, estaria fazendo algo anormal. Provavelmente não seria uma boa ideia. Manipule as propriedades da maneira como o idioma as manipula, para não confundir as outras pessoas que trabalham com você.

John Fisher
fonte
"onde definir um valor pode realmente executar código". Isso não é mais verdade. Faz parte das especificações desde o ECMA 5
Demian Brecht 21/09
@Demian: Mas, JQuery funciona em navegadores que não implementar ECMA 5.
John Fisher
Não mencionei nada sobre compatibilidade entre navegadores, apenas que a citação está incorreta conforme escrita.
Demian Brecht 21/09
@ Demian: O texto "JavaScript não possui propriedades reais" está correto se você presumir que está usando as versões mais comuns disponíveis do JavaScript. Como estamos discutindo dentro de um contexto de implementação do JQuery, a instrução estaria correta. Obrigado por apontar que as versões mais recentes do JavaScript têm propriedades verdadeiras.
John Fisher
0

Acho que você está procurando properties

thekip
fonte
Esse é o nome da funcionalidade fornecida em C # (e talvez em outras linguagens .NET?) Semelhante a isso, mas não é a mesma coisa.
Thomas Owens
A Wikipedia concorda, no entanto: en.wikipedia.org/wiki/Property_(programming)
thekip
Obrigado, não é realmente você pode ter um caso digamos que você definir ou obter um salário pessoas em um aplicativo person.salary('10000')ou person.salary()ou similar.
yannis
1
Eu não vejo como. "As propriedades são lidas e gravadas como campos", o que não é verdade no exemplo da postagem original. Lá, chamadas explícitas de método são feitas. É muito parecido, mas não exatamente o mesmo.
Thomas Owens
1
@yannis Isso não está correto. JavaScript tem uma sintaxe para propriedades e não é o que você descreveu na pergunta original. Consulte en.wikipedia.org/wiki/Property_(programming)#JavaScript para saber como implementar e usar propriedades em JavaScript.
Thomas Owens
0

Sou totalmente contra isso por uma razão simples: uma classe, método ou função deve fazer apenas uma coisa - na minha opinião, e combinar o método gettere setterviolará essa regra. Como resultado:

  1. O returnvalor da função varia de acordo com a execução do getter ou bloco do setter . Este pode simplesmente levar você a um pesadelo de manutenção. Seu método deve retornar apenas um tipo de dados / objeto, em qualquer caso - ou o retorno null, falseou lançar uma exceptionem caso de erro.
  2. Escrever testes de unidade será mais difícil, pois a função é responsável por duas funcionalidades totalmente diferentes.
  3. Escrever documentação para esse método ou função é mais difícil por razões óbvias.
  4. Não será consistente quando vários métodos getter forem necessários - como já mencionado na Blrflresposta.
Mahdi
fonte