2009-03-30 6 views
5

Se introdujeron varias características en C# 3.0, lo que me inquietó, como los inicializadores de objetos, los métodos de extensión y las variables implícitamente tipadas. Ahora en C# 4.0 con cosas como la palabra clave dinámica me estoy preocupando aún más.¿Cómo manejas las nuevas características de C# para que no lleven a un código mal escrito?

sé que cada una de estas características CAN usarse de manera apropiada PERO en mi opinión, que hacen más fácil para los desarrolladores para hacer malas decisiones de codificación y, por tanto, escribir código peor. Me parece que Microsoft está tratando de ganar cuota de mercado haciendo que la codificación sea fácil y poco exigente. Personalmente, prefiero un lenguaje riguroso y exige más a mis estándares de codificación y me obliga a estructurar las cosas de manera POO.

Éstos son algunos ejemplos de mis preocupaciones por las características mencionadas anteriormente:

constructores de objetos pueden hacer importantes lógica que no está expuesta al consumidor. Esto está bajo el control del desarrollador de objetos. Los inicializadores de objetos quitan este control y permiten que el consumidor tome las decisiones sobre qué campos inicializar.

EDITAR: No había apreciado que puedes mezclar el constructor y el inicializador (mi mal) pero esto empieza a parecer desordenado para mi mente y todavía no estoy convencido de que sea un paso adelante.

Permitir que los desarrolladores amplíen los tipos incorporados utilizando métodos de extensión permite que todos comiencen a agregar sus métodos favoritos a la clase de cadena, que puede terminar con una desconcertante variedad de opciones o requiere más control de estándares de codificación eliminar estos.

Permitir variables tipeadas implícitamente permite una programación rápida y sucia en su lugar o enfoques de POO correctamente, que pueden convertirse rápidamente en un desastre inmanejable de vars en toda la aplicación.

¿Están mis preocupaciones justificadas?

+0

RobW: debe volver a formular su pregunta. "es correcto Microsoft" es argumentativo, mientras que "¿Cómo lidiar con las nuevas características de C# para que no conduzcan a un código mal escrito" no es – Brann

+0

OK, lo probaré! No estaba tratando de ser argumentativo, por lo que di ejemplos de mi punto de vista, estoy interesado en lo que piensan otros desarrolladores. –

+0

También es una pregunta de "discusión" sin una respuesta definitiva (solo opiniones) y entonces la wiki de la comunidad sería apropiada. –

Respuesta

5

Los inicializadores de objetos simplemente permiten que el cliente establezca las propiedades inmediatamente después de la construcción, no se renuncia al control, ya que la persona que llama debe asegurarse de que todos los argumentos del constructor estén satisfechos.

Personalmente siento que añaden muy poco:

Person p1 = new Person("Fred"); 
p1.Age = 30; 
p1.Height = 123; 

Person p2 = new Person("Fred") 
{ 
    Age = 30; 
    Height = 123; 
}; 

Sé que a mucha gente no les gusta la palabra clave 'var'.Puedo entender por qué, ya que es un abuso invitando abiertamente, pero no me importa que proporcionar el tipo es muy obvio:

var p1 = new Person("Fred"); 
Person p2 = GetPerson(); 

En la segunda línea anterior, el tipo no es evidente, a pesar del nombre del método. Yo usaría el tipo en este caso.

Métodos de extensión - Lo usaría muy poco pero son muy útiles para extender los tipos .NET con métodos de conveniencia, especialmente IEnumerable, ICollection y String. String.IsNullOrEmpty() como método de extensión es muy bueno, ya que se puede invocar en referencias nulas.

No creo que tenga que preocuparse, los buenos desarrolladores siempre usarán sus herramientas con respeto y los desarrolladores malos siempre encontrarán la manera de utilizar sus herramientas: la limitación del conjunto de herramientas no resolverá este problema.

+0

Gracias por el puntero en la combinación de inicializador de constructor, pregunta actualizada en base a esto. –

+0

Sin problemas. Creo que los inicializadores de objetos se agregaron para los tipos anónimos donde no se puede especificar un constructor porque el tipo no tiene nombre. Tengo idea de por qué las langs de C++ ilk aún insisten en cstrs con nombre == al nombre de clase: un método de inicialización llamado Initialize(), como Ruby, sería mejor IMO. –

+0

En realidad, está bastante equivocado acerca de los inicializadores de objetos. Hay una gran diferencia: en su primer ejemplo de estilo "antiguo", cada asignación se tratará como una operación atómica, lo que posiblemente genere una ventana de tiempo en la que el estado de su objeto no sea coherente.La sintaxis "nueva" evaluará juntas – ArielBH

0

Los inicializadores de objetos son simplemente sintaxis sofisticada. No hay nada que el desarrollador pueda hacer con ellos que no haya podido hacer antes; sin embargo, le ahorran algunas líneas de código.

Si "amplía los tipos incorporados" se refiere a los métodos de extensión, de nuevo, esto no es nada nuevo, solo una mejor sintaxis. Los métodos son métodos estáticos que aparecen como si fueran miembros. La construcción en las clases permanece intacta.

Las variables implícitas son necesarias para Linq. También los uso con genéricos que tienen muchos parámetros de tipo. Pero estoy de acuerdo en que no me gustaría que se usen exclusivamente.

Por supuesto, se puede abusar de cada característica, pero creo que estas nuevas características realmente le permiten escribir código que es más fácil de leer.

2

Puede limitar las funciones de C# 3.0 que sus desarrolladores pueden usar al escribir las restricciones en sus estándares de codificación. Luego, cuando se revisa el código antes del registro, cualquier código que infrinja estas reglas debe ser detectado y el cheque rechazado. Uno de esos casos bien podría ser métodos de extensión.

Obviamente, sus desarrolladores querrán usar las nuevas características, todos los desarrolladores sí. Sin embargo, si tiene buenas razones bien documentadas por las cuales no deberían usarse, los buenos desarrolladores las seguirán. También debería estar dispuesto a revisar estas reglas a medida que la nueva información salga a la luz.

Con VS 2008 puede especificar a qué versión de .NET desea orientar (haga clic con el botón derecho sobre la solución y seleccione Propiedades> Aplicación). Si se limita a .NET 2.0, entonces no obtendrá ninguna de las nuevas características en .NET 3.5. Obviamente, esto no ayuda si quiere usar algunas de las funciones.

Sin embargo, creo que sus temores sobre vars son injustificados. C# sigue tan fuertemente tipado como siempre. Declarar algo como var simplemente le dice al compilador que elija el mejor tipo para esta variable. La variable no puede cambiar el tipo siempre es un int o Person o lo que sea. Personalmente, sigo las mismas reglas que Paul Ruane; si el tipo es claro desde la sintaxis, utilice un var; si no, nombre el tipo explícitamente.

+0

No me interesaría trabajar para una empresa que introduciría tabú sobre las nuevas funciones, ya que es equivalente a trabajar con una tecnología antigua y no extenderá sus habilidades y experiencia. – User

+0

Aunque simpatizo en principio aquí, en el mundo de los negocios, no diría que C# 2.0 (por ejemplo) es exactamente una "tecnología antigua". Si estuvieran escribiendo un nuevo software en COBOL, podría estar de acuerdo. – mquander

+0

@SO Troll: lo único que estoy señalando es que puedes limitar lo que los desarrolladores pueden hacer. Por ejemplo, es posible que no pueda instalar .NET 3.5 en el servidor. – ChrisF

0

Un gran factor atenuante sobre la var es que nunca se puede mover entre los ámbitos. No puede ser un tipo de devolución o un tipo de parámetro. Esto lo hace mucho más seguro en mi mente, ya que siempre está tipeado y siempre con detalles de implementación de un método.

+0

Estás pensando en tipos anónimos, var simplemente hace tipeo implícito. –

+0

"las variables que se declaran en el alcance del método pueden tener un tipo implícito var" http://msdn.microsoft.com/en-us/library/bb383973.aspx. var solo puede ser un método de variables locales, no miembros de nivel de clase o tipo de retorno o tipo de parámetro. –

0

Se introdujeron nuevas características porque Microsoft se dio cuenta de que son absolutamente necesarias para implementar nuevas funciones de idioma. Como LINQ, por ejemplo. Para que pueda usar la misma estrategia: 1) conozca esas características, 2) no lo use hasta que lo encuentre absolutamente necesario para usted.

Si realmente entiende esas características, apuesto a que lo consideraría necesario muy pronto. :)

+0

Me doy cuenta que gran parte de lo nuevo en C# 3 fue impulsado por LINQ, como dije, sé que cada característica tiene sus usos adecuados, mi punto es que todos estos cambios, sumados, están teniendo un efecto negativo en el lenguaje. –

+0

En mi humilde opinión, si mira el número de programas escritos en cualquier idioma, encontrará todos los tipos diferentes de uso indebido. :) Por supuesto, algunos idiomas son más fáciles de usar de forma incorrecta. Como Perl. Soy geek de la arquitectura, así que creo que cada desarrollador debería pensar en esto primero. – XOR

2

he visto a su posición expresada así:

construir un entorno de desarrollo que cualquier tonto puede utilizar y lo que se obtiene es muchos tontos en desarrollo.

Esto es muy cierto, pero el resto de nosotros se ve bien por el contrario. Considero esto como algo bueno.Una de las publicaciones más divertidas que he visto señaló que

VB no debe subestimarse. Es una herramienta extremadamente poderosa para manteniendo a los idiotas fuera de este grupo de noticias [C++].

Más en serio, si una herramienta es peligrosa o no depende de la sabiduría del usuario. la única forma de evitar la locura es evitar la acción. foreach parece inofensivo, pero ni siquiera puede eliminar elementos mientras itera una colección porque eliminar un elemento invalida el iterador. Terminas arrojándolos a favor de un ciclo clásico.

1

Creo que el único problema realmente justificado en su grupo es el uso excesivo de métodos de extensión. Cuando solo se puede acceder a la funcionalidad importante a través de los métodos de extensión, a veces es difícil para todos en un grupo averiguar y usar esa funcionalidad.

Preocuparse por los inicializadores de objetos y la palabra clave "var" parece muy quisquilloso. Ambas son sintaxis simple y predecible que se pueden usar para hacer que el código sea más legible, y no me queda claro cómo se ve que se "abuse" de ellos.

Sugiero que aborde las inquietudes de este tipo mediante estándares de codificación escritos y acordados. Si nadie puede encontrar buenas razones para usar nuevas características de idioma, entonces no hay necesidad de usarlas, después de todo.

-3

¿Están justificadas mis preocupaciones?

No. Esta ha sido otra edición de respuestas simples a preguntas simples.

+0

Vótame si quieres, sé que fue una respuesta frívola. Pero la pregunta era si sus preocupaciones estaban respaldadas con la justificación adecuada, y en mi honesta opinión, no, no lo eran. Quiero decir, ¿por qué dejar de lado el clásico, "las propiedades son solo azúcar sintáctico == código malo" queja? –

0

Al menos con "var" y los inicializadores no puedes hacer nada nuevo, es solo una nueva forma de escribir cosas. Aunque parece que los inicializadores de objetos compilan a IL ligeramente diferente.

Un ángulo que realmente me hace perder de vista los métodos de extensión es que puedes ponerlos en una interfaz. Eso significa que una clase puede heredar código concreto implementando una interfaz. Y dado que una clase puede implementar múltiples interfaces, lo que significa, en una especie de rotonda, que C# ahora tiene algo así como herencia múltiple. Así que esa es una nueva característica que definitivamente debería manejarse con cuidado.

Cuestiones relacionadas