Ces derniers temps, je m'inquiète de l'utilisation de classes abstraites.
Parfois, une classe abstraite est créée à l'avance et fonctionne comme un modèle de fonctionnement des classes dérivées. Cela signifie, plus ou moins, qu'ils fournissent des fonctionnalités de haut niveau mais omettent certains détails à implémenter par les classes dérivées. La classe abstraite définit la nécessité de ces détails en mettant en place des méthodes abstraites. Dans de tels cas, une classe abstraite fonctionne comme un plan directeur, une description de haut niveau de la fonctionnalité ou comme vous voulez l'appeler. Il ne peut pas être utilisé seul, mais doit être spécialisé pour définir les détails qui ont été omis de la mise en œuvre de haut niveau.
D'autres fois, il arrive que la classe abstraite soit créée après la création de certaines classes "dérivées" (puisque la classe parent / abstraite n'est pas là, elles n'ont pas encore été dérivées, mais vous savez ce que je veux dire). Dans ces cas, la classe abstraite est généralement utilisée comme un endroit où vous pouvez mettre tout type de code commun que contiennent les classes dérivées actuelles.
Ayant fait les observations ci-dessus, je me demande laquelle de ces deux affaires devrait être la règle. Devrait-on faire bouillir des détails dans la classe abstraite simplement parce qu'ils se trouvent actuellement communs à toutes les classes dérivées? Un code commun qui ne fait pas partie d'une fonctionnalité de haut niveau devrait-il être présent?
Le code qui peut ne pas avoir de sens pour la classe abstraite elle-même devrait-il être là simplement parce qu'il se trouve être commun aux classes dérivées?
Permettez-moi de donner un exemple: la classe abstraite A a une méthode a () et une méthode abstraite aq (). La méthode aq (), dans les deux classes dérivées AB et AC, utilise une méthode b (). Faut-il déplacer b () vers A? Si oui, dans le cas où quelqu'un ne regarde que A (supposons que AB et AC ne soient pas là), l'existence de b () n'aurait pas beaucoup de sens! Est-ce une mauvaise chose? Est-ce que quelqu'un devrait pouvoir regarder dans une classe abstraite et comprendre ce qui se passe sans visiter les classes dérivées?
Pour être honnête, au moment de poser cette question, j'ai tendance à croire que l'écriture d'une classe abstraite qui a du sens sans avoir à regarder dans les classes dérivées est une question de code propre et d'architecture propre. Ι n'aime pas vraiment l'idée d'une classe abstraite qui agit comme un vidage pour tout type de code se trouve être commune dans toutes les classes dérivées.
Que pensez-vous / pratiquez-vous?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Pourquoi? N'est-il pas possible qu'au cours de la conception et du développement d'une application, je découvre que plusieurs classes ont des fonctionnalités communes qui peuvent naturellement être refactorisées en une classe abstraite? Dois-je être suffisamment clairvoyant pour toujours anticiper cela avant d'écrire un code pour les classes dérivées? Si je ne parviens pas à être aussi astucieux, est-il interdit d'effectuer une telle refactorisation? Dois-je jeter mon code et recommencer?