¿Cómo hacen los programadores profesionales para decidir si deben ir a OOP o no? Sería realmente útil para mí.
Para mí, hay dos puntos de decisión. Primero, a veces será obvio al principio. Habrá muchos tipos similares que comparten métodos comunes que difieren ampliamente en sus detalles de implementación. Por ejemplo, estaba construyendo un sistema de flujo de trabajo y necesitaba la capacidad de implementar tareas arbitrarias. Para ejecutar la tarea, implementé una clase base de la que cada tarea heredó, con un Execute()
método abstracto. Las clases heredadas suministraron la implementación, pero el sistema de flujo de trabajo podría comenzar la ejecución sin saber qué tipo de tarea se estaba ejecutando.
Sin embargo, la mayoría de los proyectos no son tan claros. El segundo punto de decisión es cuando un subconjunto del proyecto se ha convertido en una gran maraña de declaraciones if-then o declaraciones de cambio de caso, y especialmente cuando esas declaraciones if-then requieren una gran cantidad de código de configuración para ejecutarse correctamente. Siento que empiezo a perder la lógica de lo que estoy tratando de lograr, y el código comienza a sentirse frágil. En ese punto, generalmente es una señal de que es hora de refactorizar el código en clases base con implementaciones específicas.
Una gran parte de cambiar a un estilo orientado a objetos en lugar de un estilo funcional es convertir las declaraciones if-then en declaraciones "ejecutar esta acción". En lugar de un gran conjunto de declaraciones if-then, simplemente le dice al código que ejecute su acción. La acción que realmente se ejecuta depende de la implementación que haya proporcionado.
Por ejemplo, aquí está el estilo funcional en el pseudocódigo estilo C #:
if ( action == "email" ) {
callEmailFunction(userInfo);
}
else if ( action == "sms" ) {
callSmsFunction(userInfo);
}
else if ( action == "web" ) {
endpoint = "http://127.0.0.1/confirm";
confirmWeb(endpoint, userinfo);
}
...
Pero tal vez podrías reescribir eso a algo como esto:
interface IConfirmable {
void Confirm(UserInfo userinfo);
}
public class ConfirmEmail : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmSms : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmWeb : IConfirmable {
// this is a constructor
public ConfirmWeb(string endpoint) {
...
}
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via web
}
}
Y luego el código en sí:
// An implementation that decides which implementation of the base class to use
// This replaces the if-then statements in the functional programmming.
IConfirmable confirmer = ConfirmerFactory.GetConfirmer();
// get the userinfo however you get it,
// which would be the same way you get it in the functional example.
UserInfo userinfo = ...;
// perform the action.
confirmer.Confirm(userinfo);
Ahora, cuando hay muy poco código dentro del if-then, esto parece mucho trabajo para no obtener ningún beneficio. Y cuando hay muy poco código en el si-entonces, eso es correcto: eso es mucho trabajo para el código que es más difícil de entender.
Pero el estilo orientado a objetos realmente brilla cuando tiene más de una acción que solo el Confirm()
método que debe realizarse. Tal vez tenga una rutina de inicialización, tres o más métodos de acción que se pueden ejecutar y un Cleanup()
método. El algoritmo base es idéntico, excepto que realiza sus llamadas a los objetos apropiados que implementan una clase base común. Ahora comienza a ver un beneficio real para el estilo orientado a objetos: el algoritmo base es mucho más fácil de leer que si estuviera verificando declaraciones if-then en cada paso del camino.