2011-06-09 10 views
5

Esto puede sonar un poco estúpido, pero todavía tengo curiosidad sobre lo que piensa la comunidad.
Así que tengo un servicio web que devuelve una clase UpdateInfo.
Consideremos ahora las siguientes definicionesC tipo de diseño de tipo Pregunta

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK 
} 
public class FileUpdateInfo 
{ 
    public string FileName; 
    public string FileDownLoadURI; 
    public TTCFileType FileType; 
} 
public class UpdateInfo 
{ 
    public FileUpdateInfo fuInfo; 
    //Other 
} 

Aquí está la cuestión, si el TTCFileType tiene el valor TICKMARK entonces necesitará otra enumeración es decir Tickmark Tipo (las demandas lógicas biz esta información). Me pregunto cuál es la mejor manera de representar eso. No quiero un método de firma en la que tengo algo así como

UpdateMethod(UpdateInfo ui, TickMarkType tt) 

donde examino tt si ui.fuInfo.FileType == TTCFileType.TICKMARK
supongo que estoy tratando de encontrar una manera elegante semi al menos para representar el requisito condicional para conseguir la segunda pieza de información (de muchas maneras esto recuerda a VARIANTES, si var.VT == VT_ [cosa] luego usa vt. [cosa] y sí, sé cómo se sienten los desarrolladores de C# acerca de las uniones :-)
De todos modos curioso si hay una Manera ingeniosa de hacer esto Gracias

+0

Se puede usar un 'anulable ' También conocido como 'TickMarkType?', Entonces usted podría pasar en null en lugar de un 'TickMarkType' al azar si no se va a utilizar. Aunque no estoy seguro de que esto sea exactamente lo que buscas. –

+0

hmm no estoy seguro si eso es lo que quiero, de muchas maneras como dije que lo encontré interesante, no es un problema de tipo de ciencia espacial, simplemente podría recurrir a decir que sí vas a tener que tomar un tipo cuyo valor lo harás ignorar a menos que el otro parámetro sea igual a algo.La API de WIN32 está llena de cosas como esta si dwParamthing es -1, entonces pszPointer será ignorado, y así sucesivamente, no está mal hacer eso; solo me preguntaba si hay algo mejor – Rahul

Respuesta

0

Idealmente, se necesitan dos estructura adicional (s)

public enum TickmarkType 
{ 
    TYPE1=0, 
    TYPE2 
} 

public class TickMarkFileUpdateInfo : FileUpdateInfo 
{ 
    public TickmarkType type; 
} 

Y luego leer sobre polymorphism in web services

1

Solo incluya TickMarkType campo a FileUpdateInfo clase?

+0

yup que parece más simple aunque desperdiciado si el primer valor de enumeración no es TICKMARK. Sé que sé que el desperdicio no es mucho :-). Honestamente, esto es probablemente lo que voy a hacer con :-) – Rahul

0

Almacena el valor enum como un int. Agregue un desplazamiento al valor de su segunda enumeración (por ejemplo, 1000) de modo que si el valor es de la primera enumeración es 0..2 y si es de la segunda enumeración es 1000.1010 o lo que sea. Luego puede establecer 2 propiedades, una que devuelva un TTCFileType con nulos y la otra que devuelva un TickType con nulos, para leer y escribir los valores en el campo int.

+0

hmmm interesante muy interesante. Creo que esto es bastante astuto – Rahul

1

estaría tentado a ir con algo como:

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK_TYPE1 = 100, 
    TICKMARK_TYPE2 = 101, 
    TICKMARK_TYPE3 = 102 
} 

y así sucesivamente. Dependiendo de cuántos hay y qué tan manejable se sentiría dentro del contexto más amplio de su código.

+0

También haría algo como esto. Tenemos grandes enumeraciones para el tipo de entrada de registro, y las categorizamos como arriba (aunque en 1000, 2000, 3000 incramentos) – christofr

0

Parece que está tratando de usar solo estructuras de datos, cuando el uso de características de OO (como la herencia) puede ayudarlo. Tal vez este código de ejemplo le da algunas ideas:

public class Update 
{ 
    // ... ? 
} 

public class FileUpdate : Update 
{ 
    public virtual string Name { get; set; } 
    public virtual string DownloadUri { get; set; } 
    public virtual bool IsTickMarked { get; set; } 
} 

public class ApiFileUpdate : FileUpdate 
{ 
    // ... 
} 

public class BookmarkFileUpdate : FileUpdate 
{ 
    // ... 
} 

Todavía puede serializar estos, dados los atributos de serialización adecuados.

De hecho, puede definir métodos (potencialmente virtuales) en estas diversas clases, y realmente usarlos para implementar su programa.

Segregación excesiva de sus datos y el código se conoce como Anemic Domain Model Anti-Pattern.