Entendo o conceito de um objeto e, como programador Java, sinto que o paradigma OO vem naturalmente para mim na prática.
No entanto, recentemente, me vi pensando:
Espere um segundo, quais são realmente os benefícios práticos de usar um objeto em vez de usar uma classe estática (com práticas adequadas de encapsulamento e OO)?
Eu poderia pensar em dois benefícios do uso de um objeto (ambos são significativos e poderosos):
Polimorfismo: permite trocar funcionalidades de forma dinâmica e flexível durante o tempo de execução. Também permite adicionar novas funcionalidades 'partes' e alternativas ao sistema com facilidade. Por exemplo, se houver uma
Car
classe projetada para trabalhar comEngine
objetos e você desejar adicionar um novo mecanismo ao sistema que o carro possa usar, você poderá criar uma novaEngine
subclasse e simplesmente passar um objeto dessa classe para oCar
objeto, sem precisar mudar qualquer coisa sobreCar
. E você pode decidir fazer isso durante o tempo de execução.Ser capaz de 'passar a funcionalidade': você pode passar um objeto dinamicamente pelo sistema.
Mas existem mais vantagens em objetos do que em classes estáticas?
Frequentemente, quando adiciono novas 'partes' a um sistema, faço isso criando uma nova classe e instanciando objetos a partir dele.
Mas, recentemente, quando parei e pensei sobre isso, percebi que uma classe estática faria exatamente o mesmo que um objeto, em muitos lugares onde normalmente uso um objeto.
Por exemplo, estou trabalhando para adicionar um mecanismo de salvar / carregar arquivos ao meu aplicativo.
Com um objeto, a linha de código de chamada ficará assim: Thing thing = fileLoader.load(file);
Com uma classe estática, ficaria assim: Thing thing = FileLoader.load(file);
Qual é a diferença?
Com bastante frequência, simplesmente não consigo pensar em uma razão para instanciar um objeto quando uma classe estática simples e antiga atuaria da mesma maneira. Mas nos sistemas OO, as classes estáticas são bastante raras. Então, devo estar faltando alguma coisa.
Há mais vantagens em outros objetos que eu listei? Por favor explique.
EDIT: Para esclarecer. Acho objetos muito úteis ao trocar funcionalidades ou transmitir dados. Por exemplo, eu escrevi um aplicativo que compõe melodias. MelodyGenerator
tinha várias subclasses que criam melodias de maneira diferente e os objetos dessas classes eram intercambiáveis (padrão de estratégia).
As melodias também eram objetos, pois é útil transmiti-las. O mesmo aconteceu com os acordes e escalas.
Mas e as partes "estáticas" do sistema - que não serão divulgadas? Por exemplo - um mecanismo 'salvar arquivo'. Por que eu deveria implementá-lo em um objeto, e não em uma classe estática?
FileLoader
por um que leia de um soquete? Ou uma simulação para testar? Ou um que abre um arquivo zip?
System.Math
no .NET é um exemplo de algo que faz muito mais sentido como uma classe estática: você nunca precisará trocá-lo ou zombá-lo e nenhuma das operações logicamente poderá fazer parte de uma instância. Realmente não acho que o seu exemplo de "economia" se encaixa nessa conta.
Thing
?