Le "paradigme procédural" qui avait court auparavant décrivait des codes assez touffus et finalement peu organisés (malgré les efforts pour modulariser les choses)
Ensemble de fonctions et variables non organisées, le programme n'est qu'une liste d'opérations à mener
Cette méthode apporte des limites indéniables :
Dans le paradigme "objets", le programme est un ensemble d'objets qui intéragissent entre eux.
On décrit donc les objets et leurs relations
Cette méthode apporte des avantages indéniables :
Une classe représente une idée ou un objet de la vie (voiture, personne, facture, contrat, produit, etc).
Elle possède des propriétés (ou attributs) et des méthodes (comportements, opérations, fonctions)
Un objet est une instance d'une classe.
Si la classe est un moule, l'objet est le moulage.
Les données d'une classe sont "encapsulée". C'est elle qui régule la façon dont on peut accéder ou non à ces données.
Meilleur contrôle des données et des comportements !
Pour encapsuler les données, on utilise donc les opérateurs de visibilités (qu'on peut appeler "modificateurs")
Constructeur : la fonction qui est destinée à construire l'objet lors de l'instanciation. C'est son "comportement de naissance"
Accesseurs (ou mutateurs)
// On décrit une personne (TypeScript)
class Personne {
private nom :string;
private prenom :string;
// Constructeur appelé quand on instancie une personne
constructor(nom :string, prenom :string){
this.setNom(nom);
this.prenom = prenom;
}
// Fonction qui permet de changer le nom
public setNom(nom :string) :void {
// On contrôle le fait que le nom soit en majuscules
this.nom = nom.toUpperCase();
}
public getNom() :string {
return this.nom;
}
}
var p :Personne = new Personne('duPont', 'Gérard');
p.getNom(); // renvoie 'DUPONT'
Une classe peut "hériter" d'une autre classe. Elle hérite alors des propriétés et comportements de la classe parente.
On peut alors redéfinir, spécialiser, enrichir et affiner les comportements.
// Héritage (TypeScript)
class A {
public nom :string
public disBonjour() :string {
return "Bonjour je suis " + this.nom;
}
}
// La classe B hérite de la classe A
class B extends {
public disAurevoir() :string {
return "Aurevoir, j'étais " + this.nom;
}
}
var obj = new B();
obj.nom = 'Lior';
obj.disBonjour(); // renvoie "Bonjour je suis Lior"
obj.disAurevoir(); // renvoie "Aurevoir, j'étais Lior"
Une interface est un ensemble de déclarations de méthodes. Si une classe implémente une interface, elle est obligée de redéfinir ces méthodes.
Meilleur contrôle des comportements !
// Interface (TypeScript)
interface Hello {
disBonjour();
disAurevoir();
}
// La classe A implémente l'interface Hello.
// Elle est obligée de redéfinir les fonctions
// de l'interface
class A implements Hello {
public disBonjour(){
return "Bonjour !";
}
public disAurevoir(){
return "Aurevoir !";
}
}
Deux méthodes de même nom n'ont pas les mêmes comportements
Plusieurs types :
// Polymorphisme (TypeScript)
class Personne {
public nom :string;
constructor(nom :string){
this.nom = nom;
}
public disBonjour() :string {
return "Bonjour, je suis " + this.nom;
}
}
class Pote extends Personne {
public disBonjour() :string {
return "Salut bro ! Je suis " + this.nom;
}
}
var p :Personne;
// p est une personne :
p = new Personne("Lior");
p.disBonjour(); // Renvoie "Bonjour, je suis Lior"
// p devient un pote :
p = new Pote("Lior");
p.disBonjour(); // Renvoie "Salut bro ! Je suis Lior"
Une classe abstraite est une classe qui ne peut pas être instanciée. Si on veut instancier ce type de classe, on est obligé de créer une classe fille.
Lorsqu'une méthode est déclarée abstraite, il faudra impérativement la redéfinir dans une classe fille.
Une classe déclarée finale n'a pas le droit d'être héritée.
Une fonction déclarée finale n'a pas le droit d'être redéfinie dans une classe fille.
UML est un langage de représentation qui permet de décrire une application (sous forme de schémas le plus souvent).
Ses formalismes permettent de poser et d'analyser les classes et leurs interactions.
Il existe de nombreux logiciels permettant de dessiner les diagrammes UML qui représentent une application.
Certains permettent même de générer la base du code dans le langage choisi.