McLotos
5.09.2014 - 21:48
Добрый вечер. Работаю сейчас над взаимодействием элементов системы, пытаюсь придерживаться совета одного питониста который утверждает что классы не должны знать о существовании друг друга, т.е. общение классов допустимо только через внешнюю среду. Это очень тяжело и создает кучу лишнего кода, и гору дополнительных переменных, но это позволяет классам оставаться автономными и независимыми. На сколько независимость классов (их гибкость) важнее чем удобство разработки системы? Может стоит пересмотреть подход?
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
5.09.2014 - 22:23
Цитата (McLotos @ 5.09.2014 - 21:48) |
пытаюсь придерживаться совета одного питониста который утверждает что классы не должны знать о существовании друг друга, т.е. общение классов допустимо только через внешнюю среду. |
Для начала хотелось бы знать, что имел ввиду человек и, второе, как ты его понял.
В частности, что значит для тебя "классы не должны знать о существовании друг друга"?
PS. Вот пример. В одном классе вводим элемент, являющийся представителем другого класса. Не наследуем.
Это будет в твоем понимании "знают о существовании друг друга" или как?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
McLotos
5.09.2014 - 22:33
Ну т.е. любой из существующих классов не может использовать напрямую методы и свойства другого класса для выполнения своей работы.
Основываясь на этой логике нельзя строить класс User который напрямую запрашивает данные о пользователе используя методы класса dbase который предназначен для работы с базой данных. Т.е. в идеале должно быть так:
класс dbase получает все необходимые данные из базы, полученный результат передаётся в класс User через внешний скрипт в который подключены оба класса, т.е. фактически класс User не имеет представления откуда пришли данные ему это не важно, он имеет набор свойств для будущего объекта, их источник не должен влиять на поведение класса User, а классу dbase должно быть не важно кому и куда он отдал результат своей работы
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
5.09.2014 - 22:54
Цитата (McLotos @ 5.09.2014 - 22:33) |
Ну т.е. любой из существующих классов не может использовать напрямую методы и свойства другого класса для выполнения своей работы. |
Интересное кино... А зачем же тогда, по-твоему, публичные свойства и методы у классов?
И что значит "использование внешнего скрипта"
Мне уже
очень хочется увидеть твой код, как класс User будет у тебя обращаться к классу DB, чтобы записать данные в БД. При этом, как я понял, не будут вызываться методы класса DB.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
McLotos
5.09.2014 - 23:36
всё просто.
Ну например как у меня сейчас сделано:
Есть класс 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 для перевозки зубочистки
McLotos, ты не совсем понял, что хотел донести тебе питонщик, но говорил он правильные вещи.
Если следовать твоей логике, то получается, что метод, в котором находится код из предыдущего сообщения, не только знает о классах dBase и Template, но он даже создает их экземпляры.
Статьи википедии по теме (для базового понимания, что и как):
1.
https://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%BD%D0%B8%D1%8F2.
https://ru.wikipedia.org/wiki/%D0%92%D0%BD%...%81%D1%82%D0%B83.
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%BD%D0%B8%D1%8F4.
https://en.wikipedia.org/wiki/Service_locator_patternНу и по ходи по ссылкам в статьях.
McLotos
6.09.2014 - 11:50
Цитата (kaww @ 6.09.2014 - 12:44) |
что метод, в котором находится код из предыдущего сообщения, |
Этот код не внутри какого-то метода, этот код просто в index.php написан.
Я же говорил что классы нигде никак не пересекаются.
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
McLotos
6.09.2014 - 21:57
так значит можно так и оставить? =)
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
vagrand
6.09.2014 - 23:16
ИМХО только что был описан патерн 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
7.09.2014 - 01:02
не понял. в чем связь?
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
vagrand
7.09.2014 - 10:56
Данные отдельно, контроллер отдельно и шаблоны отдельно. ВОт и выходит 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
8.09.2014 - 12:25
Тогда я так и оставлю.
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
вообще тут идет речь про проектирование по модели или DDD
когда слой бизнес логики не знает об операционном слое
пример с User
есть UserSource который получает данные и запихивает их в UserCollection (откуда получаем несколько user) или просто отдает User в зависимости что надо
и сохраняет или обновляет их если получает на вход User
таким словом User по сути можно куда угодно перенести, и хранить где угодно добавляя новые UserSource ( Redis MySql Oracle MongoDB LDAP)на выбор пряча операции получения в UserSource
и все это кстати очень хорошо следует SOLID (Open closed principle )
McLotos
8.09.2014 - 19:48
bestxp
как-то всё слишком заумно.
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
ну так никому сразу не дано постигнуть DDD
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.