Вопрос на засыпку. Класс должен реализовать некий интерфейс, но реализованы методы интерфейса посредством вызова __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 у которго совершенно противоположная функция
а если они там есть то что мешает их в классе имплементить
по моему изначальная постановка задачи через заднее место
вы объявляете интерфейс и тут же юзаете __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 никакие методы не подгружает.
и кто вообще в здравом уме делает класс с сотней методов
где код этих методов?
во всяком случае __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 написал(а):
Или я чего не вкуриваю или это полный изврат.
Вроде как класс не предназначен для того,чтобы динамически создавать в нем методы.
Вроде как класс не предназначен для того,чтобы динамически создавать в нем методы.
Спустя 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 |
Ню? Он есть для того ,что бы вызватся,в случае если в этом классе не найдется метода.
Будете через него ломится и искать нужный метод по всему коду?
Спустя 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 написал(а):
Цитата |
Ну да, так и есть. |
Ок,
тогда Вам прийдется разруливать всю эту кашу,
но это не главное,
Вам прийдется или содавать обьекты или обращатся к существующим,
но это тоже не главное
Главное то ,что интерпретатор уже должен иметь код этих обьектов,причем здесь динамическая подгрузка кода,и какая здесь экономия памяти мне не вовсем ясно.
Попробуйте поиграться с наследованием и полиморфизмом,возможно у вас получится более красивое решение.
Спустя 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 секунды Гость_Юрий написал(а):
Автолойд - это само-собой. Его никто не отменял.
Спустя 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() перестанет срабатывать, неимплементируешь - будет ошибка.
Имплементируешь нужные методы - __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 секунд Гость_Юрий написал(а):
Паттерны это отдельный разговор и инверсия зависимостей тут вовсе ни при чём.
Спустя 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 написал(а):
Цитата |
Для чего вообще интерфейсы? Для того, чтобы класс имел в своём составе какие-то методы? |
нет
Цитата |
А для чего, чтобы класс имел какие-то методы в своём составе? Чтобы подменять один класс другим? |
нет
Цитата |
А зачем подменять один класс другим? |
Да я вот и сам незнаю
ЗЫ Вообще тут многое упирается область видимости как функций так и переменных при сохранении рациональности кода.К чему все эти выводы совсем неясно.
Спустя 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
и что ?
Спустя 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) | ||||
А как можно опираться на мнение группы Лжеэкспертов!!! |
"Я люблю твороженные булочки"
! |
inpost |