Лучшее решение, чтобы избежать борьбы с переименованием свойства в классе - PullRequest
0 голосов
/ 24 марта 2020

Я создал следующий простой класс

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. И если это не так, что может быть самой чистой реализацией?

...