He visto a menudo y se utiliza enumeraciones con atributos asociados que hacer algunas cosas básicas tales como proporcionar un nombre para mostrar o la descripción:El "Enum como objeto rico inmutable": ¿se trata de un antipatrón?
public enum Movement {
[DisplayName("Turned Right")]
TurnedRight,
[DisplayName("Turned Left")]
[Description("Execute 90 degree turn to the left")]
TurnedLeft,
// ...
}
y han tenido una serie de métodos de extensión para apoyar los atributos:
public static string GetDisplayName(this Movement movement) { ... }
public static Movement GetNextTurn(this Movement movement, ...) { ... }
Siguiendo este patrón, se podrían aplicar atributos adicionales existentes o personalizados a los campos para hacer otras cosas. Es casi como si la enumeración puede funcionar como el tipo simple valor enumerado que es y como más rica de objetos de valor inmutable con un número de campos:
public class Movement
{
public int Value { get; set; } // i.e. the type backing the enum
public string DisplayName { get; set; }
public string Description { get; set; }
public Movement GetNextTurn(...) { ... }
// ...
}
De esta manera, se pueden "viajar" como una simple campo durante la serialización, compararse rápidamente, etc. pero el comportamiento puede ser "internalizado" (ala OOP).
Dicho esto, reconozco que esto se puede considerar un antipatrón. Al mismo tiempo, una parte de mí considera que esto es lo suficientemente útil como para que el anti sea demasiado estricto.
¿Estás preguntando si es una mala idea usar este patrón en lugares donde no estarías usando una enumeración? Es un gran patrón para asociar metadatos a valores enum.No es tan bueno como un reemplazo para las clases. –
Podría considerarse un "abuso" del idioma; casi como usar 'dynamic' todo el tiempo cuando no está garantizado, por ejemplo. – Kit
No exactamente sobre el punto (de ahí el comentario), pero tengo dudas sobre la codificación de texto que se mostrará en un atributo, o en cualquier lugar cerca de una clase de entidad, para el caso. Por un lado, creo que viola groseramente la "separación de preocupaciones" y por otro, no hay forma aparente de localizarlo. Por desgracia, MS parece alentar este tipo de cosas, así que tal vez estoy fuera a almorzar. –