El C # espacio de nombres y convenciones de nomenclatura clase / subclase cuando el espacio de nombres superior contiene la clase de base y espacios de nombres internos contienen sub-clases
-
18-09-2019 - |
Pregunta
Estoy tratando de diseñar una biblioteca de clases para una aplicación particular de la ingeniería y estoy tratando de asegurar que mis clases de espacio de nombres y convenciones de nombres tienen sentido.
Tengo la siguiente situación:
namespace Vehicle{
class Wheel{...} //base class for Wheel objects
class Engine{...} //base class for Engine objects
...
namespace Truck{
class Wheel: Vehicle.Wheel{...} //Truck specific Wheel object
class Engine: Vehicle.Engine{...} //Truck specific Engine object
...
}
namespace Car{
class Wheel: Vehicle.Wheel{...} //Car specific Wheel object
class Engine: Vehicle.Engine{...} //Car specific Engine object
...
}
...
}
El código se utiliza de manera que tendrá que ser referenciado desde dentro del mismo ámbito todas estas clases. La siguiente situación sería probable:
...
Vehicle.Wheel.DoSomething();
Vehicle.Truck.Wheel.DoSomething();
Vehicle.Car.Wheel.DoSomething();
...
En estas circunstancias, estoy mejor dar las clases de nombres más específicos
namespace Car{
class CarWheel: Vehicle.Wheel{...} //Car specific Wheel object
...
}
o salir de la nomenclatura como se muestra en el primer ejemplo y confiar en la información que está codificado en el espacio de nombres para mayor claridad? Bajo este último enfoque, supongo que me gustaría utilizar alaising para mayor claridad en el código que hace uso de esta biblioteca, corret?
Parece redundent tener:
Vehicle.Car.CarWheel
o
Vehicle.Truck.TruckEngine
pero también quiero tener nombres de clase muy descriptivos y específicos.
La filosofía de lo que estoy preguntando es si se incluye o no el espacio de nombres como parte del nombre de la clase cuando se considera si un nombre de clase es lo suficientemente descriptivo.
Solución
Por lo general los espacios de nombres están en plural, a fin de no chocar con los nombres de clase (por ejemplo, es probable que usted quiere clases denominadas Vehicle
y Car
) así que me gustaría estar inclinado a usar espacios de nombres de la siguiente manera:
namespace Vehicles;
namespace Vehicles.Cars;
namespace Vehicles.Trucks;
En cuanto a los nombres de las clases, que sería típico para prefijar el nombre de la clase con la especialización, sobre todo si son susceptibles de ser utilizados en conjunto, por lo que iba a terminar con algo como:
class CarWheel : Wheel
class TruckWheel : Wheel
Se puede ver este tipo de 'despido' por todas partes en el .NET Framework, por ejemplo, en el espacio de nombres System.Xml
prácticamente todas las clases tienen el prefijo Xml
, o en el espacio de nombres System.Data.SqlClient
mayoría de las clases tienen el prefijo Sql
. Esto significa que puede importar los espacios de nombres con la directiva using
y luego no tener que calificar totalmente los nombres de clase en todo el código, por ejemplo, cuál de los siguientes es más fácil de leer?
Vehicles.Cars.Wheel wheel = new Vehicles.Cars.Wheel();
o
CarWheel wheel = new CarWheel();
Es obvio lo que ambos están haciendo, pero la segunda es considerablemente más corto.
Tenga en cuenta que si usted incluye la especialización en el nombre, entonces es posible que usted no necesita todos los espacios de nombres anidados (.Cars
, .Trucks
, etc.) que pueden llegar a ser dolorosa si se utilizan generalmente juntos, y por lo todos los archivos de usarlos tendría que importar todos los espacios de nombres, por ejemplo
using Vehicles;
using Vehicles.Cars;
using Vehicles.Trucks;
using Vehicles.SomethingElse;
using Vehicles.YetAnotherThing;
Si usted encuentra esta misma pila de directivas using
es en la parte superior de cada archivo, y luego colapsar las clases hacia abajo en un único espacio de nombres. Por lo general, incluye toda la funcionalidad relacionada que se espera que sean utilizados conjuntamente en un único espacio de nombres, y sólo utilizar los anidados para la funcionalidad que se extiende el espacio de nombres base, pero se usa con menos frecuencia.
Otros consejos
Me intente para evitar la reutilización de nombres a través de diferentes espacios de nombres, sobre todo si un cliente lo desea, puede utilizar tanto en el mismo programa.
¿Usted realmente necesita un espacio de nombres para Car
, Truck
etc? Todos estos espacios de nombres suenan más como deberían ser clases que namespacese. Tal vez en su situación real que tiene más sentido, aunque ...