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 uma situação em que estar constantemente correto evitasse o problema que estava enfrentando.
Então, como você adorou os benefícios dos consts?
programming-practices
c++
grunhir
fonte
fonte
Respostas:
Bem, eu não estava convencido até tentar abraçar a filosofia.
Comecei por colocar
const
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
const
adições anteriores 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 pensamentos específicos de negócios ou arquitetônicos.
fonte
const
até mesmo para variáveis locais que sei que não precisarei alterar. Dessa forma, ao ler o código, posso passar rapidamente sobre umif
ou umfor
ou mais: minha variável é uma constante, eu sei que não vai mudar! Eu não poderia me importar menos com otimizações, mas tenho um cérebro limitado e poucos níveis de indentações + correção de const ajudam muito!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. Como eu estudei diferentes paradigmas de programação, eu percebi que a imutabilidade é um dos os conceitos centrais da concepção do programa, afetando software escrito de acordo com qualquer filosofia. É 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 um bom motivo para um estado mutável. Na minha experiência, escrever programas em qualquer idioma em busca desse objetivo leva a um código melhor e mais seguro . Você não tem nada a perder usando
const
onde aplicável - a imutabilidade é grátis!(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, a
const
menos que explicitamente qualificados comomutable
. Se houver suporte para tal coisa, eu me comprometerei totalmente em mantê-la e usá-la.)Do ponto de vista do OO, a imutabilidade reforça o encapsulamento, impedindo o acesso irrestrito à gravação. Reduz o acoplamento entre classes porque objetos imutáveis devem gerenciar completamente seu próprio estado e, assim, se comportar como valores comuns. A correção constante facilita significativamente o processo de comprovação da correção do programa, especialmente no contexto da programação simultânea. Com a semântica de referência C ++ e a referência C ++ 0x rvalue, você pode usar objetos imutáveis sem se preocupar com a sobrecarga de copiá-los por todo o lugar. Além disso, o compilador pode funcionar com uma mágica incrível de otimização, se você estiver trabalhando com objetos imutáveis.
Sei que é péssimo digitar em
const
qualquer lugar, 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.fonte
mutable
, uma vez que tem um significado claro em termos de correção de const. Isso significa que esse objeto de dados pode mudar de maneiras que não afetam o comportamento do objeto e permite coisas como armazenar respostas em cache. Crie outra palavra-chave.mutable
é a escolha lógica.void alter(mutable Point&)
faz sentido, assim comomutable int foo
para uma variável local, e nenhum desses conflitos com o idioma existente ou o uso existente demutable
. Além disso,Object mutable* mutable
parece assustador o suficiente para ser um aviso sobre se é necessário ou correto.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.
fonte
Estar constante corrige a correção do design que trato perto de um problema semelhante que não está usando operadores de elenco; portanto, não usando cast e sendo constante, o 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.
PS: Fiquei totalmente convencido de
const
quando compreendi a correção em usá-lo;)fonte
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
.fonte
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:
fonte
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, de que a função não modificará seus parâmetros. (Observe queconst_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 esqueceram aconst
anotação.) Também é útil em funções / loop / etc, pois ajuda a entender muito o 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 foremconst
(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
const
apenas com o 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.Aprendi então que a maioria dos
#define
s pode ser substituída (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
const
e não-const
tipos são fundamentalmente diferentes (já que eles suportam operações diferentes) e, desde então, nunca pensei em escrever código C ++ sem usar muitoconst
.fonte
Aqui estão os 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, o uso de 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 argumentos, é necessário informar ao chamador o que a função não modificará.
É o mesmo princípio, mas eu só queria acrescentar uma razão prática do uso de const.
fonte