2009-06-26 19 views
12

Sé que esta es una pregunta subjetiva, pero siempre tengo curiosidad acerca de las mejores prácticas en el estilo de codificación. ReSharper 4.5 me está dando una advertencia para la palabra clave "base" antes de las llamadas a métodos de base en las clases de implementación, es decir,¿Se está utilizando una mala práctica "básica" aunque podría ser buena para la legibilidad?

base.DoCommonBaseBehaviorThing(); 

Aunque aprecio el "menos es mejor" mentalidad, también he pasado mucho tiempo de depuración/manteniendo aplicaciones altamente encadenadas, y siento que podría ser útil saber que una llamada de miembro es para un objeto base con solo mirarlo. Es bastante simple cambiar las reglas de ReSharper, por supuesto, pero ¿qué piensan ustedes? ¿Debería usarse "base" al llamar a los miembros de la base?

+12

toda su base es de nosotros – JoelFan

+0

En mi humilde opinión Depende de lo que los futuros lectores (desarrolladores) piensen que es una buena legibilidad. Pregúnteles y luego responda su propia pregunta con "Depende de quién mantendrá el código". – LosManos

Respuesta

21

La única vez que debe usar base.MethodCall(); es cuando tiene un método reemplazado con el mismo nombre en la clase secundaria, pero en realidad desea llamar al método en el elemento primario.

Para todos los demás casos, solo use MethodCall();.

palabras clave como this y base no hacen que el código sea más legible y debe evitarse en todos los casos a menos que son necesarias - como en el caso que he descrito anteriormente.

+4

+1. ¿Dónde está el botón de varios votos? –

+3

"no hagas que el código sea más legible y se debe evitar" ... bueno, al menos la etiqueta subjetiva se establece –

+0

@Matthew Whited, buen punto, lo que es legible o no es muy personal ... en realidad hay personas que insisten en PERL es legible –

3

Es realmente una cuestión de preferencia personal. Si te gusta ver "base". al comienzo de sus miembros, puede desactivar fácilmente la regla (vaya a Opciones> Severidad de la inspección> Redundancias de código> Calificador 'base' redundante '). No permita que las reglas de análisis de código estático no conductuales afecten su estilo de codificación preferido.

EDITAR

Una cosa a tener en cuenta es que el análisis de código estático en FXCop y R # están ahí para proporcionar reglas para todas las necesidades posibles. Para adherirse realmente a todos de las reglas al mismo tiempo es un poco oneroso. Debe definir su estilo de codificación preferido (si está trabajando en equipo, hacerlo colectivamente), y atenerse a él. Modifique sus reglas para que coincidan con sus estándares de codificación, no al revés.

+0

No diría que esto es estilo de codificación o preferencia personal. Una llamada a base.SomeMethod() frente a una llamada a SomeMethod() puede dar el mismo efecto en algunos casos, pero las dos llamadas pueden ser fundamentalmente diferentes. – BlackWasp

+0

En ese escenario, estás en lo correcto. Me refería a los casos en que el análisis de código estático marca la "base". como redundante. En su ejemplo, no habría sido marcado. –

4

Creo que en general debería usar base solo al anular la funcionalidad anterior.

Algunos lenguajes (C# no) también proporcionan esta funcionalidad llamando a la función por su nombre de clase base explícitamente así: Foo.common() (llamado desde algún lugar en Bar, por supuesto).

Esto le permitiría saltar hacia arriba en la cadena, o elegir entre múltiples implementaciones, en el caso de herencia múltiple.

Independientemente, creo que la base debe usarse solo cuando sea necesario para llamar explícitamente a la funcionalidad de sus padres porque usted está o ha anulado esa funcionalidad en esta clase.

6

Otro punto importante a tener en cuenta es que, si bien no ha anulado ese método en la actualidad, eso no significa que no lo hará en el futuro y al prefabricar todas sus llamadas con la base. no obtendrá la nueva funcionalidad sin realizar un hallazgo y reemplazo para todas sus llamadas.

Al iniciar las llamadas con esto. no hará nada más que disminuir/aumentar la legibilidad (ignorando la situación donde dos variables en el alcance tienen el mismo nombre) la base. prefix cambiará la funcionalidad del código que escribe en muchos escenarios comunes. Entonces nunca agregaría base.a menos que sea necesario.

16

No estoy realmente seguro de usar esto es una mala práctica o no. base, sin embargo no es una cuestión de buenas o malas prácticas, sino una cuestión de semántica. Mientras que este es polimórfico, lo que significa que incluso si el método que lo usa pertenece a una clase base, usará el método modificado, base no lo es. base siempre se referirá al método definido en la clase base del método que lo llama, por lo tanto, es no polimórfico. Esta es una gran diferencia semántica. base se debe utilizar en consecuencia. Si quiere ese método, use base. Si desea que la llamada permanezca polimórfica, no use base.

+2

Me gustaría agregar lo siguiente: Al usar innecesariamente la base, si más tarde reemplaza el método en su clase, su código llamaría al método base y no al que acaba de anular. –

Cuestiones relacionadas