Как избавиться от зависимости одного класса от другого класса?

Как организовать обмен данными между двумя классами, Tools и Config, если Config нужен API COLORS от Tools, а Tools нужен API ARGUMENTS от Config? Рассматриваю вариант с использованием сеттеров/геттеров, сейчас рассматриваю возможность применения фасадного шаблона. Подскажите, как это можно сделать, учитывая указанную проблему? В моем коде уже присутствуют следующие строки: "const config = new Config(new Tools(this));" и "const tools = new Tools(config);".
  • 4 марта 2024 г. 14:19
Ответы на вопрос 2
Для того чтобы избавиться от зависимости одного класса от другого класса и организовать обмен данными между ними, можно использовать шаблон проектирования "Фасад" (Facade). Фасадный шаблон позволяет создать унифицированный интерфейс для взаимодействия с различными классами, скрывая сложность зависимостей.

Пример реализации фасадного шаблона для ваших классов:

```javascript
class Facade {
  constructor() {
    this.config = new Config();
    this.tools = new Tools();
    this.config.setTools(this.tools);
    this.tools.setConfig(this.config);
  }

  getConfig() {
    return this.config;
  }

  getTools() {
    return this.tools;
  }
}

class Config {
  constructor() {
    this.tools = null;
  }

  setTools(tools) {
    this.tools = tools;
  }

  getApiColors() {
    return this.tools.getColors();
  }
}

class Tools {
  constructor() {
    this.config = null;
  }

  setConfig(config) {
    this.config = config;
  }

  getColors() {
    return "colors data"; // Здесь должна быть реализация получения цветов
  }

  getArguments() {
    return this.config.getArguments();
  }
}

const facade = new Facade();
const config = facade.getConfig();
const tools = facade.getTools();

console.log(config.getApiColors()); // Вывод данных API COLORS
console.log(tools.getArguments()); // Вывод данных API ARGUMENTS
```

В этом примере класс Facade создает экземпляры классов Config и Tools, устанавливает связь между ними через методы setTools и setConfig, и предоставляет удобный интерфейс для доступа к данным API COLORS и API ARGUMENTS через методы getConfig и getTools.

Таким образом, использование фасадного шаблона позволит объединить функциональность двух классов и упростить их взаимодействие, избавившись от прямых зависимостей.
Может какой-то Dependency Injection?) 

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