@whyamiscott

Как правильно спроектировать классы?

Допустим, у нас есть класс Employe и Company. Я хочу реализовать связь между этими двумя классами. У класса Employe будет поле company, в котором будет храниться экземпляр класса Company. У класса Company будет поле employes, которое представляло бы собой массив экземпляров класса Employe.

На js получилось бы что-то вроде этого:

function Employe(firstName, company) {
    this.firtsName = name;
    this.company = company;
}

function Company(name, employes) {
    this.name = name;
    this.employes = employes;
}


Верен ли такой подход к проектированию? Если да, то следующий вопрос: как лучше всего реализовать методы, которые бы контролировали состояния этих двух классов? Если, например, у экземпляра класса Employe измениться поле company, то у двух соответствующих экземпляров класса Company должны так же измениться поля. Как это лучше реализовать?
  • Вопрос задан
  • 487 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Это называется двусторонней many-to-one связью, и как правила вам стоит избегать оных если вот без них совсем неудобно. Скажем сотруднику совсем не обязательно знать о том что он принадлежит какой-то компании. А потому от свойства company мы можем легко и просто отказаться, если конечно у нас нет какой-то специфичной логики.

class Employe {
    constructor(firstName) {
        this.firtsName = firstName;
    }
}

class Company {
    constructor(name, employes){
        this.name = name;
        this.employes = employes;     
    }

    rename(name) {
       this.name = name;
    }

    addEmploye(employe) {
         this.eployes.push(employe);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
edli007
@edli007
full stack, team lead
А как ты это планируешь использовать?
Понятное дело эти классы только реализация, а Работники и Компании хранятся в бд.
Так что напрямую эти классы вообще могут быть не связаны, ты делаешь запрос по какому-то ид, в какое-то хранилище. Хранилищем может выступать даже массив, где ключи это ид, а вот данные уже обернуты в класс. В данном случае класс модели, так как именно модель отвечает за работу с данными.
Ответ написан
Комментировать
@AndryG
У работника сделать метод setCompany(Company) и с его помощью пусть компании прописываются у работника при изменении списка своих работников. (одна компания увольняет сотрудника, прописывая в поле работника вместо себя NULL, а вторая заполняет это поле)

Важно чтобы код, поддерживающий циклические ссылки, был один.
Очень плохой вариант, когда в обоих классах есть код, который правит одно и то же звено цепочки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы