Я создал следующий простой класс
class Animal{
constructor(feet) {
this.feet = feet; //I mean paws.I think it should be in the prototype of subclass but here is an example
}
set feet(value){
if(Number.isInteger(value) && value>0) {
this._feet = value;
}
else {
//Print a message report
throw new Error('Invalid Initialization');
}
}
get feet(){
return this._feet;
}
static calcFeet(...animals)
{
return animals.reduce((prev,cur) => prev+cur.feet , 0);
}
}
const an1 = new Animal(2);
const an2 = new Animal(4);
console.log(an1.feet); //2
console.log(an2.feet); //4
console.log(Animal.calcFeet(an1,an2)); //6
У меня есть сеттер и геттер для проверки целостности значения свойства feet
и служебный метод конструктора Animal. Все хорошо, но таким образом, если я хочу изменить свойство name feet
в paws
, я должен сделать это в нескольких пунктах определения класса кода. Таким образом, я реализовал альтернативную версию:
class Animal{
constructor(paws) {
this.setPaws(paws);
}
setPaws(paws){
if(Number.isInteger(paws) && paws>0) {
this.paws = paws;
}
else {
//Print a message report
throw new Error('Invalid Initialization');
}
}
getPaws(){
return this.paws;
}
static calcFeet(...animals)
{
return animals.reduce((prev,cur) => prev+cur.getPaws() , 0);
}
}
const an1 = new Animal(2);
const an2 = new Animal(4);
console.log(an1.getPaws()); //2
console.log(an2.getPaws()); //4
console.log(Animal.calcFeet(an1,an2)); //6
Мне было интересно, является ли последняя версия более правильной, чем первая, как с точки зрения разработки программного обеспечения, так и с точки зрения стиля javascript. И если это не так, что может быть самой чистой реализацией?