Всем, привет
есть набор классов что бы не устраивать халивар при обращении между ними был создан класс посредник
и теперь что бы получить какую-либо информацию от любого класса достаточно лишь вызвать функцию в классе посреднике.
это удобно т.к. если допустим у нас будет исключен 1 класс нет необходимости, везде менять код обращения и работы с ним, изменили участок в одном месте и все, но
Но возникли 2 проблемы
1)
допустим класс 1 собирается получить от класса 2 информацию, обращаясь через посредник, а класс 2 для решения указанной задачи обращается к классу 3 через посредник, который обращается к классу 1 опять через посредник =/ ...
короче говоря посредник запускается каждый раз, когда происходит поиск информации в соседних классах.
это как то криво... масло масленное, каждый раз запускается разный экземпляр класса, можно конечно сделать синглтон, но это почему, то считается признаком дурного тона в программировании
2) вторая проблема возникает если 1 класс предоставляет информацию
а 2 класс ее обрабатывает и это должно происходить в цикле
в таком случае класс посредник (оболочка) начинает брать на себя управляющие функции бизнес логики, т.е. он запускает цикл, делает запрос в цикле к первому классу и отдает на отработку данные второму классу, и по логике базовую валидацию входящих данных -наличие отсуствие информации от первого класса должен делать класс оболочка...
вообщем вопрос как реализовать взаимодействие?
Цитата |
есть набор классов что бы не устраивать халивар при обращении между ними был создан класс посредник и теперь что бы получить какую-либо информацию от любого класса достаточно лишь вызвать функцию в классе посреднике. |
Вот тут сразу остановимся. Хочется увидеться код, как все это происходит.
Эля
class modul1{
}
class modul2{
}
class posrednik{
var $modul1 =false;
var $modul2 =false;
function getModul1(){
if($this->modul1 == false){
$this->modul1 = new modul1;
}
}
function getModul2(){
if($this->modul2 == false){
$this->modul2 = new modul2;
}
}
}
т.е. posrednik класс оболочка
Я, конечно дико извиняюсь, но а зачем вам этот посредник? Пока по коду не вижу в этом необходимости. Какие задачи выполняет проект?
Michael
10.01.2019 - 10:11
Цитата (hurt3 @ 9.01.2019 - 17:23) |
есть набор классов что бы не устраивать халивар при обращении между ними был создан класс посредник |
Общение между классами, чтобы избежать зависимости, организуются посредством интерфейсов
_____________
There never was a struggle in the soul of a good man that was not hard
Michael, ты говоришь о интерфейсах каких? Интерфейсе обращения к классу или о интерфейсе как о родительском классе для классов модулей?
Я, конечно дико извиняюсь, но а зачем вам этот посредник? Пока по коду не вижу в этом необходимости. Какие задачи выполняет проект?
ну скажем так проект это аналитическая платформа, и она постоянно растет модули представляют из себя собрание классов по сбору и обработке информации, усложняется функционал и возможности существующих модулей, появляются новые. Соответственно функционал меняется, и вызовы некоторых функций в ряде модулей уже становиться недоступен.
Michael
10.01.2019 - 15:59
Цитата (Guest @ 10.01.2019 - 13:07) |
Michael, ты говоришь о интерфейсах каких? Интерфейсе обращения к классу или о интерфейсе как о родительском классе для классов модулей? |
Просто обычный интерфейс - interface
Зависимость объекта ставится не от другого объекта, а от интерфейса, что дает большую свободу.
Что там за модуля у тебя я не знаю.
Но по коду выглядит как будто ты пытаешься Service Locator переизобрести.
Сейчас в основном везде пытаются DI использовать.
Классу в конструкторе указываются его зависимости(интерфейсы), а DI уже по требованию создать объект проинжектит его нужными типами объектов.
_____________
There never was a struggle in the soul of a good man that was not hard
Michael, по описанию похоже на паттерн "абстрактная фабрика" дай пожалуйста ссылку на статью
пока что нашел
https://habr.com/post/276593/описание дается, где к интерфейсам идет обращение все также через единую точку но задействован паттерн "фасад"
Мишель, верно ли я понимаю, что в основе идеи лежит формирование структуры на основе интерфейсов для классов , в которых указаны функции для взаимодействия модулей друг с другом?
Момент еще том что, при использовании класс посредника легко размещать метки логирования и отчетности, один класс имеет все функции общения и при их вызове сохраняет информацию в журнал
Michael
я понял что за DI вот на этом и застрял в итоге получается, что DI превращается в Service Locator
допустим управляющий класс должен передать модулю 2 некую информацию, а модуль 2 вернуть ее переработанной, для этого управляющий класс запрашивает начальные данные у модуля 1
если вызов модуля 2 происходит из DI(управляющий класс) и DI предоставляет информацию модулю 2
кто должен выполнять ее валидацию?
предположим, что должен модуль2, и если информация некорректная возвращает false управляющему модулю, а тот в свою очередь должен повторно запросить у модуля 1 правильные даныные, и вот здесь уже получается цикл и цикл этот должен быть размещен в DI - другими словами в DI формируется управляющая конструкция. Взаимодействие, контроль выполняния а следовательно и бизнес логика делегируются DI. И по логике DI должен
1) иметь информацию о всех классах и их взаимодействиях
2) функционал для валидации данных т.к. это позволит сократить время обработки информации
3) управлять данными и корректировать работу модулей
другими словами DI превращается в управляющую структуру ядро (((
А модули становятся не самостоятельными единицами делегировав функционал валидации и управления ядру.
Michael
10.01.2019 - 16:40
Цитата (Guest @ 10.01.2019 - 14:15) |
Michael дай пожалуйста ссылку на статью
|
Цитата (Guest @ 10.01.2019 - 14:15) |
Michael Мишель, верно ли я понимаю, что в основе идеи лежит формирование структуры на основе интерфейсов для классов , в которых указаны функции для взаимодействия модулей друг с другом?
|
ну так это же базовый принцип, еще из Банды четырех : "программируйте в соостветствии с интерфейсом, а не с реализацией."
_____________
There never was a struggle in the soul of a good man that was not hard
Michael
забыл упомянуть, предположим у нас есть некая программа, с ядром и используемыми классами, дак вот при увеличении задач стоящих пред программой зачастую возникают задачи, которые требуют небольших решений но для их реализации необходимо реализовывать отдельный модуль. И очень велик соблазн разместить 3 строки кода в самом ядре.
допустим у нас есть система которая раз в 3 минуты обновляет данные полученные из вне. Соответственно система представлена модулями "сбора информации" с источника и модулем "корректной обработки и сохранения информации" в бд 2 задачи - два модуля 1 ядро, и вот возникает новая задача при старте работы этих модулей сохранять метку времени в отделенную таблицу. По логике необходим отдельный модуль, но из-за 1 запроса писать отдельный модуль кажется просто бредом как быть?
Michael
10.01.2019 - 16:49
DI просто позволяет разрулить зависимости.
Валидациями надо отдельно заниматься, начинать с того что делать это в том классе чьи данные валидируются.
Цитата |
По логике необходим отдельный модуль, но из-за 1 запроса писать отдельный модуль кажется просто бредом как быть? |
такие вещи обычно делаются с помощью
Событий и ИхСлушателей/Подписчиков.
Вы что фреймы никогда не смотрели?
_____________
There never was a struggle in the soul of a good man that was not hard
знаю фреймы в html в php не знаю что это.
НУ давайте еще помучаю вопросами, singleton можно использовать, как общий репозиторий данных, корректно ли его использовать в классах логирования?
Michael
10.01.2019 - 17:16
Цитата (Guest @ 10.01.2019 - 14:57) |
знаю фреймы в html в php не знаю что это. |
Я о php фреймворках - Yii, Laravel и т.д.
Насчет синглтона классического через статику, то напрямую зависимость от него не делают, это плохо.
Но например в DI таком как у Yii, классу можно указать что он будет как синглтон, т.е. не его новые версии будут другим объектам подсовываться, а все время он один.
_____________
There never was a struggle in the soul of a good man that was not hard
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.