Hello,
Je vais être direct. C’est pour ton bien.
D’abord, tes noms de classes : MyClass1, MyClass2, MyClass3 ne veulent rien dire. Si tu veux de l’aide et que ton code soit lisible, choisis des noms qui reflètent leur rôle.
Exemple :
class Order{
//...
}
class Customer{
//...
}
class Product{
//...
}
Ensuite, ce n’est pas parce que tu utilises class que tu fais de la POO. La POO n’est pas juste de la syntaxe, c’est un langage¹, un paradigme avec des règles, des concepts et des bonnes pratiques.
MyClass1 est un fourre-tout :
- Elle gère la liste globale items
- Elle gère les listes filtrées class2Items et class3Items
- Elle applique la logique de filtrage directement
Résultat, ce code est
fragile.
La méthode addItems utilise instanceof pour distinguer les types. Si demain on ajoute MyClass4, tu devras modifier le code existant au lieu de simplement l’étendre. Utilise plutôt (c'est le chien de Mickey) le polyphormisme (pour faire simple) ou une interface commune avec une méthode comme getType().
MyClass1 dépend directement des classes concrètes MyClass2 et MyClass3. Cela rend le code rigide et difficile à tester. Je te recommande de dépendre des abstractions et non des class concrètes
Ton code est fragile, couplé, et peu évolutif. Si tu veux faire de la POO, travaille avec des abstractions, isole les responsabilités, et remplace-les instanceof par du polymorphisme. En l’état, chaque ajout ou changement va multiplier les modifications et les régressions.
En reprenant l'exemple des noms de class dans ma réponse. Voici un exemple (comme je te l'ai indiqué précédemment, un attribut² est soit privé soit protégé. Il n'est pas publique !). Par convention, un caractère underscore (souligné) devant.
// Produit de base
class Product {
#name
#price
constructor(name, price) {
this.#name = name;
this.#price = price;
}
getType() {
return "generic";
}
get name() {
return this.#name;
}
get price() {
return this.#price;
}
}
// Produit spécialisé
class DigitalProduct extends Product {
getType() {
return "digital";
}
}
class PhysicalProduct extends Product {
getType() {
return "physical";
}
}
// Conteneur de produits
class Products {
#items
constructor() {
this.#items = [];
}
add(...products) {
this.#items.push(...products);
}
filterByType(type) {
return this.#items.filter(p => p.getType() === type);
}
get items() {
return [...this.#items]; // copie pour éviter modification directe
}
}
// Commande
class Order {
#customer
#products
constructor(customer, products) {
this.#customer = customer;
this.#products = products;
}
getTotal() {
return this.#products.items.reduce((sum, p) => sum + p.price, 0);
}
get products() {
return this.#products;
}
}
// Client
class Customer {
#name
#orders
constructor(name) {
this.#name = name;
this.#orders = [];
}
placeOrder(order) {
this.#orders.push(order);
}
get name() {
return this.#name;
}
get orders() {
return [...this.#orders];
}
}
// --- Démo ---
const p1 = new PhysicalProduct("Laptop", 1200);
const p2 = new DigitalProduct("E-book", 15);
const p3 = new PhysicalProduct("Mouse", 25);
const products = new Products()
products.add(p1, p2, p3)
const customer = new Customer("Alice");
const order = new Order(customer, products);
customer.placeOrder(order);
// Affichage
console.log(`Client : ${customer.name}`);
console.log(`Total commande : ${order.getTotal()} €`);
console.log(`Produits physiques :`, order.products.filterByType("physical"));
console.log(`Produits digitaux :`, order.products.filterByType("digital"));
_______
¹ l'
UML
² La couleur de tes yeux est visible publiquement, mais cela fait partie de tes gènes qui sont privés ou protégés. Ce n'est pas un objet ou une personne autre que tes parents qui les ont colorés. Tes enfants ont peut-être la même couleur de tes yeux !
Modifié par Niuxe (10 Aug 2025 - 23:12)