The single responsibility principle states that a class, module, or function should have only one reason to change, meaning it should do one thing.
For example, a class that shows the name of an animal should not be the same class that displays the kind of sound it makes and how it feeds.
Here’s an example in JavaScript:
classAnimal {constructor(name, feedingType, soundMade) {this.name = name;this.feedingType = feedingType;this.soundMade = soundMade; }nomenclature() {console.log(`The name of the animal is ${this.name}`); }sound() {console.log(`${this.name}${this.soundMade}s`); }feeding() {console.log(`${this.name} is a ${this.feedingType}`); }}let elephant =newAnimal('Elephant','herbivore','trumpet');elephant.nomenclature(); // The name of the animal is Elephantelephant.sound(); // Elephant trumpetselephant.feeding(); // Elephant is a herbivore
The code above violates the single responsibility principle because the class that's responsible for printing the name of the animal also shows the sound it makes and its type of feeding.
To fix this, you have to create a separate class for the sound and feeding methods like this:
classAnimal {constructor(name) {this.name = name; }nomenclature() {console.log(`The name of the animal is ${this.name}`); }}let animal1 =newAnimal('Elephant');animal1.nomenclature(); // The name of the animal is Elephant// Sound classclassSound {constructor(name, soundMade) {this.name = name;this.soundMade = soundMade; }sound() {console.log(`${this.name}${this.soundMade}s`); }}let animalSound1 =newSound('Elephant','trumpet');animalSound1.sound(); //Elephant trumpets// Feeding classclassFeeding {constructor(name, feedingType) {this.name = name;this.feedingType = feedingType; }feeding() {console.log(`${this.name} is a/an ${this.feedingType}`); }}let animalFeeding1 =newFeeding('Elephant','herbivore');animalFeeding1.feeding(); // Elephant is a/an herbivore
This way, each of the classes is doing only one thing:
the first one prints the name of the animal
the second prints the kind of sound it makes
and the third one prints its kind of feeding.
That’s more code, but better readability and maintainability.
A developer who didn’t write the code can come to it and understand what’s going on quicker than having it all in one class.