![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
MyDarkSide |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
Думаю сейчас над реализацией моделей в своем фреймворке MVC.
Пришла в голову интересная идея: статические методы модели отвечают за выборку данных из множества. А обычные члены класса реализуют сам объект модели (т.е. сущность)
следующий шаг естественно вынести методы типа getById() в базовый класс
и тут я познал дзен - комменты в AbstractModel::getById() получается как в старом анекдоте: ни денег, ни топора и вроде все правильно. |
||||
|
|||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
в чем вопрос?
|
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Пространства имен абстрактных членов классов разных уровней наследования не совпадают
|
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
я бы сделал как-то так
|
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Вот так и создаются ### фрейморки
![]() По сабжу, автор не изобретай велосипед, посмотри как сделано удобно у других и сделай так же или поучись там где это работает уже хорошо. |
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
awdev, комментируя чей-то код, выкладывай аргументы. Голые твои слова стоят ровным счетом ничего. Это на тему ### кода.
Холеварить на тему "стоит ли писать самостоятельно велосипеды" не буду, потому что для меня здесь ответ очевиден. MyDarkSide, Зачем создавать тему, в которой потом не отписываешься? Нравится, когда пинают репутацию? |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Магический метод __callStatic() тоже только в PHP 5.3 доступен.
А вообще это избитый вопрос. Ответ: никак нельзя, только переходить на PHP 5.3 |
|||
|
||||
awdev |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Вся бизнес логика должна быть спрятана в модели. Моделями управляет контроллер, какой когда запустить, собрать данные и отправить в отображение. Отсюда следует что конструктор у моделей может быть разный. Во вторых этот способ не абстрагируется. Сегодня мне нужно из БД, завтра считать с XML файла послезавтра вообще передумаю и буду брать через SOAP, в классической постановке мы меняем одну модель на другую в контроллере. Или вместо new News(new XMLClient) написали new News(new SOAPClient) и все пашет. Все остальное - остается неизменным, ваш же код будет вызывать один и тот же класс. Например мне нужно получить Новость по ID: Будет вызвано: return NewsModel(array("ID"=>10)); Или вообще захочу игнорировать все запросы. Изменить в контролере вызов NewsModel на NewsModelBlackHole - все. А у вас надо будет модель перезаписывать. То есть если я передумаю использовать эту модель, и захочу другую - мне придется перезаписывать файл NewsModel. Что, как мне кажется, не очень красиво и правильно. Это сообщение отредактировал(а) awdev - 10.12.2009, 16:26 |
||||
|
|||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
awdev, а ты не заметил, что перед кодом я написал "как то так"? Это значит что это только смысл кода, почти псевдокод. Это одно. Другое: я ответил на вопрос топикстартера так, как он был поставлен, остальное - его проблемы.
sTa1kEr, а вы пишете для версий ниже?! Добавлено через 4 минуты и 25 секунд Вообще, создается впечатление, что большинство программистов пишут под четверку и даже горядтся этим... |
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
NewDima, я не понимаю почему Вы пишите сообщение на "ты"?
Во вторых я не хотел доказывать или что-либо еще, я лишь написал видимые для меня недостатки Вашего кода. Если вы хотели написать это как псевдокод, то это не прочиталось. В любое случае, я надеюсь ответ ТС был дан. |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Ну вопрос задал не я, а ТС и судя поон пишет на версии ниже. Добавлено через 1 минуту и 8 секунд Но в этом нет ничего плохого, т.к. версия 5.3 еще очень сырая. |
|||
|
||||
MyDarkSide |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
вообще я работаю 8 часовой день, и отвечать ежечасно не могу, только вечером, днем если - только если свободная минута. к тому же обдумывал свои варианты как извратиться. Пнуть ума большого не надо. Господа холиваров не надо, пост серьезный. Принципиально пишу рамку только под пятерку, но затачивать совсем уж под самую последнюю, кажется тоже перебор. Кто виноват и что делать ? Виноват я (может нарушаю какие то концепции ООП) или ZendCo (не продумали)-на это наталкивает то что в 5.3 появилась функция get_called_class() ? что делать: изначальная идея плохая и допиливать нет смысла или идея хорошая надо допиливать реализацию ? Добавлено через 10 минут и 29 секунд именно такие рамки и сподвигли написать своё. последнее время приходится много работать с cakePHP и больше всего бесит что, весь фреймворк типа ОО а данные из моделей возвращаются в виде ассоциативных массивов. И в итоге такой отстой получается:
вообще в чем основная фишка, из тех рамок что я сомтрел, никто не разделяет по сути два разных класса: класс связанный с каким-то единственным объектом реальности (User, Post etc) - собственно модель, этот класс моделирует поведение объекта (метод isOnline() ) , и класс-коллекция однородных классов-моделей, который занимается выборкой, сохранением, ассоциированием ит.д. (метод getById() ) Это сообщение отредактировал(а) MyDarkSide - 10.12.2009, 18:13 |
||||
|
|||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
это при том, что в других ветках ты участвуешь, а в своей нет? |
|||
|
||||
MyDarkSide |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
по большому в данном случае версия 5.3 не сильно спасет потому что, использование get_called_class все равно похоже на какой-то костыль.
Т.е. когда речь идет о простых классах и членах, то класс-потомок переопределяет одноименные члены класса-родителя, другие же наследует т.е. включает в себя. А со статическими членами - поведение почему то другое. И тут возникает вопрос - поведение от Zend'a (когда механизм наследования по сути не работает в статических членах ) - правильное и соответствует каким-то догмам ООП (может быть в других языках такая же ситуация), или это все-таки не доработки |
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Ну почему, работает, члены передаются потомкам, но получается их нельзя переопределить, и стат методы выполняются в контексте того класса, где они были объявлены изначально. |
|||
|
||||
MyDarkSide |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
awdev,
если в базовом классе сделать debug_backtrace() то про класс-потомок там нет ни слова, даже если вызов метода идет из класса потомка. |
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Ну так и я про что
|
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Тему не читал, но почти наверняка подойдет фабрика )
Судя по другим прочитанным темам с таким вопросом. |
|||
|
||||
MyDarkSide |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
nerezus, сейчас именно так и сделал. завтра UML прикреплю, а в коде так:
есть два класса User extends AbstractModel и UserCollection extends AbstractCollection (здесь и далее User для примера) есть функция-фабрика Collection($name) которая производит коллекции. А коллекции в результате поиска возвращают один или массив объектов User.
|
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Как сказал один уважаемый человек, static и наследование не совместимы.
И при программировании стоит это помнить. Я не знал это и потратил 2 дня на казалось бы "мегакрутую" архитектуру. Переделал за полчаса потом за действительно норальную, т.к. не мог исправить многие косяки без кучи костылей. |
|||
|
||||
MyDarkSide |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
nerezus, именно ! та же х...я самое главное перечитал кучу манов и букварей, и нигде даже намека не было на такую "особенность" статики
|
|||
|
||||
NewDima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
MyDarkSide, блин, да это логично вытекает из самой природы статичных методов.
А по поводу фабрики, так мой код - тоже фабрика, если не заметили. Какая разница,
или
Кто скажет? Только не нужно говорить о непроизводительности магических методов и прочей чепухе. А, ну да, мы же пишем ниже 5.3.2, это главная причина |
||||
|
|||||
MyDarkSide |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
Вот когда разобъешь об это лоб - то да подумав, впринципе логично, но не мешало бы и хоть словом обмолвиться, про менее важные вещт трубят и разжёвывают, а тут какое то белое пятно, у того же Котерова про 5PHP половина книги посвящена XML, а тут хоть бы строчку... разница есть, в каждом классе модели могут быть определены свои специфические методы выборки, например для выборки сегодняшних именниников, в моем коде вызов останется прозрачным
в твоем коде
|
||||||
|
|||||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Так многие авторы делают, тот же Шилдт. |
|||
|
||||
NewDima |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Интересно, что возвращает метод getTodayIsBirthday? булево значение (судя по названию)? Что за пример ты привел? Бред какой-то Мой код будет примерно таким:
Еще раз говорю, всмотрись внимательно, между этим
и этим
разница минимальна, можно сказать, что только в записи. Первый способ: Collection('User') возвращает объект типа User, метод getById вызывается в контексте его же. Второй способ: Все намного прозрачнее |
||||||||||
|
|||||||||||
MyDarkSide |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
прежде чем хамить надо внимательно прочитать пост: во-вторых это тема НЕ про названия методов, каждый волен называть как ему нравится.
т.е. у тебя метод getUserByBirthday() - будет определен в классе Collection ? и ещё 100 других методов типа: выбрать не прочтенные комментарии, посты за сегодня, не прочтенные ПМ, кто пинал мою карму и т.д. ? как-то не очень.. |
||||
|
|||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
явное непонимание азов... читать азы здесь. Если ты бы хоть взглянул на код, который я дал, то не ответил так, как ты это сделал. Присмотрись внимательней, можешь открыть экранную клавиатуру, если тебе без нее проблема прочитать код. В общем сделай что-нибудь, прежде чем говорить про код, который ты не прочитал. В нем даже НЕТ метода getUserById, представляешь? а он будет вызываться, вот так чудо! |
|||
|
||||
MyDarkSide |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
судя по твоему коду азам могут поучить тебя даже первокурсники. Аргументирую, твой код:
1. Регулярка в методе, которая определяет какой метод "перевызвать", необходимость её применения надо обосновать. 2. Вы Очень не внимательно читаете топик-старты: 2.1 Речь идет о PHP5, но более ранем чем 5.3, соответственно функции там __callStatic() - там нет, иначе бы и мой код можно было заставить работать более прозрачным способом. 2.2 Речь идет о нормальном механизме наследования, в твоем коде, вы решаете совсем другую задачу,а именно сделать так, чтобы вызов метода типа МодельByПоле - выбирало запись из таблицы по определенному полю и всё. А что вы будете делать если надо будет добавить пагинаторы сюда, сортировки, выборки из 2 или более связанных таблиц - лепить новые регулярки ? а если выборка вообще не с полем связана а например, нужно получить время последней модификации таблицы модели, как выкручиваться будете ? наверно опять регуляркой. 3. Как работает нормальное наследование: есть базовый класс, часто объявленный как абстрактный, содержащий общее поведение для объектов своего класса, и есть его потомки, конкретизирующие поведение для своего подкласса, создается экземпляр потомка и вызов происходит методов потомка, который имеет доступ к общим методом объявленным в базовом классе, ты предлагаешь вызывать метод базового класса, который делегирует его своему потомку - наследование здесь вообще не при чем, в классе userModel можно вообще убрать "extends abstractModel". это по вашему "прозрачном" коду. Посмотрел ваш профиль
"Вэбкод" - это не увлечение (для меня по-крайней мере), это ежедневная работа по 8 часов, в т.ч. и с заказчиками которые хотят получить, то что они хотят, а не ссылки на умные статьи. Если вы где-то работаете, я бы на месте начальства по внимательнее пригляделся к вам, если не работаете - не надо строить из себя супер-гуру, которым вы не являетесь, хамом - да, гуру - нет, это разные вещи. |
||||
|
|||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
Безотносительно ко всему обсуждавшемуся в топике, а почему именно метод должен быть статическим?
И работает такое даже в PHP<5.3
|
|||
|
||||
NewDima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Ну это уже твое восприятие кода, я тебе говорил только про саму идею. Реализовывай как хочешь. Добавлено через 3 минуты и 31 секунду
А ты не смотрел, когда я поставил такой текст? Время идет. И у меня тоже есть заказчики, которые довольны результатами моей работы. И я работаю на СЕБЯ. Больше не переходи на личности Добавлено через 4 минуты и 26 секунд О, кстати, я действительно хам, можешь отметить это в карме |
||||
|
|||||
MyDarkSide |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 21.3.2008 Репутация: -1 Всего: -1 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |