Как понять отправку сообщения в ООП?

215
03 марта 2018, 21:54

Здравствуйте! На данный момент изучаю ООП и столкнулся с непониманием фразы "отправка сообщения".

Вот очень упрощенное изложение: Допустим у нас есть два класса 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();
Answer 1

В первом варианте объект х просто возвращает данные. Он никак не взаимодействует с объектом у. Он вообще ничего о нем не знает, более того он с ним взаимодействует через глобальную переменную 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()

READ ALSO
Kartik Editable + Popover дополнительный функционал

Kartik Editable + Popover дополнительный функционал

Подскажите пожалуйста как реализовать такой функционал, есть табличка (kartik gridview) с редактируемыми полями (editable) одно из полей - комментарий,...

202
Замена в select средством js

Замена в select средством js

Здравствуйте, есть такой скрипт и проблема происходит в том, что при выборе предыдущего варианта, он не заменяет тут значения, а добавляетПытался...

233
Изменение разметки для всех юзеров

Изменение разметки для всех юзеров

Как можно изменить разметку у всех юзеров, если event породил один?

225
Прогоресс бар выполнение задачи ajax+php

Прогоресс бар выполнение задачи ajax+php

есть такая задача: необходимо сделать прогресс бар для выполнения функции в phpесть такой цикл php

246