[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Общение классов между собой
McLotos
Добрый вечер. Работаю сейчас над взаимодействием элементов системы, пытаюсь придерживаться совета одного питониста который утверждает что классы не должны знать о существовании друг друга, т.е. общение классов допустимо только через внешнюю среду. Это очень тяжело и создает кучу лишнего кода, и гору дополнительных переменных, но это позволяет классам оставаться автономными и независимыми. На сколько независимость классов (их гибкость) важнее чем удобство разработки системы? Может стоит пересмотреть подход?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
Цитата (McLotos @ 5.09.2014 - 21:48)
пытаюсь придерживаться совета одного питониста который утверждает что классы не должны знать о существовании друг друга, т.е. общение классов допустимо только через внешнюю среду.

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

PS. Вот пример. В одном классе вводим элемент, являющийся представителем другого класса. Не наследуем.
Это будет в твоем понимании "знают о существовании друг друга" или как?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
Ну т.е. любой из существующих классов не может использовать напрямую методы и свойства другого класса для выполнения своей работы.
Основываясь на этой логике нельзя строить класс User который напрямую запрашивает данные о пользователе используя методы класса dbase который предназначен для работы с базой данных. Т.е. в идеале должно быть так:
класс dbase получает все необходимые данные из базы, полученный результат передаётся в класс User через внешний скрипт в который подключены оба класса, т.е. фактически класс User не имеет представления откуда пришли данные ему это не важно, он имеет набор свойств для будущего объекта, их источник не должен влиять на поведение класса User, а классу dbase должно быть не важно кому и куда он отдал результат своей работы

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
Цитата (McLotos @ 5.09.2014 - 22:33)
Ну т.е. любой из существующих классов не может использовать напрямую методы и свойства другого класса для выполнения своей работы.

Интересное кино... А зачем же тогда, по-твоему, публичные свойства и методы у классов?
И что значит "использование внешнего скрипта" smile.gif Мне уже очень хочется увидеть твой код, как класс User будет у тебя обращаться к классу DB, чтобы записать данные в БД. При этом, как я понял, не будут вызываться методы класса DB.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
всё просто.
Ну например как у меня сейчас сделано:
Есть класс dbase. Всё в проекте что связано с БД делается только через него.
Допустим мне нужно вывести список товаров определенной категории.
Я даю команду классу dbase чтобы получить список материалов (названия, фото, описания товаров нужной категории)
Весь этот массив я передаю в метод класса Template.
Класс template должен только построить страницу, ему не важно где я взял эти данные, он смотрит сколько раз повторяется схожий материал и клонирует элементы шаблона нужное количество раз, а потом просто подменяет данные на их значения и сохраняет результат в файл.
Получается что класс template построил страницу с использованием материалов базы данных не зная о существовании самой базы данных
На практике это будет выглядеть примерно так:
код
$db = new dBase();
$tpl = new Template();
$sql = "SELECT * FROM tbl_goods WHERE `cat`={?} AND `visibility`={?}";
$goods = $db -> select($sql,array('категория','видимый');
$tpl -> assign('GOODS',$goods);
$tpl -> ShowPage();

Ну это упрощенный пример, в оригинале есть ещё несколько методов этих классов, но к конкретному примеру они отношения не имеют

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
kaww
McLotos, ты не совсем понял, что хотел донести тебе питонщик, но говорил он правильные вещи.
Если следовать твоей логике, то получается, что метод, в котором находится код из предыдущего сообщения, не только знает о классах dBase и Template, но он даже создает их экземпляры.
Статьи википедии по теме (для базового понимания, что и как):
1. https://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%BD%D0%B8%D1%8F
2. https://ru.wikipedia.org/wiki/%D0%92%D0%BD%...%81%D1%82%D0%B8
3. https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%BD%D0%B8%D1%8F
4. https://en.wikipedia.org/wiki/Service_locator_pattern

Ну и по ходи по ссылкам в статьях.
McLotos
Цитата (kaww @ 6.09.2014 - 12:44)
что метод, в котором находится код из предыдущего сообщения,

Этот код не внутри какого-то метода, этот код просто в index.php написан.
Я же говорил что классы нигде никак не пересекаются.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
McLotos
так значит можно так и оставить? =)

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
vagrand
ИМХО только что был описан патерн MVC

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
McLotos
не понял. в чем связь?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
vagrand
Данные отдельно, контроллер отдельно и шаблоны отдельно. ВОт и выходит MVC

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
McLotos
Тогда я так и оставлю.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
bestxp
вообще тут идет речь про проектирование по модели или DDD

когда слой бизнес логики не знает об операционном слое

пример с User

есть UserSource который получает данные и запихивает их в UserCollection (откуда получаем несколько user) или просто отдает User в зависимости что надо

и сохраняет или обновляет их если получает на вход User

таким словом User по сути можно куда угодно перенести, и хранить где угодно добавляя новые UserSource ( Redis MySql Oracle MongoDB LDAP)на выбор пряча операции получения в UserSource

и все это кстати очень хорошо следует SOLID (Open closed principle )
McLotos
bestxp
как-то всё слишком заумно.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
bestxp
ну так никому сразу не дано постигнуть DDD
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.