ti-enxame.com

Como você se tornou um convertido de correção const?

Após 15 anos de C++, ainda não aprendi a amar o uso de const. Eu entendo o seu uso, mas nunca estive realmente em situação em que estar const correto teria evitado o problema que estava enfrentando.

Então, como você adorou os benefícios dos consts?

25
grok

Bem, eu não estava convencido até tentar abraçar a filosofia.

Comecei colocando const para membros realmente somente leitura dos meus argumentos mais básicos de membros de classe e funções de membro.

A partir daí, não consegui mais compilar. Então eu perseverei em entrar no código usando essas classes básicas, ver se as adições anteriormente const eram realmente legítimas em comparação com o uso que eu fiz delas. Isso me ajudou a corrigir alguns erros no caminho, à medida que adicionava constance a outras partes do código.

É contagioso. A maior parte do código ficou ainda mais constante e achei mais fácil depurá-lo, porque você fica confiante de que o compilador o interromperá se você começar a modificar algo que não deveria.

Depois que o aplicativo foi executado novamente, ficou mais rápido (tive que alterar alguns algoritmos que descobri que não eram adequados para o trabalho), com muito menos erros e mais fácil de entender ao ler o código.

Eu estava convencido.

Agora, acho que é ainda melhor quando você usa muitas asserções, além da constness, porque isso faz você se sentir confiante quando precisa escrever um novo código ou modificar o código atual. Você sabe que o compilador o interromperá, se necessário. Ele permite que você esqueça de verificar tudo o que não deve modificar e, assim, terá mais tempo para pensar em mais pensamentos específicos de negócios ou arquitetônicos.

28
Klaim

Eu nunca fui um defensor da programação orientada a objetos e, se alguma coisa eu cresci menos, mais aprendi sobre programação em geral. Ao estudar diferentes paradigmas de programação, percebi que a imutabilidade é um dos conceitos centrais do the design de programas, afetando o software escrito de acordo com a filosofia any. É extremamente importante na programação funcional, com implicações na otimização e simultaneidade, além das simples garantias de segurança.

Basicamente, tudo o que pode ser imutável provavelmente deveria será, a menos que você tenha uma boa razão para o estado mutável. Na minha experiência, escrever programas em linguagem any em busca desse objetivo leva a um código mais seguro, melhor. Você não tem nada a perder usando const onde aplicável - a imutabilidade é gratuita!

(Aliás, eu brinquei com a idéia de criar uma bifurcação do GCC para um dialeto de C++ no qual todos os tipos são const, a menos que sejam explicitamente qualificados como mutable. Se houver suporte para isso , Vou me comprometer totalmente a mantê-lo e usá-lo.)


Do ponto de vista OO, a imutabilidade impõe o encapsulamento, impedindo o acesso irrestrito à gravação. Reduz o acoplamento entre as classes, porque os objetos imutáveis ​​devem gerenciar totalmente seu próprio estado e, portanto, se comportar como valores comuns). A correção Const facilita o processo de provar a exatidão do programa, especialmente no contexto de programação simultânea.Com a semântica de referência C++ e C++ 0x rvalue, você pode usar objetos imutáveis ​​sem se preocupar com a sobrecarga de copiá-los por todo o lugar. trabalhe com uma mágica incrível de otimização se você estiver trabalhando com objetos imutáveis.

Sei que é péssimo digitar const em todos os lugares, mas você se acostuma rapidamente e os benefícios se tornam aparentes ao longo do tempo em termos de confiabilidade e manutenção. Não sou um escritor brilhante, e parece ser uma tarefa difícil comprovada, mas sei que a correção constante tem sido imensamente útil para mim como desenvolvedor ao projetar e implementar programas, e acho que a experiência é o melhor professor a esse respeito.

15
Jon Purdy

A vantagem da correção constante é que ela impõe uma disciplina ao programa e facilita o raciocínio sobre partes do programa.

A disciplina é que você precisa saber onde algo pode mudar. A vantagem correspondente é que é mais fácil ver o que um pedaço de código faz quando você pode dizer o que pode estar mudando o estado.

6
David Thornley

Estar const correto enfatiza a correção do design que trato perto de um problema semelhante que não está usando operadores de conversão; portanto, não usando cast e sendo const correto, uso mínimo de mutável - todos esses são indicadores para medir o quão bom o design é mas não as ferramentas reais para resolver o problema geral em questão.

P.S.: Fiquei totalmente convencido de const depois que entendi a correção em usá-lo;)

4
legends2k

Eu fui convertido assim que soube que era possível. Fazia sentido para mim do ponto de vista do 'bom estilo de programação'. Existem várias razões pelas quais é uma boa prática estar constante:

  • Legibilidade e compreensão. Se estou lendo o código de outra pessoa e uma função usa uma referência const como parâmetro, sei que o parâmetro deve ser usado apenas como uma variável somente leitura. Esta é uma vitória massiva, especialmente se o código for um ambiente multiencadeado.
  • O compilador pode fazer uso do qualificador const para ajudar na otimização.
  • Digamos que eu tenha um objeto da classe A em uma situação em que não queira que ele mude. Em seguida, as únicas funções-membro que podem ser chamadas para esse objeto são aquelas que são const.
2
sashang

Eu vejo duas razões principais para escrever código const-correto. Uma é que o compilador é seu amigo e, usando const, você avisa sobre possíveis erros. A segunda razão é que a correção constante torna o código mais legível. Por exemplo, você sempre sabe quais argumentos da função são entradas e quais são saídas. Você também sabe quais funções de membro modificam o objeto e quais não. Você sabe essas coisas instantaneamente sem precisar ler o código. Isso, é claro, pressupõe um uso muito criterioso de const_cast.

2
Dima

Para resumir dois pontos que foram abordados em outras respostas e adicione um novo:

  • const documenta o código para os usuários da sua API. Ele forma um contrato entre uma função e seu chamador, que a função não modifica seus parâmetros. (Observe que const_cast não permite que uma função altere seu parâmetro, permite passar esse parâmetro para outras funções que não modificam seus parâmetros, mas esqueceu a anotação const.) Também é útil nas funções/loop/etc porque ajuda a entender da mesma maneira que um loop invariável.

  • const documenta sua intenção no compilador. Encontrar erros no tempo de compilação é sempre melhor do que esperar a execução desse trecho de código.

  • const é necessário para o polimorfismo seguro do tipo. Ponteiros (em todas as suas formas, não apenas ponteiros brutos) são apenas covariantes se forem const (Nota: não é o mesmo que "ponteiro para const"). A covariância requer uma interface somente leitura e a contravariância requer uma interface somente gravação.

A segunda delas eu aprendi primeiro. Comecei com const apenas no destino dos parâmetros de ponteiro e referência, até começar a ver os benefícios de detectar erros mais cedo e começar a usá-lo em locais, etc.

Então eu aprendi que a maioria #defines podem ser substituídos (em C++) por constantes globais, com benefícios adicionais de segurança de tipo. Então eu usei lá também.

Finalmente, participei de uma aula sobre sistemas de tipos e cálculo lambda, e aprendi que os tipos const e não - const são fundamentalmente diferentes (uma vez que suportam operações diferentes), e desde então nunca mais considerou escrever código C++ sem usar muito const.

2
Ben Voigt

Aqui estão meus 5 centavos do que eu não vi outros mencionarem. Ao passar por variáveis, você não deseja passar por valor, a menos que realmente precise, para evitar construções e destruições e cópias extras. Portanto, a menos que você realmente precise passar por valor, usar referências em todos os lugares, mesmo que você não queira alterar o valor passado, é um aumento significativo no desempenho. Por esse motivo, quando você tem funções que fazem referências a todos os seus argumentos, é necessário informar ao chamador o que a função não estará modificando.

É o mesmo princípio, mas eu só queria acrescentar uma razão prática do uso de const.

1
Nikiforos Rotas