Sur votre blog, il semble que vous maîtrisiez à la fois la programmation impérative et la programmation fonctionnelle, ainsi que les concepts de base de la programmation orientée objet, mais vous ne l’avez jamais vraiment fait. le rend utile. J'essaierai d'expliquer cette connaissance en espérant que cela vous sera utile.
Fondamentalement, la programmation orientée objet est un moyen d'utiliser le paradigme impératif pour mieux gérer les hauts niveaux de complexité en créant des structures de données "intelligentes" qui modélisent le domaine du problème. Dans un programme (procédural standard non orienté objet), vous avez deux éléments de base: les variables et le code qui sait quoi faire avec. Le code reçoit les entrées de l'utilisateur et de diverses autres sources, les stocke dans des variables, les exploite et génère des données de sortie qui parviennent à l'utilisateur ou à divers autres emplacements.
La programmation orientée objet est un moyen de simplifier votre programme en reprenant ce modèle de base et en le répétant à une plus petite échelle. Tout comme un programme est une vaste collection de données avec du code qui sait quoi en faire, chaque objet est un petit morceau de données lié à du code qui sait quoi faire avec.
En décomposant le domaine problématique en parties plus petites et en s'assurant que le maximum de données est lié directement à du code qui sait quoi en faire, il est beaucoup plus facile de raisonner sur le processus dans son ensemble et également sur le sous-système. questions qui composent le processus.
En regroupant les données dans des classes d'objets, vous pouvez centraliser le code associé à ces données, ce qui facilite la recherche et le débogage du code pertinent. Et en encapsulant les données derrière les spécificateurs d'accès et en n'y accédant que par des méthodes (ou des propriétés, si votre langue les prend en charge), vous réduisez considérablement le risque de corruption des données ou de violation des invariants.
Et en utilisant l'héritage et le polymorphisme, vous pouvez réutiliser des classes préexistantes, en les personnalisant pour répondre à vos besoins spécifiques, sans avoir à modifier les originaux ou à tout réécrire. (Ce qui est une chose que vous ne devriez jamais faire , si vous pouvez l'éviter.) Veillez simplement à bien comprendre votre objet de base, sinon vous pourriez vous retrouver avec des kangourous tueurs .
Pour moi, ce sont les principes fondamentaux de la programmation orientée objet: gestion de la complexité, centralisation du code et modélisation améliorée du domaine des problèmes par la création de classes d'objets, héritage et polymorphisme, et sécurité accrue sans sacrifier le pouvoir ou le contrôle grâce à l'encapsulation et Propriétés. J'espère que cela vous aidera à comprendre pourquoi tant de programmeurs le trouvent utile.
EDIT: En réponse à la question de Joel dans les commentaires,
Pouvez-vous expliquer ce qu'un "programme orienté objet" contient (en dehors des définitions fantaisistes que vous avez décrites) qui est fondamentalement différent d'un programme impératif? Comment faites-vous "démarrer le bal?"
Un petit avertissement ici. Mon modèle de "programme orienté objet" est essentiellement le modèle Delphi, qui est très similaire au modèle C # / .NET puisqu'il a été créé par d'anciens membres de l'équipe Delphi. Ce que je dis ici peut ne pas s'appliquer, ou pas, autant, dans d'autres langues OO.
Un programme orienté objet est un programme dans lequel toute la logique est structurée autour d'objets. Bien sûr, cela doit être démarré quelque part. Votre programme Delphi typique contient un code d’initialisation qui crée un objet singleton appelé Application
. Au début du programme, il appelle Application.Initialize
, puis appelle Application.CreateForm
pour chaque formulaire que vous souhaitez charger en mémoire depuis le début, puis Application.Run,
affiche le formulaire principal à l'écran et lance la boucle de saisie / événement qui constitue le cœur de tout programme. programmes informatiques interactifs.
Application et vos formulaires interrogent les événements entrants provenant du système d'exploitation et les traduisent en appels de méthode sur votre objet. Une chose très courante est l'utilisation de gestionnaires d'événements ou de "délégués" dans .NET. Un objet a une méthode qui dit: "Faites X et Y, mais vérifiez également si ce gestionnaire d'événements particulier est assigné et appelez-le si c'est le cas". Un gestionnaire d'événements est un pointeur de méthode, une fermeture très simple contenant une référence à la méthode et une référence à l'instance d'objet, utilisé pour étendre le comportement des objets. Par exemple, si j'ai un objet bouton sur mon formulaire, je personnalise son comportement en attachant un gestionnaire d'événements OnClick, ce qui oblige un autre objet à exécuter une méthode lorsque l'utilisateur clique sur le bouton.
Ainsi, dans un programme orienté objet, la plupart du travail est effectué en définissant des objets avec certaines responsabilités et en les reliant, soit par des pointeurs de méthode, soit par un objet appelant directement une méthode définie dans l'interface publique d'un autre objet. (Et maintenant, nous sommes de retour à l’encapsulation.) C’est une idée que je ne connaissais pas avant de prendre des cours de POO à l’université.