Imagina esta configuración:
public interface IMass{
double Mass {get;}
}
public static class IMassExtension {
public static double ToKg(this IMass massObject) {
return massObject.Mass / 1000.0;
}
public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject)
{
return blah;
}
}
¿Está bien poner la clase de extensión en el mismo archivo que la interfaz (es decir, IMass.cs) o debería estar en un archivo separado (IMassExtension.cs)?
Una clase base no es posible aquí. Imagina
public class Person : Animal, IMass {}
y
public class House : Building, IMass {}
c#
interfaces
extension-method
Trapeador
fuente
fuente
Respuestas:
Sí, eso está totalmente bien. Además, le animo a que haga eso, ya que hace que la funcionalidad disponible en la interfaz sea más reconocible, al tiempo que reduce el ruido en "¿qué funcionalidad hay en este csproj?" Ver en estudio visual.
Los únicos argumentos que he escuchado en contra de esto son:
fuente
En resumen: tener los métodos de extensión en un archivo separado sería el enfoque a seguir. También es muy importante nombrar las extensiones apropiadamente, ya que definitivamente será un tiempo seguro durante el mantenimiento.
Definitivamente preferiría el nombre
MassExtensions
sobreIMassExtensions
. La razón es que para la mayoría de los programadores un prefijo I en un tipo implica que es una interfaz. Este es un patrón muy común y parte de las Pautas de diseño de .NET.Agregar un prefijo I para el caso del método de extensión rompe los supuestos y las pautas establecidas.
También hay prioridad para esto en la Biblioteca de clases base. La mayoría de los métodos de extensión disponibles
IEnumerable
están contenidos en el tipoEnumerable
.Las siguientes publicaciones relacionadas pueden ser útiles:
fuente
Normalmente, no pondría métodos de extensión en el mismo archivo que la interfaz. ¿La misma biblioteca / paquete? Por supuesto.
En este ejemplo, definitivamente no lo haría. ¿Qué pasaría si alguien implementara masa en unidades imperiales (babosas)? El toKg () debe estar en la interfaz (y tal vez también como toSlug (), pero técnicamente sería derivable de toKg ()), y los métodos de extensión serían métodos como toG (), toMcg (), etc., que podría implementarse utilizando los métodos de interfaz.
fuente
Lo pondría en un archivo separado y le daría un nombre más descriptivo que "IMassExtension.cs". Quizás algo así como "MassConversions.cs", ya que eso es lo que realmente hace la clase.
No olvide que los métodos de extensión todavía se pueden llamar como si fueran métodos estáticos simples (por ejemplo
MassConversions.ToKg(massObject)
), por lo que la clase debe nombrarse teniendo esto en cuenta. Además, su clase de extensión no es una interfaz, por lo que podría ser engañoso nombrarla con la 'I' principal.fuente
Animial : Mass
yBuilding : Mass
siMass
fuera una clase base?