Al escribir algunas funciones, encontré una palabra clave const en parámetros como este:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
a menudo provoca la división de una línea en 2 líneas en IDE o vim, por lo que quiero eliminar todas las palabras clave constantes en los parámetros:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
¿Es esa una razón válida para no usar const? ¿Es mantenible mantener los objetos de parámetros sin cambios manualmente?
c++
coding-style
const
ggrr
fuente
fuente
const
que tiene una fuerte pista de que no necesita molestarse en cómo se puede cambiar en la función.Respuestas:
La legibilidad es una razón válida para aprender a usar espacios en blanco:
Ubicados allí, los parámetros no se confundirán con el cuerpo de la función. Al ubicarlos en una línea diferente, no tendrá que reposicionarlos cuando cambie el nombre de
myFunction
algo más descriptivo. No cambiar la posición de los parámetros cuando no han cambiado es algo que los usuarios de la herramienta de control de fuente apreciarán.const
significa algo. No lo tires solo porque te quedas sin espacio e ideas. La legibilidad es el rey, pero romper cosas en su nombre es simplemente darse por vencido.fuente
(
, y si ese es el caso, entonces podría tener que reposicionar si la longitud del nombre de la clase + función cambia en más de aproximadamente 4 caracteres. Entonces, si no quiere tener que hacer eso, agregue un número fijo de niveles de sangría, no un número que dependa de la longitud del nombre de la función. Recomendaría 1 nivel, esta respuesta usa 6, pero cualquier número fijo logra el objetivo establecido :-)En realidad, el problema de legibilidad definitivamente va en la otra dirección. Primero, puede resolver trivialmente su línea de acceso mediante el uso de espacios en blanco . Pero eliminar
const
no solo hace que la línea sea más corta, sino que cambia completamente el significado del programa.Herb Sutter se refiere a la
const
referenciaconst
como la más importanteconst
porque una referencia aconst
puede unirse a una temporal y extender su vida útil. Una referencia de valor a noconst
puede, necesita una variable separada.Lo que esto significa para la usabilidad es que tendrá que introducir todas estas variables temporales solo para poder llamar a su función. Eso no es bueno para la legibilidad, ya que estas variables no tienen sentido y existen solo porque su firma es incorrecta.
fuente
const
está refiriendo aconst
o al otroconst
y lo queconst
es de hecho el más importanteconst
const&
lugar de referenciaconst
como un sustantivo (frase) allíLa respuesta simple es "no".
La respuesta larga es que la
const
palabra clave es parte del contrato que ofrece la función; le dice que el argumento no se modificará. En el momento en que elimina laconst
garantía, esa garantía desaparece. Recuerde que usted no puede sostener la constness (o cualquier otra propiedad) de algo utilizando documentación, convenciones, directrices o - si el constness no se hace cumplir por el compilador, alguien va a pensar que pueden hacer su trabajo más fácil si jugar con el parámetro "solo un poquito". Considerar:Además del hecho de que la última versión es más concisa, también proporciona un contrato más sólido y permite que el compilador lo ayude a mantener sus intenciones. El primero no hace nada para evitar que la
fna(Foo&)
función modifique el parámetro que le pasa.Como en la respuesta @CandiedOrange, puede usar espacios en blanco para diseñar el código y mejorar la legibilidad.
fuente
La eliminación de la
const
palabra clave elimina la legibilidad porqueconst
comunica información al lector y al compilador.Reducir la longitud horizontal del código es bueno (a nadie le gusta desplazarse hacia los lados), pero hay más
const
que texto. Podrías reescribirlo:Lo cual no cambia el contrato pero satisface la necesidad de reducir la longitud de la línea. Verdaderamente , consideraría que el fragmento anterior es menos legible y optaría por usar más espacios en blanco como ya se mencionó en la respuesta de CandiedOrange.
const
es una funcionalidad del código en sí. No haría que la función no sea miembro para eliminar laMyClass::
sección de la declaración, así que no elimine elconst
fuente
MObj
y quéstr
son, y ciertamente levanta las cejas. Es especialmente extraño para este tipo de cuyos nombres ya tiene control sobre: Por ejemplo, ¿por qué no acaba de nombrarMyObject
comoMObj
para empezar?No. Omitir
const
puede cambiar la funcionalidad, perder las protecciones queconst
ofrece y potencialmente puede crear código menos eficiente.En lugar de perder tiempo formateando código manualmente
Use herramientas de formateo automático . Escriba la función según sus requisitos funcionales y deje que el formateo automático se encargue de la presentación. Ajustar el formato manualmente no es tan eficiente como usar el formateo automático y usar el tiempo ahorrado para mejorar otros aspectos del código.
fuente
Mientras sea posible, es mejor mantener visible la constante. Mejora mucho el mantenimiento del código (no hay conjeturas para ver si este método cambia mis argumentos).
Si veo muchos argumentos en un método, me obliga a considerar la creación de jaron basado en proyectos (Matriz, Empleado, Rectángulo, Cuenta) que sería mucho más corto, más fácil de entender (elimina una larga lista de argumentos para los métodos).
fuente
typedef Point * LPPOINT
ytypedef const Point * LPCPOINT
, aunque es muy desagradable, todavía tiene un significado implícito, porque es coherente con las expectativas inmediatas en contexto. Pero nunca en el caso general; Es solo una extraña excepción en la que puedo pensar.