Skip to content

Objets et structures de données

Utiliser des accesseurs (getters) et mutateurs (setters)

L'utilisation d'accesseurs et de mutateurs pour accéder aux données d'objets est préférable à l'accès direct aux propriétés. Pourquoi ? Voici une liste non organisée de raisons :

  • Lorsqu'une fonctionnalité supplémentaire est nécessaire au-delà du simple accès aux propriétés, cela évite de rechercher et modifier tous les points d'accès dans le codebase.
  • Simplifie l'ajout de validation pendant les opérations de set.
  • Encapsule la représentation interne des données.
  • Facilite l'ajout de journalisation et de gestion d'erreurs lors des accès et modifications.
  • Permet le chargement différé des propriétés depuis un serveur.

Mauvais :

javascript
function makeBankAccount() {
  // ...

  return {
    balance: 0
    // ...
  };
}

const account = makeBankAccount();
account.balance = 100;

Bon :

javascript
function makeBankAccount() {
  // this one is private
  let balance = 0;

  // a "getter", made public via the returned object below
  function getBalance() {
    return balance;
  }

  // a "setter", made public via the returned object below
  function setBalance(amount) {
    // ... validate before updating the balance
    balance = amount;
  }

  return {
    // ...
    getBalance,
    setBalance
  };
}

const account = makeBankAccount();
account.setBalance(100);

Rendre les membres des objets privés

Ceci peut être implémenté via des fermetures en ES5 et versions antérieures.

Mauvais :

javascript
const Employee = function(name) {
  this.name = name;
};

Employee.prototype.getName = function getName() {
  return this.name;
};

const employee = new Employee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: undefined

Bon :

javascript
function makeEmployee(name) {
  return {
    getName() {
      return name;
    }
  };
}

const employee = makeEmployee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe