Estoy escribiendo clases que "deben usarse de una manera específica" (supongo que todas las clases deben ...).
Por ejemplo, puedo crear la fooManager
clase, lo que requiere una llamada a, por ejemplo, Initialize(string,string)
. Y, para llevar el ejemplo un poco más lejos, la clase sería inútil si no escuchamos su ThisHappened
acción.
Mi punto es que la clase que estoy escribiendo requiere llamadas a métodos. Pero se compilará bien si no llama a esos métodos y terminará con un nuevo FooManager vacío. En algún momento, no funcionará o se bloqueará, dependiendo de la clase y de lo que haga. El programador que implementa mi clase obviamente miraría dentro y se daría cuenta de "¡Oh, no llamé Initialize!", Y estaría bien.
Pero eso no me gusta. Lo que idealmente querría es que el código NO se compile si no se llamó al método; Supongo que eso simplemente no es posible. O algo que sería inmediatamente visible y claro.
Me encuentro preocupado por el enfoque actual que tengo aquí, que es el siguiente:
Agregue un valor booleano privado en la clase y verifique en todos los lugares necesarios si la clase se inicializa; si no, lanzaré una excepción diciendo "La clase no se inicializó, ¿estás seguro de que estás llamando .Initialize(string,string)
?".
Estoy bastante de acuerdo con ese enfoque, pero conduce a una gran cantidad de código que se compila y, al final, no es necesario para el usuario final.
Además, a veces es incluso más código cuando hay más métodos que simplemente Initiliaze
llamar. Trato de mantener mis clases con no demasiados métodos / acciones públicas, pero eso no resuelve el problema, solo lo mantengo razonable.
Lo que estoy buscando aquí es:
- ¿Es correcto mi enfoque?
- Hay alguno mejor?
- ¿Qué hacen / aconsejan ustedes?
- ¿Estoy tratando de resolver un problema no? Los colegas me han dicho que es el programador el que debe verificar la clase antes de intentar usarla. Respetuosamente no estoy de acuerdo, pero creo que ese es otro asunto.
En pocas palabras, estoy tratando de encontrar una manera de nunca olvidar implementar llamadas cuando esa clase se reutiliza más tarde, o por otra persona.
Aclaraciones
Para aclarar muchas preguntas aquí:
Definitivamente no solo estoy hablando de la parte de inicialización de una clase, sino que es toda la vida. Evite que los colegas llamen a un método dos veces, asegurándose de que llamen X antes que Y, etc. Cualquier cosa que termine siendo obligatoria y en la documentación, pero que me gustaría en código y lo más simple y pequeño posible. Realmente me gustó la idea de Asserts, aunque estoy bastante seguro de que necesitaré mezclar algunas otras ideas ya que Asserts no siempre será posible.
Estoy usando el lenguaje C #! ¿Cómo no mencioné eso? Estoy en un entorno de Xamarin y estoy creando aplicaciones móviles que usualmente usan entre 6 y 9 proyectos en una solución, incluidos proyectos de PCL, iOS, Android y Windows. He sido desarrollador durante aproximadamente un año y medio (escuela y trabajo combinados), de ahí mis declaraciones / preguntas a veces ridículas. Probablemente, todo eso es irrelevante aquí, pero demasiada información no siempre es algo malo.
No siempre puedo poner todo lo que es obligatorio en el constructor, debido a las restricciones de la plataforma y al uso de Inyección de dependencias, tener parámetros distintos de Interfaces está fuera de la mesa. O tal vez mi conocimiento no es suficiente, lo cual es muy posible. La mayoría de las veces no es un problema de inicialización, sino más
¿Cómo puedo asegurarme de que se haya registrado en ese evento?
¿Cómo puedo asegurarme de que no se olvidó de "detener el proceso en algún momento"?
Aquí recuerdo una clase de obtención de anuncios. Mientras la vista donde está visible el Anuncio esté visible, la clase buscará un nuevo anuncio cada minuto. Esa clase necesita una vista cuando se construye donde puede mostrar el anuncio, que obviamente podría ir en un parámetro. Pero una vez que la vista se ha ido, se debe llamar a StopFetching (). De lo contrario, la clase seguiría buscando anuncios para una vista que ni siquiera está allí, y eso es malo.
Además, esa clase tiene eventos que deben ser escuchados, como "AdClicked", por ejemplo. Todo funciona bien si no se escucha, pero perdemos el seguimiento de la analítica allí si los grifos no están registrados. Sin embargo, el anuncio aún funciona, por lo que el usuario y el desarrollador no verán la diferencia, y los análisis solo tendrán datos incorrectos. Es necesario evitarlo, pero no estoy seguro de cómo los desarrolladores pueden saber que deben registrarse en el evento tao. Sin embargo, ese es un ejemplo simplificado, pero la idea está ahí, "¡asegúrate de que use la Acción pública que está disponible" y en los momentos correctos, por supuesto!
initialize
hacerse la llamada tarde después de la creación del objeto? ¿Sería el ctor demasiado "arriesgado" en el sentido de que podría generar excepciones y romper la cadena de creación?
new
si el objeto no está listo para ser utilizado. Confiar en un método de inicialización seguramente volverá a atormentarte y debe evitarse a menos que sea absolutamente necesario, al menos esa es mi experiencia.