Ya sea que esté hablando de constructores o no, de la sobrecarga bastante limitado, y cuando comienzas a correr contra sus límites, eso es una pista de que no es la herramienta adecuada para el trabajo.
Vale la pena mirar una API bien diseñada que utiliza la sobrecarga para tener una idea de para qué tipo de trabajo es buena la herramienta. XmlReader.Create
es un buen ejemplo: admite doce sobrecargas diferentes. ¡Doce! Y, sin embargo, es en realidad completamente sensata: cuando se mira a todos ellos, que se reducen a lo que, en Python, ser una sola firma vocación con parámetros opcionales:
XmlReader.Create(input [, settings [, parser_context]])
input
, con este método, puede ser una cadena que contiene una URL o nombre de archivo, TextReader
o Stream
. Pero independientemente de su tipo de datos, sigue siendo fundamentalmente lo mismo: la fuente de los datos que el XmlReader
va a leer.
Ahora veamos su caso. Olvídate de los tipos de datos por un momento. Claramente hay alguna diferencia funcional entre un status
y un idCode
en su aplicación. Su formulario se comportará de una manera si se le da un status
y otro si se le da un idCode
. La API que está proponiendo oculta esta diferencia funcional. Debe ser que ilumina.
yo consideraría primer lugar del enfoque más simple posible, que no usa sobrecargas en absoluto:
TheForm(string idCode, string status)
Haga su constructor una excepción si se proporcionan ambos valores (o si ambos son nulos). Tenga en cuenta que son mutuamente excluyentes en la documentación. Terminar.
Mi segunda opción sería:
enum FormType
{
IdCode,
Status
};
TheForm(FormType type, string data)
Esto es menos concisa, pero tiene el gran mérito de hacer que el hecho de que este método es compatible con múltiples modos mutuamente excluyentes explícita.
Llamé a esa enumeración FormType
porque me pareció un nombre sensato, dado lo que sé hasta ahora, y el hecho de que este método es un constructor. Pero cada vez que usted contempla la creación de una enumeración para determinar el tipo de una instancia, al menos debe tener en cuenta la posibilidad de que realmente debería ser la creación de un tipo para determinar el tipo de una instancia:
class TheFormWhatUsesIdCode : TheForm {...}
class TheFormWhatUsesStatus : TheForm {...}
La diferencia funcional entre idCode
y status
probablemente se relaciona con una diferencia funcional entre un formulario instanciado con idCode
y un formulario instanciado con status
. Y eso sugiere fuertemente que deberían ser subclases.
En todo este análisis, nunca he considerado la posibilidad de hacer lo que realmente pediste, que es proporcionar múltiples sobrecargas. No creo que la sobrecarga sea la herramienta adecuada para este trabajo. Si idCode
eran una int
y status
eran una string
I todavía no pensaría que una sobrecarga eran la herramienta adecuada para este trabajo, aunque probablemente no habría terminado darse cuenta de ello hasta que tuve un montón de código que necesitaba para refactorizar .
+1 Buen punto. Definitivamente debería ser su primera prioridad hacer que la API sea menos ambigua. –
-1 Ni siquiera trataste de responder la pregunta. – Trap
@Trap: lamento que no hayas gustado mi respuesta, pero no veo cómo esto no intenta responder a la pregunta. Si sigues el SRP, generalmente no necesitas muchas sobrecargas. Además, no quería cubrir las mismas sugerencias que otros pósters. –