Sé que el título de la pregunta es muy subjetivo, pero ??
mis pares me confrontaron con el uso del operador, donde al mismo tiempo no estaba muy contento / cómodo con la aplicación var
de un nuevo código.
El argumento dado para usar el ??
operador fue, quita la legibilidad en el código.
Mi pregunta es, ¿no sucede lo mismo cuando comienzas a usar var
?
c#
coding-style
readability
Numan
fuente
fuente
??
operador de fusión nula después de que se explica, no se debe permitir que se acerque al código de producción.Respuestas:
Operador de fusión nula (??)
Personalmente, no veo inconvenientes en el uso de este operador. Considere los siguientes tres ejemplos de código, desde operadores nuevos 'fáciles' hasta 'complejos'.
Sin magia:
Operador ternario:
Fusión nula:
La razón por la que se inventaron estos operadores es porque representan operaciones de programación muy comunes . No querer usarlos porque no estás acostumbrado a ellos es solo ser terco . Los idiomas evolucionan, las características evolucionan, ¡aprende a usarlas!
palabra clave var
Tengo una opinión algo diferente sobre la palabra clave var. El tipo de una variable a menudo proporciona información adicional sobre su código. Creo que ocultar el tipo usando la palabra clave var a veces hace que el código sea menos legible. Sabes menos qué esperar sin usar la finalización automática o pasar el cursor sobre los identificadores para ver cuáles son realmente. En mi opinión, esto da como resultado un código que es más lento de leer / escribir.
Utilizo la palabra clave cuando encuentro que el tipo no da mucha información adicional.
Como ejemplo para la última declaración:
fuente
Factory.CreateSomeType
vuelveIEnumerable<SomeType>
. Un día, por cualquier razón, cambia para regresarSomeType[]
. Si ha usado var, es solo una recompilación.Factory.CreateSomeType()
cambios devuelven unISomeType
?null
completo. Además, cuanto más busco alternativasnull
, más me doy cuenta de que usarnull
es a veces la solución más limpia. Mi ejemplo dado no es tan malo en mi humilde opinión, y considero que es un uso apropiado de tipos anulables.var permite un código menos detallado, lo que aumenta la legibilidad. En mi opinión, la legibilidad no debe medirse por la cantidad de detalles que ve, sino por cuántos detalles están ocultos a primera vista. Además de los ejemplos de Linq, var permite escribir pato a nivel de código fuente, dado el siguiente ejemplo:
¿A quién le importa cuál es el tipo de etiqueta siempre que proporcione la propiedad Text?
fuente
No tengo ningún comentario serio sobre el
??
operador, ya que nunca he usado mucho un lenguaje con ese operador. En cuanto avar
, las personas programan en lenguajes como Ruby, Python, Perl y PHP que tienen tipeo totalmente implícito todo el tiempo. Los nativos de estos idiomas se dan cuenta de que el tipo formal de una variable suele ser un ruido irrelevante. Estás más interesado en lo que puede hacer la variable , es decir, su interfaz estructural / duck.Del mismo modo, programo principalmente en D. D está estáticamente escrito pero tiene la
auto
palabra clave, que es equivalente avar
. Se considera idiomático usarlo en todas partes a menos que vea una necesidad específica de enfatizar el tipo de algo para el lector o (a través de la conversión implícita) al compilador. Excepto ocasionalmente cuando se usa como un tipo de retorno de función (esto está permitido en D), nunca he encontrado que obstaculice la legibilidad, porque pienso principalmente en términos de interfaces estructurales / de pato, no de tipos formales / nominativos, cuando programo.Además, en mi humilde opinión el uso en
var
todas partes posible es un buen ejemplo de DRY. El tipo de algo debe especificarse en un solo lugar, y luego propagarse automáticamente cuando sea necesario. Si usavar
y el tipo formal de la variable necesita cambiar en algún momento, el compilador propagará automáticamente los cambios necesarios en todas partes, siempre que el programa siga siendo de tipo correcto, en lugar de que el programador tenga que cambiar manualmente cada instancia . Esta es una buena cosa (TM).fuente
Creo que esta es una pregunta para el equipo al final. Si no es legible para nadie más en mi equipo, entonces no lo usaré, aunque podría intentarlo un par de veces para convencerlos con ejemplos, o señalando abreviaturas análogas (como + =) que encuentran más legibles.
Sin embargo, si trabajo solo, entonces me parece? y var legible sin límites. Incluso
es bastante inequívoco para mí
Los operadores ternarios y
dynamic
son una cuestión diferente, por supuesto.fuente
var a = b ?? c ?? d ?? e ?? String.Empty ?? "";
String.Empty
alguna vez regresanull
, nos espera muchísimo código roto.Pensándolo brevemente, este comentario me dice que la persona que hace el comentario no lo comprende tan bien como debería. Es probable que sea cierto en ciertas situaciones, pero en general, no descarto algo que el equipo de C # obviamente pensó que era lo suficientemente importante como para agregarlo debido a la "legibilidad". Puse esto en la misma categoría de
if(boolean_object)
frenteif(boolean_object == true)
. Algunas personas argumentan que el segundo es más legible, pero en realidad es solo agregar código adicional para que alguien lo lea / escriba, y en algunas situaciones puede ser más confuso (pienseif(boolean_object != false)
)El equipo de C # le ha permitido no definir algo que usted sabe lo que será. A menos que sea absolutamente necesario definir qué va a ser una variable (o es absolutamente importante que un objeto devuelto sea de tipo x, o realmente no sea legible), lo uso
var
.var x = "MY_STRING";
Sé que es una cadena de mirarlo. En verdad, no me importa que sea una cadena siempre que haga lo que necesito que haga. Definir el tipo de variable es para mi beneficio, no el del compilador. Si algo está mal, el compilador me dirá cuándo se ejecuta si tengo el tipo de variable incorrecto.fuente
los
var
palabra clave es, en mi opinión, mejor utilizada en las situaciones para las que se introdujo originalmente: consultas LINQ. En estas consultas, el tipo de resultado devuelto a menudo tiene un gran nombre complicado que es difícil de determinar con anticipación y no ayuda a la comprensión del lector de lo que hace su código.Sin embargo, haciendo
var text = "Some text " + variableName + "some more text."
es simplemente vago.EDITAR: @Jorg Saltaste a una respuesta deliberadamente simplista pero no agregaste nada a la discusión. Bien, ¿qué tal esto para un mejor ejemplo?
var items = doc.DocumentElement.FirstChild.ChildNodes;
Si puedes averiguar el tipo de eso, te daré una cookie.fuente
"Some text "
es unstring
, entonces tiene problemas mucho mayores de los que preocuparse que la cantidad devar
s en su código.var
; El problema es el nombre de la variable "elementos". Si usa un buen nombre de variable, no tiene nada de malovar
.Tengo un problema fundamental con el uso de var.
En este ejemplo, todo está lado a lado, pero el problema es realmente con grandes soluciones con bibliotecas o proyectos compartidos.
Considera esto:
¿Qué sucede si alguien más cambia GetMeAnObject para satisfacer sus necesidades?
El método MainProgram tendrá un gran error rojo en .PerformOperation (). ¿Que pasó? PerformOperation funcionó perfectamente bien antes. Observamos los métodos en el Objeto y simplemente desapareció sin dejar rastro. Estuvo allí la última vez, y necesitamos ese método. Podría pasar mucho tiempo persiguiendo su cola e intentando descubrir por qué, si MyFirstObject tiene un método llamado PerformOperation, ahora no se puede ver. Todo el mundo "sabe" que GetMeAnObject devuelve un MyFirstObject, por lo que no tiene sentido comprobarlo.
Si hubiera escrito explícitamente theObject, entonces tendría un error Invalid Cast en la línea que llama a GetMeAnObject, y sería muy obvio que GetMeAnObject está devolviendo un tipo que no es lo que espera.
En resumen, la declaración explícita significa que usted sabe lo que significan los errores. Una conversión no válida significa que esperaba un tipo y se devolvió otro tipo. Un miembro no reconocido significa que el miembro no fue reconocido.
fuente
var
? No se puede esperar que el lenguaje proteja contra ese tipo de comportamiento, ¿y si hubieran modificado MyFirstObject directamente? Todavía se habría roto, pero ninguna sintaxis podría haberlo salvado de eso. Consideraría esto una fortaleza devar
, incluso: ¿qué pasa si en lugar de devolver MySecondObject ahora devolvieras IMyFirstObject?