[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: А как подружить интерфейс и __call?
Гость_Юрий
День добрый!
Вопрос на засыпку. Класс должен реализовать некий интерфейс, но реализованы методы интерфейса посредством вызова __call. Формально, методов интерфейса в классе нет, выдаётся ошибка. Вот как быть в таком случае?



Спустя 6 минут, 12 секунд (24.09.2011 - 13:02) caballero написал(а):
Цитата
реализованы методы интерфейса посредством вызова __call.


так методы могут быть вызваны но никак не реализованы.
Класс всегда должен имплементить ВСЕ методы интерфейса на то он и интерфейс. __call тут вообще ни при чем

Спустя 4 минуты, 50 секунд (24.09.2011 - 13:07) Гость_Юрий написал(а):
Да, методы могут быть вызваны, но никак не реализованы. Это верно. А мне нужно чтобы тел методов в классе не было, но тем не менее, всё работало посредством __call да ещё и интерфейс поддерживался. Вот такая хрень.

Спустя 10 минут, 19 секунд (24.09.2011 - 13:18) caballero написал(а):
а зачем поддерживать интерфейс если не реализовывать его методы
а если они там есть то что мешает их в классе имплементить


по моему изначальная постановка задачи через заднее место

вы объявляете интерфейс и тут же юзаете __call у которго совершенно противоположная функция



Спустя 12 минут (24.09.2011 - 13:30) Гость_Юрий написал(а):
Это всё понятно. Дело в том, что класс должен быть "лёгким" и методы подгружались динамически, по мере необходимости, а не были "зашиты" в класс на этапе разработки. Но при всём при этом, хотелось бы, чтобы ещё обеспечивался какой-то интерфейс. Ну, допустим, имеет класс 100 или 200 интерфейсных методов в своём составе, все они прописаны в нём. Это же монстр. А когда методы (методы-классы) подгружаются динамически, тут оно гораздо приятнее, а быстродействие такой системы только выигрывает.

Спустя 2 минуты, 23 секунды (24.09.2011 - 13:32) Invis1ble написал(а):
не думаю, что быстродействие увеличится от постоянных вызовов __call()

Спустя 2 минуты, 57 секунд (24.09.2011 - 13:35) caballero написал(а):
Что значит продгружаются динамически? Откуда подгружаются?
где код этих методов?

во всяком случае __call никакие методы не подгружает.

и кто вообще в здравом уме делает класс с сотней методов

Спустя 5 минут, 58 секунд (24.09.2011 - 13:41) Гость_Юрий написал(а):
Тела этих методов находятся в классах-методах, классы-методы в рюкзаке (какой-то папке) класса-батюшки. Вот понадобился классу-батюшке какой-то метод, достал он его из рюкзака, поработал и снова туда и положил. Класс-батюшка лёгкий, работает быстро, места много не жрёт. А на счёт __call, это вы зря. Скорость увеличивается и очень прилично. Ну, это когда речь идёт уже о действительно больших многоуровневых системах.

Спустя 2 минуты, 54 секунды (24.09.2011 - 13:44) Гость_Юрий написал(а):
Сотня методов? ))
Бывает и больше. Ну, например, в классах для обработки графики. Там столько методов в классе. Ахнешь.

Спустя 8 минут, 21 секунда (24.09.2011 - 13:52) caballero написал(а):
Цитата
Тела этих методов находятся в классах-методах, классы-методы в рюкзаке (какой-то папке) класса-батюшки. Вот понадобился классу-батюшке какой-то метод, достал он его из рюкзака, поработал и снова туда и положил. Класс-батюшка лёгкий, работает быстро, места много не жрёт


как раз такая конструкция с сотней if else в методе __call с динамическим созданием классов и вызовом методов будет работать гораздо медленнее



Спустя 1 минута, 4 секунды (24.09.2011 - 13:53) caballero написал(а):
Цитата
Сотня методов? ))
Бывает и больше. Ну, например, в классах для обработки графики. Там столько методов в классе. Ахнешь.


У говнокодеров бывает и не такое - зачем брать за образец для подражания

Спустя 5 минут, 21 секунда (24.09.2011 - 13:59) Гость_Юрий написал(а):
Ну, это уже лирика, отклонение от темы. Потом, нет там никаких ифоф с элсами. А вот чтобы ещё и интерфейс при всём этом поддерживался - это было бы очень хорошо.

Спустя 3 минуты, 3 секунды (24.09.2011 - 14:02) caballero написал(а):
Цитата
Потом, нет там никаких ифоф с элсами.

а как принимается решение откуда метод дергать


Цитата
А вот чтобы ещё и интерфейс при всём этом поддерживался - это было бы очень хорошо.


слава Б-гу интерфейсы реализованы как положено интерфейсам, а не для диких идей

Спустя 10 минут, 32 секунды (24.09.2011 - 14:12) bodja написал(а):
Или я чего не вкуриваю или это полный изврат. biggrin.gif
Вроде как класс не предназначен для того,чтобы динамически создавать в нем методы.

Спустя 4 минуты, 2 секунды (24.09.2011 - 14:16) Гость_Юрий написал(а):
А на счёт решения откуда метод дёргать - это нужно глянуть на сигнатуру __call. Там вся информация есть.

Спустя 11 минут, 35 секунд (24.09.2011 - 14:28) caballero написал(а):
Цитата
А на счёт решения откуда метод дёргать - это нужно глянуть на сигнатуру __call. Там вся информация есть.


там есть имя функции и имя твоего класса а тебе еще надо принять решение какой подклас вызвать

то есть вместо простого вызова функции в уже скомпиленом классе имеем:

PHP ищет метод и не находит

формирует вызов __call

в __call принимается решение (неважно по if else или какому то списку ) какой класс загрузить

подгружается класс

создается екземпляр класса

делается динамический вызов функции

пхп ищет эту функцию по имени в сигнатуре класса

Свершилось!!! наконец вызывается















Спустя 7 минут, 25 секунд (24.09.2011 - 14:35) bodja написал(а):
Цитата
А на счёт решения откуда метод дёргать - это нужно глянуть на сигнатуру __call

Ню? Он есть для того ,что бы вызватся,в случае если в этом классе не найдется метода.
Будете через него ломится и искать нужный метод по всему коду? biggrin.gif

Спустя 2 минуты, 43 секунды (24.09.2011 - 14:38) Гость_Юрий написал(а):
Ну да, так и есть. Имя класса = префикс + имя метода. Всё проще пареной репы. Потом вызывается метод класса-метода и дело в шляпе. ) Кроме всего прочего метод-класс кэшируется, для последующего быстрого вызова.

Спустя 1 минута, 8 секунд (24.09.2011 - 14:39) caballero написал(а):
Цитата
Он есть для того ,что бы вызватся,в случае если в этом классе не найдется метода.
Будете через него ломится и искать нужный метод по всему коду


так он так и хочет думает что так быстрее будет
да еще что бы и интерфейс при этом поддерживался - полная каша в голове - явно курсы Попова штудировал

Спустя 1 минута, 6 секунд (24.09.2011 - 14:40) Гость_Юрий написал(а):
Вернее объект метода-класса. Он кэшируется.

Спустя 1 минута, 26 секунд (24.09.2011 - 14:42) caballero написал(а):
Цитата
Ну да, так и есть. Имя класса = префикс + имя метода. Всё проще пареной репы. Потом вызывается метод класса-метода и дело в шляпе. ) Кроме всего прочего метод-класс кэшируется, для последующего быстрого вызова.


я тебе написал сколько приседаний при этом выполнит PHP вместо простого вызова метода в тоже закешированном классе
или ты думаешь скорость вызова метода как то зависит от размера класса?

Спустя 9 минут, 50 секунд (24.09.2011 - 14:51) Гость_Юрий написал(а):
Да нет, я так не думаю. Но куда деться от 16 Мб? Когда система колом встаёт?

Спустя 49 секунд (24.09.2011 - 14:52) bodja написал(а):
Цитата
Ну да, так и есть.

Ок,
тогда Вам прийдется разруливать всю эту кашу,
но это не главное,
Вам прийдется или содавать обьекты или обращатся к существующим,
но это тоже не главное biggrin.gif
Главное то ,что интерпретатор уже должен иметь код этих обьектов,причем здесь динамическая подгрузка кода,и какая здесь экономия памяти мне не вовсем ясно.
Попробуйте поиграться с наследованием и полиморфизмом,возможно у вас получится более красивое решение.

Спустя 10 минут, 12 секунд (24.09.2011 - 15:02) caballero написал(а):
Цитата
Да нет, я так не думаю. Но куда деться от 16 Мб? Когда система колом встаёт?


так делай не один класс на сто методов
а раздели бизнес данные на разные классы соответствующие ьизнес сущностям как положено в ООП

а классы подтягивай через autoload
и тогда ничего лишнего в памяти не будет а только то что понадобилось

и прогони системму через куакой нибудь профайлер чтобы выяснить где там что встает - уверен проблемма не в размерах класса и количестве методов

Спустя 6 минут, 25 секунд (24.09.2011 - 15:09) Гость_Юрий написал(а):
Ситуации, как говорится, создаёт пользователь. В одних случаях будут загружены одни классы-методы, в других - другие. Лишнего кода в памяти нет, только то, что нужно в данный конкретный момент. Вот и вся алгебра. Как можно говорить, что нет никакой экономии?



Спустя 2 минуты, 25 секунд Гость_Юрий написал(а):
Теперь представьте, что классов используется 100-200 в одной итерации. У них есть свои методы, которые, в общем случае, могут быть в данный момент балластом. И как от него избавляться (от баласта)?



Спустя 5 минут, 40 секунд Гость_Юрий написал(а):
Возникает реальная угроза нехватки памяти, а класс-метод позволяет уходить от таких ситуаций в принципе.



Спустя 7 минут, 25 секунд Гость_Юрий написал(а):
Да, возможно, система будет работать медленее, но не не нужно будет бояться, что рано или поздно что-то переполнится.



Спустя 10 минут, 3 секунды Гость_Юрий написал(а):
Автолойд - это само-собой. Его никто не отменял.

Спустя 11 минут, 10 секунд (24.09.2011 - 15:20) caballero написал(а):
Цитата
Ситуации, как говорится, создаёт пользователь. В одних случаях будут загружены одни классы-методы, в других - другие. Лишнего кода в памяти нет, только то, что нужно в данный конкретный момент. Вот и вся алгебра. Как можно говорить, что нет никакой экономии?


именно это и решает автолоад

Цитата
Теперь представьте, что классов используется 100-200 в одной итерации.

даже представить не могу настолько фантастическую ситуацию. Такого даже в зенд фреймворке и симфони нет а уж более раздутых решений фиг сыщешь


Цитата
У них есть свои методы, которые, в общем случае, могут быть в данный момент балластом. И как от него избавляться (от баласта)?

сборщик мусора в PHP сам об этом позаботится


почему бы вам не попробовать программировать на практике а не теоретизировать
сразу все надуманные вопросы отпадут а останется только реальная проблемма
поизучайте доки сорцы типовые решения
никто так как вы предлагаете не делает даже с бодуна.


Спустя 3 минуты, 8 секунд caballero написал(а):
Цитата
Автолойд - это само-собой. Его никто не отменял.


так вы же и отменяете
точнее игнорируете
вместо готового механизма придумываете самопальную конструкцию

Спустя 12 минут, 29 секунд (24.09.2011 - 15:32) Гость_Юрий написал(а):
На практике всё уже попрограммировано-запрограммировано. Вот я и спрашиваю, как добавить поддержку интерфейса в данной ситуации. Может есть у кого соображения.

Спустя 5 минут, 48 секунд (24.09.2011 - 15:38) Invis1ble написал(а):
Да какие тут могут быть соображения... Интерфейс и вызов посредством __call() в данной ситуации - взаимоисключающие параграфы, имхо. Тут либо крестик снять, либо трусы одеть.
Имплементируешь нужные методы - __call() перестанет срабатывать, неимплементируешь - будет ошибка.

Спустя 12 минут, 38 секунд (24.09.2011 - 15:51) caballero написал(а):
Цитата
На практике всё уже попрограммировано-запрограммировано.


ЭТО - не программирование. Если все там построено на таких фантастических идеях - это мазохизм

Цитата
Вот я и спрашиваю, как добавить поддержку интерфейса в данной ситуации. Может есть у кого соображения.


Никак и главное - незачем
интерфейс здесь не имеет смысла

у интерфейса две функции - быть использованным как тип и заставлять классы имплементировать методы

первое отпадает потому как ПХП нетипизированный язык (кроме проверки instance of классов - реализаторов и типизированных параметров в php5.3+)
второе отпадает потому как нельзя имплементить класс не выполняя требования интерфейса - в этом его суть. Это касается всех языков программирования.












Спустя 21 минута, 21 секунда (24.09.2011 - 16:12) Гость_Юрий написал(а):
Да вот как раз и есть для чего. Просто так, как говорится...
Есть группа методов, которая "привыкла" к типу входной переменной. Попросту, переменная реализует интерфейс. Но в переменной много методов, которые хотелось бы перевести в классы-методы, но эти методы интерфейсные. В том то и вся проблема.

Спустя 4 минуты, 1 секунда (24.09.2011 - 16:16) Гость_Юрий написал(а):
Потом, как быть с принципом инверсии зависимостей? Интерфейсы как раз и служат этой цели. Скажем, это основная задача данной языковой конструкции.

Спустя 2 часа, 26 минут, 59 секунд (24.09.2011 - 18:43) vital написал(а):
Цитата (Гость_Юрий @ 24.09.2011 - 12:41)
Тела этих методов находятся в классах-методах, классы-методы в рюкзаке (какой-то папке) класса-батюшки. Вот понадобился классу-батюшке какой-то метод, достал он его из рюкзака, поработал и снова туда и положил. Класс-батюшка лёгкий, работает быстро, места много не жрёт. А на счёт __call, это вы зря. Скорость увеличивается и очень прилично. Ну, это когда речь идёт уже о действительно больших многоуровневых системах.

Бросайте курить.

Спустя 11 минут, 54 секунды (24.09.2011 - 18:55) caballero написал(а):
Цитата
Потом, как быть с принципом инверсии зависимостей? Интерфейсы как раз и служат этой цели. Скажем, это основная задача данной языковой конструкции.


Где вы такое вычитали?

Интерфейсы служат для того что я написал выше ни больше и не меньше.

Все остальное просто применение. С таким же успехом можно сказать что PHP или C# служат для инверсии зависимостей. И вообще подобного рода умняки появились гораздо позже интерфейсов.

Спустя 2 минуты, 4 секунды (24.09.2011 - 18:57) vital написал(а):
Цитата (Гость_Юрий @ 24.09.2011 - 15:16)
Потом, как быть с принципом инверсии зависимостей? Интерфейсы как раз и служат этой цели. Скажем, это основная задача данной языковой конструкции.

бросайте курить.

Спустя 3 минуты, 55 секунд (24.09.2011 - 19:01) Гость_Юрий написал(а):
Почему я где-то что-то должен обязательно вычитывать? Это моё собственное мнение. Ни больше и не меньше. А то, о чём сказали вы, вовсе не противоречит инверсии зависимостей.

Спустя 5 минут, 1 секунда (24.09.2011 - 19:06) caballero написал(а):
Цитата
Почему я где-то что-то должен обязательно вычитывать? Это моё собственное мнение. Ни больше и не меньше. А то, о чём сказали вы, вовсе не противоречит инверсии зависимостей.


Значит обратная проблемма - мало читаете нормальной литературы по программированию и вынуждены придумывать такое что диву даешся.

при чем тут вообще инверсия зависимостей. Это один из множества архитектурных подходов. Да, там используются классы и интерфейсы (хотя интерфейсы могут и не использоваться) но в пределах того применения для которого классы и интерфейсы созданы. Не станете ж вы утверждать что интерфейсы преднаначены, например, для MVC паттерна потому что они там могут использоватся.











Спустя 16 минут, 37 секунд (24.09.2011 - 19:23) Гость_Юрий написал(а):
Ну, тогда скажем так. Для чего вообще интерфейсы? Для того, чтобы класс имел в своём составе какие-то методы? А для чего, чтобы класс имел какие-то методы в своём составе? Чтобы подменять один класс другим? А зачем подменять один класс другим?



Спустя 39 секунд Guest написал(а):
Попахивает инверсией зависимостей, да?



Спустя 6 минут, 7 секунд Гость_Юрий написал(а):
Это языковая конструкция служит, как раз, для того, чтобы можно было осуществить инверсию зависимостей. Ни больше и не меньше.



Спустя 6 минут, 52 секунды Гость_Юрий написал(а):
А вот почитать умной литературы следует, как раз таки, вам.



Спустя 8 минут, 40 секунд Гость_Юрий написал(а):
Паттерны это отдельный разговор и инверсия зависимостей тут вовсе ни при чём.

Спустя 52 минуты, 19 секунд (24.09.2011 - 20:15) caballero написал(а):
Цитата
Для чего вообще интерфейсы? Для того, чтобы класс имел в своём составе какие-то методы? А для чего, чтобы класс имел какие-то методы в своём составе? Чтобы подменять один класс другим? А зачем подменять один класс другим?


как зачем?
у меня системма работает с разными БД с помощью некоего класса-драйвера

я хочу переключится с мускула на оракл

чтобы моя система не отвалилась я должен знать что класс драйвера оракла, разработанный сторонним девелопером, имеет все необходимыее мне методы,
поэтому я описываю интерфейс с методами типа connect и так далее
мне все равно кто и как напишет этот клас я ожидаю класс с такими методами
в типизированых языках я просто объявлю переменную типа этого интерфейса и кривой клас просто не скомпилится
в PHP я проверю объект instance of

или

воткнул мабилу в комп
он может быть как флеш а может быть как mp3 проигрыватель
а может быть как модем или Ovi store (если нокия)
потому что устройство имплементит несколько интерфейсов
системма говорит - хочешь со мной работать как флешка - реализовывай вот этот интерфейс - мне все равно как и все равно как и где ты храниш файлы. Реализовавай вот эти методы и я буду с тобой работать как с флешкой







стандартный паттерн - фабрика классов - я не знаю какой объект она мне выдаст (в смысле как называется класс) мне все равно я просто говорю дай мне класс с таким то интерфейсом


и т.д.




Цитата
Это языковая конструкция служит, как раз, для того, чтобы можно было осуществить инверсию зависимостей. Ни больше и не меньше.

она служит для сотни применений но из этого не вытекает что это ее основное назначение.


Цитата
А вот почитать умной литературы следует, как раз таки, вам.


я в программровании раньше чем ты услышал слово компьютер
и в известном учебнике Страуструпа ни про какие инверсии зависимости по поводу интерфейсов даже не упоминалось. Тогда люди занимались программированием а не надуванием щек и придумыванием всякой фигни.

так что сначала проштудируй учебник ООП для чайников и потом пиши умняки. Тут и новичков фапающих на слово "MVC" достаточно.

Цитата
Паттерны это отдельный разговор и инверсия зависимостей тут вовсе ни при чём.


Интерфейсы и инверсия зависимостей тоже разные разговоры.



Спустя 49 минут, 4 секунды (24.09.2011 - 21:04) bodja написал(а):
Цитата
Для чего вообще интерфейсы? Для того, чтобы класс имел в своём составе какие-то методы?

нет
Цитата
А для чего, чтобы класс имел какие-то методы в своём составе? Чтобы подменять один класс другим?

нет
Цитата
А зачем подменять один класс другим?

Да я вот и сам незнаю biggrin.gif

ЗЫ Вообще тут многое упирается область видимости как функций так и переменных при сохранении рациональности кода.К чему все эти выводы совсем неясно.

Спустя 47 минут, 20 секунд (24.09.2011 - 21:51) vital написал(а):
Цитата
ЗЫ Вообще тут многое упирается область видимости как функций..

Здесь все упирается в то, что автор топика - Баран.



Спустя 5 минут, 44 секунды vital написал(а):
Не понимаю зачем что-то спрашивать, заранее не собираясь прислушиваться к чужому мнению.

Спустя 7 минут, 10 секунд (24.09.2011 - 21:59) caballero написал(а):
Цитата
Вообще тут многое упирается область видимости как функций так и переменных при сохранении рациональности кода.К чему все эти выводы совсем неясно.


Класс ОБЯЗАН реализовать методы интерфейса который он имплементит. Таков синтаксис и иного компилятор даже не пропустит. Зачем какое то словоблудие.

Спустя 1 час, 9 минут, 52 секунды (24.09.2011 - 23:09) bodja написал(а):
Цитата
Класс ОБЯЗАН реализовать методы интерфейса который он имплементит

Класс ничего не обязан,он прекрасно может обойтись и без интерфейса.

Спустя 3 минуты, 39 секунд (24.09.2011 - 23:12) caballero написал(а):
Цитата
Класс ничего не обязан,он прекрасно может обойтись и без интерфейса.

а программа прекрасно обойтись без класса
и что?

Спустя 5 минут, 38 секунд (24.09.2011 - 23:18) bodja написал(а):
Цитата
а программа прекрасно обойтись без класса
и что?


А сайт без PHP
и что ? biggrin.gif biggrin.gif biggrin.gif

Спустя 1 час, 32 минуты, 8 секунд (25.09.2011 - 00:50) Гость_Greg1978 написал(а):
Я плакал!!! Особенно в начальных раскладах, caballero не ужели нельзя было объяснить начальные основы.

Спустя 9 минут, 19 секунд (25.09.2011 - 00:59) Guest написал(а):
Цитата (vital @ 24.09.2011 - 18:51)
Цитата
ЗЫ Вообще тут многое упирается область видимости как функций..

Здесь все упирается в то, что автор топика - Баран.



Спустя 5 минут, 44 секунды vital написал(а):
Не понимаю зачем что-то спрашивать, заранее не собираясь прислушиваться к чужому мнению.

А как можно опираться на мнение группы Лжеэкспертов!!!

Спустя 12 минут, 37 секунд (25.09.2011 - 01:12) vital написал(а):
Цитата (Guest @ 24.09.2011 - 23:59)
Цитата (vital @ 24.09.2011 - 18:51)
Цитата
ЗЫ Вообще тут многое упирается область видимости как функций..

Здесь все упирается в то, что автор топика - Баран.



Спустя 5 минут, 44 секунды vital написал(а):
Не понимаю зачем что-то спрашивать, заранее не собираясь прислушиваться к чужому мнению.

А как можно опираться на мнение группы Лжеэкспертов!!!

"Я люблю твороженные булочки"


 ! 

М
Последнее предупреждение: Неадекватное поведение, грубое поведение с другими людьми!
inpost
Быстрый ответ:

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