Accessors contra membros públicos
Pergunta
Eu tenho uma classe com um monte de built-in tipo membros com acesso de leitura / gravação. Devo fazê-los membros do público e fornecer obter / definir métodos para cada um? Como cerca de estruturas?
Solução
Se houver invariantes você precisa preservar, então sim. Caso contrário, não se incomode.
Outras dicas
Toda a razão de ter acessores (getters) e modificadores (setters) é fornecer-se com um nível extra de engano.
Este nível extra de engano permite que você forneça uma leitura única exibição da sua variável de uma interface pública, embora não permitindo que o seu membro de dados a serem alterados. Você ainda pode usar um setter privada ou protegida.
Setters permitir que você faça a verificação de erros especial, validação e correções quando um valor é definido. Por exemplo setDirectory (const std :: string & strPath), você pode ter certeza que há uma barra de terminação se o usuário não especificou um. Isso garante que seu estado classe será sempre válido.
Getters também pode proteger seus membros de tê-los expostos para permitir ponteiros para eles. Ao não permitir ponteiros para eles do lado de fora, você pode garantir que, se o objeto sai do escopo que não vai levar a um acidente.
A nível extra de indireção para getters / setters também permitem que você será capaz de mudar o membro de dados que eles encapsular.
Com um getter você também pode obter diferentes visualizações de seus dados, por exemplo:. GetMinutes, quando seu membro de dados é armazenado em segundos
Esta não é a razão para usá-los, mas um efeito colateral agradável de usar getters e setters é que você pode definir um ponto de interrupção dentro do seu modificador, por exemplo, para ver exatamente quando ele é alterado.
Se você deve usá-los ou não é um julgamento com base em sua necessidade. Se você tem tantos membros que é uma dor enorme para fornecer getters e configurações que você poderia considerar armazenar os membros de dados em um struct e usar essa estrutura dentro de sua classe em vez. Você poderia até mesmo fornecer getters / setters para um objeto para toda a estrutura de uma só vez.
Em primeiro lugar, se sua classe tem um monte de mamebers dados provavelmente não é bem desenhado. Você pode precisar de considerar dividindo-o em várias classes ou armazenar os dados em estruturas, tais como mapas.
No que respeita à prestação de acessores, a questão é que você quiser modificar o acesso, possivelmente impedindo-o. Se a resposta for sim, então você precisa de funções de acesso. Por outro lado, se sua classe é realmente apenas um saco de bits, sem comportamento, em seguida, torná-lo uma estrutura.
Você deve usar membros de dados públicas só
- em estruturas, que você não expor a código de cliente (por exemplo functors de estilo bind.) - é inútil para proteger as estruturas que ninguém fora nunca vai chegar
- se seus tipos de encapsular a lógica de set / fazê-los (por exemplo. Se você criar um ObservableAttribute classe)
- se forem CONST-membros em uma estrutura imutável (você não pode fazer muito, exceto para lê-los se eles são imutáveis)
Se você criar um membro de dados pública, você tem que ter certeza de que o seu valor é totalmente ortogonal com outros membros da classe. Ex., Você desativar possibilidades futuras de
- observando as mudanças para o membro
- fazer o membro desempenhar qualquer parte na classe invariante
- desativação do acesso ao membro
- mudando a implementação do membro (por exemplo. Computadorizada vs. cache vs. armazenada) se o desempenho precisa
Usando métodos get / set para membros de dados private / protected é um projeto ruim.
Isso faz com que o código do cliente a ser dependente dos detalhes de implementação de sua classe.
As mudanças na sua classe provoca alterações no código do cliente.
pode ser usado No entanto métodos get / set para membros públicos. Mas é sempre bom para evitá-los.