Здравствуйте! На данный момент изучаю ООП и столкнулся с непониманием фразы "отправка сообщения".
Вот очень упрощенное изложение: Допустим у нас есть два класса X и Y. В классе X есть метод getData который возвращает какие-то данные. В классе Y есть метод handleData который обрабатывает данные и возвращает новые. Вот код:
class X {
getData() {
return 'some data';
}
}
class Y {
handleData(data) {
return data + 'some operation on data';
}
}
// создаём объекты
const x = new X();
const y = new Y();
// вызываем методы
let data = x.getData();
let handledData = y.handleData(data);
И вот собственно вопрос: Можно ли сказать исходя из кода выше что объект y посылает сообщение объекту x т.к. он использует данные из объекта x?
Или же я заблуждаюсь и термин 'посылать сообщение' в ООП это если бы внутри объекта y использовался бы объект x т.е. реализация была бы такой:
class X {
getData() {
return 'some data';
}
}
class Y {
constructor() {
this._x = new X();
}
handleData() {
let data = this._x.getData();
return data + 'some operation on data';
}
}
// создаём объект
const y = new Y();
// вызываем метод
let handledData = y.handleData();
В первом варианте объект х просто возвращает данные. Он никак не взаимодействует с объектом у. Он вообще ничего о нем не знает, более того он с ним взаимодействует через глобальную переменную data. Так же как и y никак не взаимодействует с х. он просто на вход своего метода получает какие то данные хранящиеся в глобальной переменной data (непонятно как туда попавшие). Этот метод плох тем что для обработки информации используется посредник в виде переменной в глобальной области видимости.
Во втором варианте у вас уже объекты классов таки взаимодействуют между собой но то что вы написали называется композиция и это не хорошо, я бы даже сказал что это плохо и вот почему. Представим что в один прекрасный момент Вы решите переписать класс Y (даже хотя бы переименовать) все классы у которых ваш Y используется явнsм образом придется переписывать. Тогда как если использовать агрегацию ( а если копнуть глубже то паттерн "внедрение зависимостей") то ваш второй пример можно переписать как то так
class X {
getData() {
return 'some data';
}
}
class Y {
constructor(dataSource) {
this._x = dataSource;
}
handleData() {
let data = this._x.getData();
return data + 'some operation on data';
}
}
// создаём объект
const y = new Y(new X);
// вызываем метод
let handledData = y.handleData();
В итоге вы передаете в ваш Y объект который предполагаемо имеет метод getData. Тоесть вы можете в любой момент на этапе
const y = new Y(new X);
подменить X хоть Z хоть W лишm бы там был метод getData.
Но давайте представим что мы можем заранее не знать кому потребуются данные из метода getData класса X ...
На закуску чтобы вот совсем для ваших нужд - объект y посылает сообщение объекту x посмотрите на паттерн odserver
class X {
constructor () {
this.subscribers = []
}
subscribe (subscriber) {
this.subscribers.push(subscriber)
}
releaseData() {
this.subscribers.forEach(subscriber => subscriber.handleData('some data'));
}
}
class Y {
handleData(data) {
console.log(data + 'some operation on data in Y');
}
}
// создаём источника данных
const x = new X();
// создаем подписчика
const y = new Y();
// подписываемся на событие генерации данных
x.subscribe(y);
// инициируем отправку данных и получаем их в `y`
x.releaseData()
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости