Después de 15 años de C ++, todavía no he aprendido a amar const. Entiendo que es útil, pero nunca he estado en una situación en la que ser constante hubiera evitado el problema al que me enfrentaba.
Entonces, ¿cómo llegaste a amar los beneficios de los concursos?
Respuestas:
Bueno, no estaba convencido hasta que intenté abrazar la filosofía.
Primero comencé poniendo
const
a miembros de solo lectura de mis miembros de clase más básicos y argumentos de funciones de miembro.A partir de ahí, no pude compilar más. Luego perseveré en ir al código usando esas clases básicas, ver si las
const
adiciones anteriores eran realmente legítimas en comparación con el uso que hice de ellas. Me ayudó a corregir algunos errores en el camino a medida que agregaba constancia a otras partes del código.Es contagioso. La mayor parte del código obtuvo aún más constidad y me resultó más fácil depurarlo porque te hace confiar en que el compilador te detendrá si comienzas a modificar algo que no deberías.
Una vez que volví a ejecutar la aplicación, fue más rápido (tuve que cambiar algunos algoritmos que descubrí que no eran adecuados para el trabajo), con muchos menos errores y más fácil de entender al leer el código.
Yo estaba convencido.
Ahora, creo que es aún mejor cuando estás usando muchas afirmaciones además de la constidad porque te hace sentir seguro cuando tienes que escribir un nuevo código o modificar el código actual. Sabes que el compilador te detendrá si es necesario. Le permite olvidarse de tener que verificar todo lo que no debe modificar y luego tiene más tiempo para pensar más pensamiento específico de negocios o pensamiento arquitectónico.
fuente
const
incluso para variable local que sé que no tendrá que cambiar, de esta manera cuando se lee el código que puedo deslizarse sobre unaif
o unafor
o qué más: mi variable es una constante, lo sé que no va a cambiar! No podría importarme menos las optimizaciones, pero tengo un cerebro limitado, y pocos niveles de sangrías + corrección constante ayudan mucho.Nunca he sido un defensor de la programación orientada a objetos, y en todo caso, he crecido menos y más aprendo sobre programación en general. Al estudiar diferentes paradigmas de programación, me di cuenta de que la inmutabilidad es uno de los conceptos centrales del diseño de programas, que afecta el software escrito de acuerdo con cualquier filosofía. Es muy importante en la programación funcional, con implicaciones en la optimización y concurrencia además de las simples garantías de seguridad.
Básicamente, todo lo que puede ser inmutable probablemente debería serlo, a menos que tenga una buena razón para un estado mutable. En mi experiencia, escribir programas en cualquier idioma para alcanzar este objetivo conduce a un código mejor y más seguro . No tiene nada que perder si lo utiliza
const
, ¡la inmutabilidad es gratuita!(Por cierto, he jugado con la idea de crear una bifurcación de GCC para un dialecto de C ++ en el que todos los tipos están
const
calificados explícitamente comomutable
. Si hay soporte para tal cosa, me comprometeré totalmente a mantenerlo y usarlo).Desde el punto de vista de OO, la inmutabilidad impone la encapsulación al evitar el acceso de escritura sin restricciones. Reduce el acoplamiento entre clases porque los objetos inmutables deben gestionar completamente su propio estado y, por lo tanto, comportarse como valores normales. La corrección constante facilita significativamente el proceso de probar la corrección del programa, especialmente en el contexto de la programación concurrente. Con la referencia de C ++ y la semántica de referencia de valor de C ++ 0x, puede hacer uso de objetos inmutables sin preocuparse por la sobrecarga de copiarlos por todas partes. Además, el compilador puede funcionar con una magia de optimización bastante sorprendente si está trabajando con objetos en su mayoría inmutables.
Sé que apesta escribir en
const
todas partes, pero se acostumbra rápidamente y los beneficios se hacen evidentes con el tiempo en términos de confiabilidad y facilidad de mantenimiento. No soy un escritor brillante, y parece ser una tarea difícil de demostrar, pero sé que la corrección constante me ha sido de gran ayuda como desarrollador al diseñar e implementar programas, y creo que la experiencia es El mejor profesor en este sentido.fuente
mutable
, ya que tiene un significado claro en términos de corrección constante. Significa que este objeto de datos puede cambiar de manera que no afecte el comportamiento del objeto, y permite cosas como almacenar en caché las respuestas. Crea otra palabra clave.mutable
es la elección lógica.void alter(mutable Point&)
tiene sentido, como lo hacemutable int foo
para una variable local, y ninguno de estos conflictos con el lenguaje existente o el uso existente demutable
. Además,Object mutable* mutable
parece lo suficientemente aterrador como para ser una advertencia sobre si es necesario o correcto.La ventaja de la corrección constante es que impone una disciplina en el programa y hace que sea más fácil razonar sobre partes del programa.
La disciplina es que necesita saber dónde se puede cambiar algo. La ventaja correspondiente es que es más fácil ver qué hace un fragmento de código cuando se puede saber qué podría estar cambiando el estado.
fuente
Ser constante correcto enfatiza la corrección del diseño que trato cerca de un problema similar que no utiliza operadores de conversión; por lo tanto, no usar el yeso y ser constante, uso mínimo de mutable: todos estos son indicadores para medir qué tan bueno es el diseño, pero no las herramientas reales para resolver el problema general en cuestión.
PD: me convencí por completo
const
una vez que entendí la corrección al usarlo;)fuente
Veo dos razones principales para escribir código const-correct. Una es que el compilador es tu amigo, y al usar const dejas que te advierta de posibles errores. La segunda razón es que la corrección constante hace que el código sea más legible. Por ejemplo, siempre sabe qué argumentos de la función son entradas y cuáles son salidas. También sabe qué funciones miembro modifican el objeto y cuáles no. Conoces estas cosas al instante sin tener que leer el código. Esto, por supuesto, supone un uso muy juicioso de
const_cast
.fuente
Fui convertido tan pronto como supe que era posible. Tenía sentido para mí desde el punto de vista del "buen estilo de programación". Hay varias razones por las cuales es una buena práctica ser constante:
fuente
Para resumir dos puntos que se han cubierto en otras respuestas, y agregue uno nuevo:
const
documenta el código a los usuarios de su API. Forma un contrato entre una función y su llamador, que la función no modificará sus parámetros. (Tenga en cuenta queconst_cast
no permite que una función cambie su parámetro, permite pasar ese parámetro a otras funciones que no modifican sus parámetros pero olvidaron laconst
anotación). También es útil dentro de funciones / bucle / etc. porque ayuda a comprender mucho de la misma manera que un bucle invariante.const
documenta su intención al compilador. Encontrar errores en tiempo de compilación siempre es mejor que esperar a que se ejecute ese código.const
Es necesario para el tipo de polimorfismo seguro. Los punteros (en todas sus formas, no solo los punteros sin formato) solo son covariantes si lo sonconst
(Nota: no es lo mismo que "puntero a constante"). La covarianza requiere una interfaz de solo lectura, y la contravarianza requiere una interfaz de solo escritura.El segundo de estos lo aprendí primero. Comencé
const
solo con el objetivo de puntero y parámetros de referencia, hasta que comencé a ver los beneficios de detectar errores antes, y comencé a usarlo en locales, etc.Luego aprendí que la mayoría de los
#define
s se pueden reemplazar (en C ++) por constantes globales, con los beneficios adicionales de la seguridad de tipos. Así que también lo usé allí.Finalmente, tomé una clase sobre sistemas de tipos y cálculo lambda, y aprendí que los
const
noconst
tipos son fundamentalmente diferentes (ya que admiten diferentes operaciones), y desde entonces nunca he considerado escribir código C ++ sin un uso intensivoconst
.fuente
Aquí están mis 5 centavos de lo que no he visto mencionar a otros. Al pasar variables no desea pasar por valor, a menos que realmente lo necesite, para evitar construcciones, destrucciones y copias adicionales. Entonces, a menos que realmente deba pasar por valor, el uso de referencias en todas partes, incluso si no quiere cambiar el valor pasado, es un aumento significativo del rendimiento. Por esta razón, cuando tiene funciones que toman referencias de todos sus argumentos, debe informarle a la persona que llama lo que la función no modificará.
Es el mismo principio, pero solo quería agregar una razón práctica para usar const.
fuente