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?

Foi útil?

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.

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