Un guide du débutant sur l’abstraction dans la programmation orientée objet
Lorsque vous mangez un burrito, chacun de vos récepteurs de goût chante de joie. Chaque bouchée apporte une combinaison de différents types de saveurs, comme le salé, le sucré, l'épicé et l'umami. Chaque bouchée après cela a un goût légèrement différent car une nouvelle collection d'ingrédients unissent leurs saveurs.
Vous avez peut-être lu les ingrédients du menu, mais vous ne savez pas exactement comment la salsa est préparée. L'assaisonnement qu'ils utilisent sur leurs légumes pourrait être un mélange secret. Cependant, vous n'avez pas besoin de connaître chaque ingrédient exact. Il suffit de savoir que c'est délicieux.
Les ingrédients que vous connaissez, comme le riz blanc ordinaire, sont du béton. Les autres éléments sont abstraits. Tu sais que c'est de la salsa, mais quel genre? Ou, si quelqu'un vous tend juste un burrito sorti de nulle part, alors tout le burrito est abstrait.
L'abstraction dans l'abstrait
Avec l'héritage , l'abstraction est un concept important dans la programmation orientée objet. La théorie est que chaque objet doit fournir des résultats simples et prévisibles. Les objets doivent également partager uniquement ce qui doit être partagé.
L'abstraction garde le code et les données cachés lorsque cela est approprié
Vous pouvez considérer un burrito comme un objet. À l'intérieur du burrito, vous avez plusieurs autres objets, comme des haricots, du riz, du fromage et de la sauce piquante. Les haricots ont peut-être été assaisonnés. Le fromage pourrait être un mélange. Et la sauce piquante pourrait être une combinaison de poivrons vieillis dans du vinaigre.
Vous n'avez pas besoin de savoir comment tous les ingrédients d'un burrito ont été fabriqués. Et dans le cas des hot dogs, vous ne voulez probablement pas savoir. Tout ce qui compte, c'est qu'il ne s'effondre pas lorsque vous le mangez et qu'il est super savoureux.
L'abstraction est étroitement liée à l'encapsulation
C'est la même chose avec les objets de programmation. Lorsque vous instanciez un objet (créez-le à partir d'une classe), c'est comme commander un burrito au comptoir du food truck. Vous avez accès à certaines données, mais pas à toutes. Vous n'avez pas besoin de savoir comment fonctionne l'objet, tant que les fonctions renvoient les données correctes. Voici un burrito en JavaScript / Typescript:
class CheeseBlend {
private _ingredients = ["Colby Jack", "Cheddar", "Manchego"];
get ingredients() {
return "melted cheese";
}
}
class SecretSalsa {
private _ingredients = ["onions", "tomatoes", "cilantro", "Guatemalan Insanity Peppers"];
get ingredients() {
return "it's a secret";
}
}
class Burrito {
private _beans = "beans";
private _rice = "rice";
private _cheese: CheeseBlend = new CheeseBlend();
private _salsa: SecretSalsa = new SecretSalsa();
get cheese() {
return this._cheese.ingredients;
}
get salsa() {
return this._salsa.ingredients;
}
}
let burro = new Burrito();
console.log(burro.cheese);
console.log(burro.salsa);
Vous pouvez jouer avec ce code dans le bac à sable TypeScript .
Dans l'exemple ci-dessus, les ingrédients de la salsa et du fromage sont éliminés. Tout d'abord, ils sont encapsulés, pour cacher les ingrédients spéciaux. Ensuite, des getters sont ajoutés pour accéder aux ingrédients. Mais les ingrédients ne renvoient qu'une représentation abstraite de ce qu'ils sont vraiment.
Abstraction dans le béton
L'abstraction est cependant plus qu'un concept. Les classes peuvent également être abstraites. Cela signifie qu'ils peuvent définir d'autres classes. Mais ils ne peuvent pas être instanciés eux-mêmes.
Pourquoi les cours devraient parfois être abstraits
Imaginez que vous allez dans un restaurant et que vous vous asseyez. Le serveur vous tend un menu. Vous l'ouvrez pour découvrir qu'il n'y a qu'un seul élément: la nourriture.
C'est assez abstrait. Le commanderiez-vous? Le mangeriez-vous? Vous ne le feriez probablement pas. Dire que quelque chose est de la nourriture ne suffit pas. Il faut le décomposer en quelque chose de plus concret.
Et les pâtes? Eh bien, c'est un type d'aliment plus spécifique. Et nous savons qu'il contient probablement des nouilles et de la sauce. Mais il existe de nombreuses sortes de pâtes, donc c'est toujours abstrait.
Qu'est-ce que l'abstrait et qu'est-ce que le béton?
Fettuccine Alfredo est un exemple concret de nourriture et de pâtes. La même chose s'applique aux cours. Toutes les classes ne doivent pas être instanciées. Certaines classes ne doivent définir que la structure d'autres classes.
Voici un exemple avec une classe Food abstraite et une classe enfant MacadamiaNuts :
abstract class Food {
constructor(public name: String) {}
abstract totalCalories(): number;
abstract description(): string;
abstract flavor(): string;
}
class MacadamiaNuts extends Food {
constructor() {
super("One Cup of Macadamia Nuts");
}
totalCalories() {
return 962;
}
description() {
return "A nut from Hawaii.";
}
flavor() {
return "rich, buttery, and nutty";
}
}
let nuts = new MacadamiaNuts();
console.log(nuts.name)
console.log(nuts.description())
Les classes abstraites indiquent aux autres classes comment elles sont censées se comporter. Dans l'exemple ci-dessus, si vous allez être une classe d'aliments, vous devez avoir des fonctions qui permettent d'accéder à votre nom, saveur, description et calories.
Notez que la classe MacadamiaNuts étend Food . Cela veut dire que MacadamiaNuts s'engage à suivre les règles de l' alimentation . Notez également que le constructeur appelle super . Cette commande instancie la classe parente avant que le constructeur instancie MacadamiaNuts .
Si vous apprenez à programmer, vous pouvez vous amuser davantage avec ces jeux de programmation .
Pratique de l'abstraction
- Visitez le lien ci-dessus et utilisez le bac à sable pour créer une classe abstraite appelée Soup.
- Créez un enfant concret de la classe Soupe , appelé Cereal .
- Utilisez console.log pour tester votre code. Que se passe-t-il si votre classe Cereal ne dispose pas d'une des fonctions définies dans Soup ?
Mais quel est l'intérêt d'une classe que vous ne pouvez pas instancier?
Au début, les classes abstraites peuvent sembler inutiles. Après tout, vous ne pouvez pas les utiliser pour créer un objet. Et ce n'est pas comme s'ils transmettaient leurs fonctions. Les fonctions doivent être réécrites dans chaque classe enfant.
Il y a deux raisons principales pour lesquelles vous avez besoin de classes abstraites. Ils assurent la cohérence de votre code et s'assurent que les autres développeurs écrivent également du code cohérent. Vous ne travaillerez pas toujours seul. Toute l'équipe doit suivre les mêmes règles. Pour en savoir plus, consultez la documentation TypeScript sur les classes abstraites .