Как можно объединить занятия в nodejs? - PullRequest
0 голосов
/ 06 марта 2020

Мне трудно понять, как наилучшим образом объединить классы (то есть создать совокупный класс сортов) в приложении nodejs. в настоящее время используемый мной шаблон дизайна ad h c и isomorphi c к приведенному ниже фрагменту:

// some arbitrary base class
class Person {
  constructor(name, rank) {
    this.name = name;
    this.rank = rank;
  }

  sit() {
    return `${this.name} is sitting!`;
  }

  stand() {
    return `${this.name} is standing!`;
  }
}

// some more elaborate class which extends base class
class Developer extends Person {
  constructor(name, rank) {
    super(name, rank);
  }

  writeCode() {
    return `${this.name}:${this.rank} is writing code!`;
  }

  eatSnacks() {
    return `${this.name}:${this.rank} is eating snacks!`;
  }
}

var candidates = [
  { name: 'adam', rank: 9 },
  { name: 'sarah', rank: 2 },
  { name: 'reed', rank: 4 },
  { name: 'sasha', rank: 3 }
];

// composition of combined/aggregate class
var team = new Person('leader', 1);
candidates.forEach((p) => {
  team[p.name] = new Developer(p.name, p.rank);
});

Есть ли что-то изначально неправильное в этом подходе? Есть ли хорошо принятый предпочтительный подход? какие-то вопиющие предостережения с моим подходом, которые я не вижу?

любой вклад или помощь будут очень цениться! заранее спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете создать класс любым удобным для вас способом. Вместо Person, представьте себе Employee и, если у них есть подчиненные.

Кроме того, вы можете сделать ваши классы более динамичными c, передав объект options.

class Employee {
  constructor(options={}) {
    this.name = options.name
    this.rank = options.rank
    this.subordinates = []
  }
  sit() {
    return `${this.name} is sitting!`
  }
  stand() {
    return `${this.name} is standing!`
  }
  addSubordinate(developer) {
    this.subordinates.push(developer)
  }
  locateSubordinate(name) {
    return this.subordinates.find(subordinate => subordinate.name === name)
  }
}

// some more elaborate class which extends base class
class Developer extends Employee {
  constructor(options={}) {
    super(options)
  }
  writeCode() {
    return `${this.name}:${this.rank} is writing code!`
  }
  eatSnacks() {
    return `${this.name}:${this.rank} is eating snacks!`
  }
}

var candidates = [
  { name: 'adam',  rank: 9 },
  { name: 'sarah', rank: 2 },
  { name: 'reed',  rank: 4 },
  { name: 'sasha', rank: 3 }
]

// composition of combined/aggregate class
var team = new Developer({ name : 'leader', rank: 1 })
candidates.forEach((config) => {
  team.addSubordinate(new Developer(config))
})

console.log(team)
console.log(team.locateSubordinate('reed').writeCode())
.as-console-wrapper { top: 0; max-height: 100% !important; }
...