Entiendo el concepto de un objeto, y como programador de Java siento que el paradigma OO me resulta bastante natural en la práctica.
Sin embargo, recientemente me encontré pensando:
Espere un segundo, ¿cuáles son realmente los beneficios prácticos de usar un objeto sobre el uso de una clase estática (con las prácticas adecuadas de encapsulación y OO)?
Podría pensar en dos beneficios de usar un objeto (ambos son significativos y poderosos):
Polimorfismo: le permite intercambiar funcionalidades de forma dinámica y flexible durante el tiempo de ejecución. También permite agregar nuevas funciones 'partes' y alternativas al sistema fácilmente. Por ejemplo, si hay una
Car
clase diseñada para trabajar conEngine
objetos, y desea agregar un nuevo motor al sistema que el automóvil puede usar, puede crear una nuevaEngine
subclase y simplemente pasar un objeto de esta clase alCar
objeto, sin tener que cambiar nada acercaCar
. Y puede decidir hacerlo durante el tiempo de ejecución.Ser capaz de 'pasar funcionalidad': puede pasar un objeto alrededor del sistema de forma dinámica.
¿Pero hay más ventajas para los objetos sobre las clases estáticas?
A menudo, cuando agrego nuevas 'partes' a un sistema, lo hago creando una nueva clase e instanciando objetos a partir de él.
Pero recientemente, cuando me detuve y lo pensé, me di cuenta de que una clase estática haría lo mismo que un objeto, en muchos de los lugares donde normalmente uso un objeto.
Por ejemplo, estoy trabajando para agregar un mecanismo de guardar / cargar archivo a mi aplicación.
Con un objeto, la línea de código de llamada se verá así: Thing thing = fileLoader.load(file);
Con una clase estática, se vería así: Thing thing = FileLoader.load(file);
¿Cual es la diferencia?
Con bastante frecuencia, no puedo pensar en una razón para crear una instancia de un objeto cuando una clase estática simple y antigua actuaría de la misma manera. Pero en los sistemas OO, las clases estáticas son bastante raras. Entonces debo estar perdiendo algo.
¿Hay más ventajas para los objetos que no sean los dos que enumeré? Por favor explique.
EDITAR: Para aclarar. Sí encuentro objetos muy útiles al intercambiar funcionalidad o al pasar datos. Por ejemplo, escribí una aplicación que inventa melodías. MelodyGenerator
tenían varias subclases que crean melodías de manera diferente, y los objetos de estas clases eran intercambiables (patrón de estrategia).
Las melodías también eran objetos, ya que es útil pasarlas. También los acordes y escalas.
Pero, ¿qué pasa con las partes 'estáticas' del sistema, que no se van a pasar? Por ejemplo, un mecanismo de 'guardar archivo'. ¿Por qué debería implementarlo en un objeto y no en una clase estática?
FileLoader
por uno que lee desde un socket? ¿O un simulacro para probar? ¿O uno que abra un archivo zip?
System.Math
en .NET es un ejemplo de algo que tiene mucho más sentido como clase estática: nunca necesitará cambiarlo o burlarse de él y ninguna de las operaciones podría formar parte de una instancia. Realmente no creo que su ejemplo de "ahorro" se ajuste a esa factura.
Thing
?