¿Cuál se consideraría más mantenible?
if (a == b) c = true; else c = false;
o
c = (a == b);
He intentado buscar en Code Complete, pero no puedo encontrar una respuesta.
Creo que el primero es más legible (literalmente puedes leerlo en voz alta), lo que también creo que lo hace más fácil de mantener. El segundo ciertamente tiene más sentido y reduce el código, pero no estoy seguro de que sea tan fácil de mantener para los desarrolladores de C # (esperaría ver más este modismo en, por ejemplo, Python).
.net
code-quality
readability
maintainability
clean-code
Bret Walker
fuente
fuente
else c = false
para el primero o hacer la asignación un||=
en el segundo.c = a==b ? true : false;
Respuestas:
La segunda opción es mejor.
Hay una razón definitiva para desconfiar de los atajos de programación inteligentes que perjudican el mantenimiento al ocultar la intención del código. Entonces, no te culpo por hacer la pregunta.
Sin embargo, no considero
c = (a == b);
que sea un ejemplo de un truco inteligente. Es una representación directa de un concepto simple. Tan sencillo como puedas.Una adecuada, "mantenible" formato del primer ejemplo (sin las llaves que faltan y construcción de una línea, que yo hago considerar un atajo inteligente) produciría este código:
En mi experiencia, escribir una lógica booleana simple en una forma tan propensa a errores es un signo de código "dudoso". Me haría preguntarme cómo se maneja una lógica más compleja en esta base de código.
fuente
Primero, tenga en cuenta que sus dos formas no son equivalentes.
c
se establecerá en verdadero sia
es igual ab
, y si no, su valor seguirá siendo lo que sea.c
se establecerá en verdadero sia
es igual ab
, y si no, se establecerá en falso.Si desea el equivalente de la segunda forma, en el estilo de la primera forma, debe escribirlo así:
Ahora está claro cuál de los dos es más legible, más fácil de mantener y menos propenso a introducir errores si se cambia algo. Quédate con la segunda forma.
fuente
No estoy de acuerdo con que su primer formulario sea más legible: ciertamente no es idiomático C # tener dos declaraciones en una sola línea, y no se recomienda tener una
if
declaración sin usar llaves.En segundo lugar, no veo cómo la segunda forma es menos mantenible: no hay nada que mantener. Es una simple declaración de la relación entre
a
yb
y no podría expresarse más sencillamente.Otra razón para preferir la segunda forma es que puede declararla
c
y asignarla en una sola declaración, es decirModificar variables fácilmente puede conducir a errores, por lo que lo evitaría. El uso de una
if
declaración requiere que la variable se declare antes del condicional y luego se modifique.fuente
Another reason to prefer the second form is that you can declare c and assign it in a single statement
""más mantenible" podría ser muy subjetivo.
Por lo general, prefiero la legibilidad y la intención sobre la reducción de código. Creo que guarda 8 caracteres escritos usando la forma reducida.
Tomar el idioma y la cultura alrededor del idioma es una característica de 'legibilidad' en mi opinión.
Hay momentos en que el rendimiento puede ser la causa de la reducción del código para optimizar el código de bytes resultante, pero eso debe hacerse con cuidado después de algunos perfiles.
fuente
El segundo. Tiene menos de repetición (DRY) y es más fácil de entender lo que está pasando, que
c
mantiene al valor de si o noa
y estarb
son iguales.En mi humilde opinión, aún mejor sería
Justo como escribiría
1 + 2 + 3
en vez de((1 + 2) + 3)
5 + 3 * 7
en vez de(5 + (3 * 7))
Obviamente y el código trivialmente innecesario no es una virtud. Está abarrotado.
fuente
Votantes bajos, por favor explique qué está mal con mi respuesta revisada.
Sí,
c = (a == b);
puede ser difícil de leer (peor aún, StyleCop se queja del paréntesis innecesario), pero todavía me gusta la simplicidad dea == b
. Por lo tanto, esto es lo que me gusta usar cuando ambosa
yb
son los mismos:Y luego puedes hacer: en
this.c = this.NoPeriod
lugar de:fuente
return this.MyWaveLength = this.HerWaveLength;
o en sureturn this.MyWaveLength == this.HerWaveLength;
lugar?c = (a == b);
No es propenso a errores. ¡La primera forma en la pregunta original es mucho más propensa a errores , como lo demuestra el OP mismo que tiene que editar su pregunta para corregir errores!