Je comprends le concept d'un objet, et en tant que programmeur Java, je pense que le paradigme OO me vient assez naturellement dans la pratique.
Mais récemment, je me suis retrouvé à penser:
Attendez une seconde, quels sont réellement les avantages pratiques de l'utilisation d'un objet par rapport à l'utilisation d'une classe statique (avec des pratiques d'encapsulation et OO appropriées)?
Je pourrais penser à deux avantages de l'utilisation d'un objet (les deux sont significatifs et puissants):
Polymorphisme: permet d'échanger les fonctionnalités de manière dynamique et flexible pendant l'exécution. Permet également d'ajouter facilement de nouvelles «fonctionnalités» et alternatives au système. Par exemple, s'il existe une
Car
classe conçue pour fonctionner avec desEngine
objets et que vous souhaitez ajouter un nouveau moteur au système que la voiture peut utiliser, vous pouvez créer une nouvelleEngine
sous-classe et simplement passer un objet de cette classe dans l'Car
objet, sans avoir à changer quoi que ce soitCar
. Et vous pouvez décider de le faire pendant l'exécution.Pouvoir «transmettre des fonctionnalités»: vous pouvez passer un objet autour du système de manière dynamique.
Mais y a-t-il d'autres avantages aux objets par rapport aux classes statiques?
Souvent, lorsque j'ajoute de nouvelles «pièces» à un système, je le fais en créant une nouvelle classe et en instanciant des objets à partir de celui-ci.
Mais récemment, lorsque je me suis arrêté et y ai réfléchi, j'ai réalisé qu'une classe statique ferait exactement la même chose qu'un objet, dans de nombreux endroits où j'utilise normalement un objet.
Par exemple, je travaille sur l'ajout d'un mécanisme d'enregistrement / chargement de fichier à mon application.
Avec un objet, la ligne de code appelante ressemblera à ceci: Thing thing = fileLoader.load(file);
Avec une classe statique, cela ressemblerait à ceci: Thing thing = FileLoader.load(file);
Quelle est la différence?
Assez souvent, je n'arrive pas à penser à une raison pour instancier un objet alors qu'une classe statique ordinaire agirait de la même manière. Mais dans les systèmes OO, les classes statiques sont assez rares. Je dois donc manquer quelque chose.
Y a-t-il d'autres avantages pour les objets autres que les deux que j'ai énumérés? S'il vous plaît, expliquez.
EDIT: Pour clarifier. Je trouve les objets très utiles pour échanger des fonctionnalités ou pour transmettre des données. Par exemple, j'ai écrit une application qui compose des mélodies. MelodyGenerator
avait plusieurs sous-classes qui créent des mélodies différemment, et les objets de ces classes étaient interchangeables (modèle de stratégie).
Les mélodies étaient aussi des objets, car il est utile de les faire circuler. Les accords et les gammes aussi.
Mais qu'en est-il des parties «statiques» du système - qui ne seront pas transmises? Par exemple - un mécanisme de «sauvegarde de fichier». Pourquoi devrais-je l'implémenter dans un objet et non dans une classe statique?
FileLoader
contre celui qui lit à partir d'une prise? Ou une maquette pour les tests? Ou celui qui ouvre un fichier zip?
System.Math
dans .NET est un exemple de quelque chose qui a beaucoup plus de sens en tant que classe statique: vous n'aurez jamais besoin de l'échanger ou de vous en moquer et aucune des opérations ne pourrait logiquement faire partie d'une instance. Je ne pense vraiment pas que votre exemple "d'économie" corresponde à ce projet de loi.
Thing
?