¿Cómo te convertiste en un converso constante de corrección? [cerrado]

25

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?

grok
fuente
3
Creo que la corrección constante consiste más en ser correcta que en una herramienta para resolver un problema como si se trata de un operador o un operador de tamaño.
legends2k
99
"La razón por la que const funciona en C ++ es porque puedes tirarlo a la basura. Si no pudieras tirarlo, entonces tu mundo apestaría". - Anders Hejlsberg
Mason Wheeler
1
const también es un modificador de tipo C y lo ha sido desde el primer estándar ANSI C.
Huperniketes
Al ser mimado por Java / C #, soy un tipo paranoico al que le encanta irse afirma cualquier oportunidad que tenga. Lo que puede salir mal saldrá mal. Si hay una asistencia en tiempo de compilación o en tiempo de ejecución, ¡entonces cuente conmigo! Me convertí en un convertidor tan pronto como lo escuché 3-4 veces, y seguí una parte de este enlace (suficiente para ver la sintaxis, no necesitaba leer sobre el por qué): posibilidad.com/Cpp/const.html Solo porque algo no me ha estallado en la cara todavía ... requiere poco esfuerzo ser constante y no duele. Echa un vistazo a los pensamientos de Joel: joelonsoftware.com/articles/Wrong.html
Trabajo

Respuestas:

28

Bueno, no estaba convencido hasta que intenté abrazar la filosofía.

Primero comencé poniendo consta 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 constadiciones 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.

Klaim
fuente
8
+1 para contagioso, lo que esencialmente significa que debes convertirte en un constante o evitarlo por completo.
Martin Wickman
También debe no confiar en libs que no hacen la corrección constante. Su enfoque no funciona cuando significa que no puede llamar a ninguna de las funciones de GUI porque no son constantes, o si necesita deshacerse de ella en cada llamada de GUI.
Martin Beckett
44
1 para "pareció más fácil de depuración", utilizo constincluso para variable local que sé que no tendrá que cambiar, de esta manera cuando se lee el código que puedo deslizarse sobre una ifo una foro qué más: mi variable es una constante, lo 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.
Matthieu M.
@MatthieuM .: ¿Alguna vez consideró cambiarse a Haskell? ;-)
Giorgio
@Giorgio: Lo he explorado, incluso llegué a comprar "Real World Haskell". Para ser honesto, no estoy encantado con la pereza por defecto y los muchos operadores crípticos que han surgido.
Matthieu M.
15

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 constcalificados explícitamente como mutable. 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 consttodas 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.

Jon Purdy
fuente
2
Básicamente, acabas de decir que la corrección constante es algo bueno. Dijiste que "conduce a un código mejor y más seguro". ¿Puedes decir por qué?
David Reis
Estoy totalmente en el campo de la inmutabilidad, mi idioma favorito es el erlang. Pero diría que la inmutabilidad a través de const en C ++ no es realmente gratuita. Hay inconvenientes como código menos legible, versiones const y no const del mismo método, o desechar const porque "simplemente no había otra opción".
grok
1
Aconsejaría no solo usar 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.
David Thornley
2
@David Thornley: Por razones de coherencia, mutablees la elección lógica. void alter(mutable Point&)tiene sentido, como lo hace mutable int foopara una variable local, y ninguno de estos conflictos con el lenguaje existente o el uso existente de mutable. Además, Object mutable* mutableparece lo suficientemente aterrador como para ser una advertencia sobre si es necesario o correcto.
Jon Purdy
Si alguna vez haces la bifurcación, considera ir con CLang, debería ser menos doloroso.
gf
6

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.

David Thornley
fuente
1
"Los programas deben estar escritos para que la gente los lea, y solo de forma incidental para que las máquinas los ejecuten". - Abelson & Sussman, SICP
Brandon DuRette
4

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 constuna vez que entendí la corrección al usarlo;)

legends2k
fuente
2

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.

Dima
fuente
2

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:

  • Legibilidad y comprensión. Si estoy leyendo el código de otra persona y una función toma una referencia constante como parámetro, sé que el parámetro solo debe usarse como una variable de solo lectura. Esta es una victoria masiva, especialmente si el código es un entorno multiproceso.
  • El compilador puede hacer uso del calificador const para ayudar a sus pases de optimización.
  • Digamos que tengo un objeto de clase A en una situación en la que no quiero que cambie. Entonces, las únicas funciones miembro que se pueden invocar para ese objeto son las que son constantes.
Sashang
fuente
2

Para resumir dos puntos que se han cubierto en otras respuestas, y agregue uno nuevo:

  • constdocumenta 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 que const_castno 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 la constanotación). También es útil dentro de funciones / bucle / etc. porque ayuda a comprender mucho de la misma manera que un bucle invariante.

  • constdocumenta su intención al compilador. Encontrar errores en tiempo de compilación siempre es mejor que esperar a que se ejecute ese código.

  • constEs necesario para el tipo de polimorfismo seguro. Los punteros (en todas sus formas, no solo los punteros sin formato) solo son covariantes si lo son const(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é constsolo 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 #defines 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 constno consttipos son fundamentalmente diferentes (ya que admiten diferentes operaciones), y desde entonces nunca he considerado escribir código C ++ sin un uso intensivo const.

Ben Voigt
fuente
1

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.

Nikiforos Rotas
fuente