Ao escrever algumas funções, encontrei uma palavra-chave const em parâmetros como este:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
geralmente causa a divisão de uma linha em 2 linhas no IDE ou no vim, então eu quero remover todas as palavras-chave const nos parâmetros:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
esse é um motivo válido para não usar const? É possível manter os objetos de parâmetro inalterados manualmente?
c++
coding-style
const
ggrr
fonte
fonte
const
você tem uma forte dica de que não precisa se preocupar em como isso pode ser alterado na função.Respostas:
A legibilidade é um motivo válido para aprender a usar o espaço em branco:
Localizados ali, os parâmetros não serão confundidos com o corpo da função. Ao localizá-los em uma linha diferente, você não precisará reposicioná-los quando alterar o nome
myFunction
para algo mais descritivo. Não alterar a posição dos parâmetros quando eles não foram alterados é algo que os usuários da ferramenta de controle de origem apreciarão.const
significa alguma coisa. Não jogue fora só porque você está sem espaço e idéias. A legibilidade é rei, mas quebrar as coisas em seu nome é apenas desistir.fonte
(
, e se for esse o caso, talvez seja necessário reposicionar se o comprimento do nome da classe + função for alterado em mais de 4 caracteres. Portanto, se você não precisar fazer isso, adicione um número fixo de níveis de recuo, não um número que dependa do tamanho do nome da função. Eu recomendaria um nível, esta resposta usa 6, mas qualquer número fixo alcança o objetivo declarado :-)Na verdade, a questão da legibilidade definitivamente vai na outra direção. Primeiro, você pode resolver trivialmente sua linha de execução usando o espaço em branco . Mas remover
const
não apenas torna a linha mais curta, mas altera completamente o significado do programa.Herb Sutter refere-se à
const
referênciaconst
como a mais importanteconst
porque uma referência aconst
pode se ligar a um temporário e prolongar sua vida útil. Uma referência lvalue para non-const
can, você precisa de uma variável separada.O que isso significa para a usabilidade é que você precisará introduzir todas essas variáveis temporárias apenas para poder chamar sua função. Isso não é ótimo para facilitar a leitura, pois essas variáveis não têm sentido e existem apenas porque sua assinatura está errada.
fonte
const
está referindo-seconst
ou para o outroconst
eo queconst
é realmente o mais importanteconst
const&
em vez de referência aconst
como um substantivo (Frase) láResposta simples é "não".
A resposta longa é que a
const
palavra-chave faz parte do contrato que a função oferece; informa que o argumento não será modificado. No momento em que você remove aconst
garantia, sai pela janela. Lembre-se que você não pode razoavelmente manter o constness (ou qualquer outra propriedade) de algo usando documentação, convenções ou diretrizes - se o constness não é forçado pelo compilador, alguém vai pensar que eles podem fazer o seu trabalho mais fácil se eles mexer com o parâmetro "só um pouquinho". Considerar:Além do fato de que a última versão é mais concisa, ela também fornece um contrato mais forte e permite que o compilador o ajude a manter suas intenções. O primeiro não faz nada para impedir que a
fna(Foo&)
função modifique o parâmetro que você passa para ele.Como na resposta @CandiedOrange, você pode usar espaços em branco para organizar o código e melhorar a legibilidade.
fonte
A remoção da
const
palavra - chave remove a legibilidade porqueconst
comunica informações ao leitor e ao compilador.Reduzir o comprimento horizontal do código é bom (ninguém gosta de rolar para o lado), mas há mais do
const
que texto. Você pode reescrevê-lo:O que não altera o contrato, mas atende à necessidade de reduzir o comprimento da linha. Na verdade, eu consideraria o trecho acima menos legível e optaria por usar mais espaços em branco, como já mencionado na resposta de CandiedOrange.
const
é uma funcionalidade do próprio código. Você não tornaria a função um não-membro para remover aMyClass::
seção da declaração; portanto, não remova oconst
fonte
MObj
e o questr
é, e certamente levanta as sobrancelhas. É especialmente estranho para os tipos cujos nomes você já tem o controle sobre: Ex Por que você não apenas o nomeMyObject
comoMObj
para começar?Não. Omitir
const
pode alterar a funcionalidade, perder proteçõesconst
fornece e pode potencialmente criar código menos eficiente.Em vez de gastar tempo formatando manualmente o código
Use ferramentas de formatação automática . Escreva a função de acordo com seus requisitos funcionais e permita que a formatação automática lide com a apresentação. O ajuste manual da formatação não é tão eficiente quanto o uso da formatação automática e o tempo economizado para melhorar outros aspectos do código.
fonte
Contanto que possível, é melhor manter a const visível. Isso melhora bastante a manutenção do código (sem adivinhações para ver se esse método altera meus argumentos).
Se eu vejo muitos argumentos em um método, isso me obriga a considerar a criação de jaron baseado em projeto (Matriz, Empregado, Retângulo, Conta) que seria muito mais curto, mais fácil de entender (elimina uma longa lista de argumentos para métodos).
fonte
typedef Point * LPPOINT
etypedef const Point * LPCPOINT
, embora super desagradáveis, ainda carregam um significado implícito, porque é consistente com as expectativas imediatas no contexto. Mas nunca no caso geral; é apenas uma exceção estranha em que consigo pensar.