Qual é a definição de “método acessador”?
-
05-07-2019 - |
Pergunta
Tenho discutido sobre o uso da palavra "acessador" (o contexto é programação Java).Tenho tendência a pensar nos acessadores como sendo implicitamente "acessadores de propriedade" - isto é, o termo implica que eles estão mais ou menos lá para fornecer acesso direto ao estado interno do objeto.A outra parte insiste que qualquer método que toque o estado do objeto de alguma forma é um acessador.
Eu sei que vocês não conseguem vencer a discussão para mim, mas estou curioso para saber como vocês definiriam o termo.:)
Solução
Pelos acessores, eu tendem a pensar em getters e setters.
Ao insistir que todos os métodos que tocam o estado interno do objeto são acessadores, parece que qualquer método de instância que realmente usa o estado do objeto seria um acessador e que simplesmente não parece certo. Que tipo de método de instância não usará o estado do objeto? Em outras palavras, Um método de instância que não usa o estado do objeto de alguma forma não deve ser um método de instância para começar - deve ser um método de classe.
Por exemplo, deve o BigDecimal.add
Método ser considerado um acessador? É um método que lerá o valor da instância que o add
o método foi chamado, depois retornar o resultado após adicionar o valor de outro BigInteger
. Parece bastante direto que o add
O método da instância não é um getter nem um setter.
Outras dicas
Um método de acessador faz exatamente o que diz na lata: acessa algum estado a partir do tipo sem efeitos colaterais (além da instanciação preguiçosa, talvez, o que não é algo que o chamador normalmente saberia).
private int _age;
public int getAge()
{
return _age;
}
Os métodos que modificam o estado são considerados mais úteis (na minha opinião) como mutadores.
Além do Google e da Wikipedia, o Especificação da linguagem Java Mostra isso como um exemplo de método acessador:
private static int N;
public static int getN() { return N; }
Então, sim, eu diria que isso obtém o valor de um campo. O compilador pode incluir isso, convertendo -o em uma leitura simples, portanto, algo mais do que isso provavelmente não é um acessador.
Métodos de acessórios: GetGreen e GetBlue
Esses métodos geralmente acessam um valor.
Métodos do mutador: Setred, setGreen, SetBlue
Um mutador vai mudar um valor
Eu sempre fui pela primeira definição. Portanto, geralmente isso se aplica apenas a getters e setters. Se seguirmos o segundo método, é uma distinção muito menos útil, pois isso abrange quase todos os métodos.
Métodos de acesso são usados para acessar campos de um objeto.Portanto, getters e setters são métodos acessadores. Método observador é o termo certo para um método que faz uma observação mais geral sobre um objeto, sem causar efeitos colaterais observáveis externamente.Um método cujo objetivo principal é causar efeitos colaterais é um método mutador.Portanto, os setters são um exemplo de um método mutador.Para boas práticas de engenharia, os setters públicos devem ser evitados porque tornam impossível para uma classe impor invariantes nos seus dados:eles violam a barreira de abstração que uma classe normalmente deveria impor.
É bom poder diferenciar getters e setters em conversas técnicas. Accessor
Métodos são parceiros para modifier
métodos. Accessor
s leia o estado de um objeto (getA()
), enquanto modifier
s escrever o estado (setA(Object)
).
A method that provides access (can be 'read access' or 'write access') to the internals of an object is an 'accessor method'.
The authors here certainly uses it in this manner:
I think the term may originate from Common Lisp (doesn't everything?) -- with setf used to modify the value of accessor slots.