Вызов функции класса. Преимущества и не достатки object::function?

svetasmirnova

маленький монстрик
>Так что такое "фабрика"? :).
Ну там она ConcreteFactory
Кстати, AbstractFactory тоже можно реализовать только через статические свойства и методы. Почему бы и нет?

Да, ещё фабричные методы забыли: 3 строчки, а штука очень удобная =)

>Я не пользуюсь "массивом общих свойств" в своей практике и с радостью готов услышать нечто новое.
ОК. Как всегда неправильно выражаю мысли. Пример не из моего скрипта, но вполне нормальный. 1 класс - mapper к таблице БД, второй - Iterator обектов 1-го класса. 2-ой класс пользуется статическим массивом названий полей таблицы первого класса. 1-й класс тоже им пользуется =)
> Если используется единый интерфейс - можно применить Proxy.
А если нет?
Я говорю только об одном. Вызов
class:method намертво привязывает к имени класса, что просто уничтожает преимущества ООП.
Ну хорошо: а когда ты объект создаёшь, ты его называешь как-нибудь или только через фабрики? Всегда?
Кстати, лично я люблю статические методы помещать в абстрактных классах.
Меньшим злом будет
просто method - нет никакой необходимости пихать в класс этот функционал.
Пока namespace в PHP нет это не меньшее зло.
 

AnToXa

prodigy-одаренный ребенок
простите, что влезаю, но у вас тут секта да? :)
 

ForJest

- свежая кровь
Ну там она ConcreteFactory
Кстати, AbstractFactory тоже можно реализовать только через статические свойства и методы. Почему бы и нет?
ConcreteFactory это одна из сущностей шаблона проектирования, который называется Abstract Factory.
AbstractFactory - это тоже одна из сущностей. Там несколько участников.
Я предполагаю что у тебя недостаточно информации по поводу Abstract Factory для того чтобы вести дискуссиию об этом шаблоне :). Он имеет вполне конкретное применение - учесть разные контексты выполнения. Для разных контекстов создавать наборы связанных объектов нужного класса.
Как туда можно присобачить синглтон или статические методы - я не понимаю. Поэтому делаю вывод что твоё заявление скорее является "впечатлением" :).
> А если нет?
то значит это просто два разных класса БД. Которые можно поместить в коллекцию. Или не помещать и создать два разных синглтона. А потом одуматься и вместо двух синглтонов сделать один registry :) Ещё раз настоятельно реккомендую прочитать доклад.
> Ну хорошо: а когда ты объект создаёшь, ты его называешь как-нибудь или только через фабрики? Всегда?
В том то и разница. Что я его создаю с помощью имени класса. А не использую. Создаю я один раз а использовать я могу много раз. Один и тот же объект. И если мне нужно заменить реализацию/поведение другим классом то я делаю это в одном месте. Там где он создаётся. А не во всех местах, где он используется.
> Кстати, лично я люблю статические методы помещать в абстрактных классах.
:). Окей. Если у тебя нет больше аргументов, то давай на этом закончим. Я к сожалению не могу воспользоваться твоим опытом выраженным в "люблю", "нравится", "привычно", "удобно" :).
Мне, на данном этапе моего развития требуются обоснования, оправданность применения тех или иных конструкций. :). Спасбио за дискуссию. Свою точку зрения я выразил, твоя же заключается в "что хочу то и буду делать" как я понял :).

-~{}~ 01.09.05 19:04:

AnToXa
Окстись! Приди в светлое лоно всеблагого TDD и Кент Бэк пророк его :).
Код:
TDD 
    любит 
           тебя, 
TDD 
     любит 
             меня....
 

AnToXa

prodigy-одаренный ребенок
1. системы, как видно, развиваются постепенно и часто имет смысл сделать проще, но сейчас, а не городить всякие фабрики и проч.

2. statics полезны, когда необходимо общее поведение внутри иерархии классов и/или набора параметризуемых ими объектов. например: threads, pcntl и вообще системные штуки.

3. канечна указывать имена конкретных классов не супер в куче мест, но иногда это замена namespaces, как уже было отмечено.

4. оптимизация, хотя о ней не стоит :)

5. кстати, static var внтури класса(она не должна быть видна наружу, конечно) вполне может меняться, замещаться теми же производными классами. вот скрипт работает, работает, а потом в некоторый момент времени некоторый класс, который следит за ресурсом - бах и меняет его поведение, очень здорово, хотя static тут не имеет прямого отношения, это просто способ жестко привязать всех к одной точке раздачи, хотя и без статиков это делается, просто удобнее на мой вкус.

-~{}~ 01.09.05 20:16:

как там? AOP это называется да? :)

-~{}~ 01.09.05 20:19:

кстати, проблемы как всегда в нюансах, хотя бы в лишних строчках кода, не несущих смысловой нагрузки :)

мне, например, понравилось бы иметь класс с кучей статических методов, который внутри себя сам буддет разруливать все свои абстрактности, тогда мне не придется его создавать и запоминать имя переменной и заботиться о variable scoping, заботиться о порядке вызовов деструкторов и проч :)
 

svetasmirnova

маленький монстрик
AnToXa
А АОР это что?
ForJest
Эти все "люблю" в том числе и про п.1 в изложении AnToXa

-~{}~ 01.09.05 20:20:

AnToXa
Ну почему я так красиво говорить не умею?
/me восхищается
 

AnToXa

prodigy-одаренный ребенок
это Aspect Oriented Programming, вохуса спроси, кажется он у нас в той секте, он тебе расскажет :)

Ну почему я так красиво говорить не умею?
/me восхищается
:)
/me скромно потупил взор :)
 

svetasmirnova

маленький монстрик
ForJest
>Как туда можно присобачить синглтон или статические методы - я не понимаю.
Я тут читаю как раз GoF про 3 способа реализации этого паттерна: перечитай, может поможет присобачить?
И опять не понимаю, почему только надо тремя ограничиваться. Но это так, в порядке фантазий: не слушай, тебе же лишнего не надо.
AnToXa
Thx
 

ForJest

- свежая кровь
svetasmirnova
:). Я не пытаюсь тебя переубедить. Я с самого начала хочу узнать нечто новое. Вопроса не стоит кто прав или не прав. Я прошу примеры и я их не вижу.
Ок. Если вас уже двое :)
Приведите пожалуйста небольшой участок кода, который наглядно показывает реализацию namespace с помощью статических методов. Ну и если можно то вначале аналогичный кусок на C++ для иллюистрации того, какая функциональность заменяется. Чтобы просто не упираться в
"можно" или "возможно".

-~{}~ 02.09.05 09:48:

AnToXa
1. Да. Abstract Factory это шаблон который обычно используется когда уже все остальные шаблоны применены.
2. Тут я в принципе понял, но опять же думаю что всегда можно разнести статическую часть и остальную функциональность на два различных класса.
3. Жду примера
5. > хотя и без статиков это делается, просто удобнее на мой вкус.
О чём и речь. В докладе "Влияние TDD на дизайн кода" (http://phpclub.ru/detail/download/2005/jun-jul/phpi13_2005.pdf)наглядно показано и рассказано почему статические вызовы это зло :)
Или если просто сказать - этот вызов жёстко привязывает вызывающий класс к вызываемому. Это увеличивает связанность классов - однозначно, что делает дизайн кода менее гибким :).
-------------------
Пока что мне вот ещё не хватает ваших задекларированных namespaces чтобы увидеть весь спектр применений статических вызовов :)
 

svetasmirnova

маленький монстрик
>реализацию namespace с помощью статических методов
Реализацию сделать нельзя, но получить аналогичную выгоду можно. Тут всё просто до смешного:
PHP:
class myNamespace {
public static function trivialName1() {...}
public static function trivialName2() {...}
...
}
Т.е. это просто страховка от того, что кто-то, чей код будет использоваться совместно с твоим, придумает функцию с тем же именем. И это могут быть разработчики PHP :)
Ремарка из другой оперы. И ничего смешного: я постоянно переопределяю встроенные в DOM свойства и методы.

/me ищет понятный и убедительный пример для ForJest

-~{}~ 02.09.05 13:17:

Ну что такое namespaces... Хм.. Урезанный пример из Thinking in C++ (http://www.mindview.net/ThinkingInCPP2e.html):
PHP:
namespace X {
  void func();
}

void X::func() {
  //do smth
}

int main(){
X::func();
}
 

ForJest

- свежая кровь
svetasmirnova
т.е. тривиальным
my_trivialName1 можно добиться того же самого? Или я что-то не так понял? Обычным префиксом в имени функции, как делается во всех, в прнципе функциях PHP?
mysql_connect
pg_connect ...etс?
В чём разница
my::trivialName1
и my_trivialName1?
Ну т.е. кроме написания (более длинного за счёт ::) должны же быть какие-то выгоды?

Хм :). Спасибо конечно за ссылку, но я и так не паникую. Но что ты имела ввиду, когда мне её давала? Или это просто обычная битая ссылка?

Окей. Ты дала мне просто пример именования. Я так понимаю в C++ можно просто написать
use namespace X и пространство имён будет переключено. Но в PHP этого сделать просто нельзя ведь? Какой смысл тогда в этих конструкциях, поясни пожалуйста?
 

svetasmirnova

маленький монстрик
>Какой смысл в этих конструкциях, поясни пожалуйста?
Т.е. это просто страховка от того, что кто-то, чей код будет использоваться совместно с твоим, придумает функцию с тем же именем.
Кстати, я сюда тестик постила с производительностью. Не могу найти сейчас. Инкапсулировать чуть побыстрее работает, чем в случае засорения глобального пространства имён.
>Хм :). Спасибо конечно за ссылку, но я и так не паникую. Но что ты имела ввиду, когда мне её давала?
То, что автор должен быть упомянут. Это же не мой пример.
>Я так понимаю в C++ можно просто написать
use namespace X и пространство имён будет переключено. Но в PHP этого сделать просто нельзя ведь? Какой смысл в этих конструкциях, поясни пожалуйста?
То, что может быть переключено это не необходимость, а приятность ИМХО. А вот необходимость в исключении конфликта имён.
 

AnToXa

prodigy-одаренный ребенок
О чём и речь. В докладе "Влияние TDD на дизайн кода" (http://phpclub.ru/detail/download/2...phpi13_2005.pdf)наглядно показано и рассказано почему статические вызовы это зло :)
когда этот доклад представлялся syfisher, если я ничего не путаю, то мы сидели и с pachanga обсуждали это дело :) и как ни странно он со мной согласился, что автор черезчур категоричен :)

Или если просто сказать - этот вызов жёстко привязывает вызывающий класс к вызываемому. Это увеличивает связанность классов - однозначно, что делает дизайн кода менее гибким :).
это не так.
статический метод класса - это по сути просто synax sugar для обычной простой free function, имя класса там по сути для красоты и semantical clarity.
когда ты используешь free function ты привязываешься только к имени, и не говоришь, что теперь у тебя дизайн не расширяемый, посколько это также неверно - внутри функции можно написать что угодно, главное - назвать функцию саму правильно.

насчет твоих пунктов в цифрами: да, почти все можно сделать без статиков, но в свете пункта первого - это не всегда (a) целесообразно, (b) целесообразно именно сейчас.

-~{}~ 02.09.05 14:38:

так, насчет C++ коротенький ликбез провожу.

пишется
using namespace <namespace_name>; - это импортит целиком указанный namespace в текущий scope.
using <qualified-symbol-name>; - импортировать только конкретный символ в текущий scope.

ForJest
префиксы решают ситуацию, но namespaces удобнее по нескольким причинам: using, scoping, ADL - самые очевидные из них.

-~{}~ 02.09.05 14:40:

это я про C++ namespaces конечно :)
 

ForJest

- свежая кровь
AnToXa
Спасибо за консультацию :). Т.е. namespace получится довольно-таки не неймспейснутый :).
svetasmirnova
>Хм :). Спасибо конечно за ссылку, но я и так не паникую. Но что ты имела ввиду, когда мне её давала?
То, что автор должен быть упомянут. Это же не мой пример.
Видимо ты дала мне ссылку не проверив её. У тебя видимо устаревший букмарк. Твоя ссылка не работает. Или если она работает, то я не понимаю её назначения :).

А вот необходимость в исключении конфликта имён.
Конфликт имён может быть исключён с помощью префиксов. Запись более короткая :).
Но AnToXa уже пожалуй разъяснил мне моменты - зачем это может понадобится :).
статический метод класса - это по сути просто syntax sugar для обычной простой free function, имя класса там по сути для красоты и semantical clarity.
За что ему отдельное спасибо :)
 

svetasmirnova

маленький монстрик
Видимо ты дала мне ссылку не проверив её
да нет, я думала что ты сможешь перевести пару строчек, идущих после Don't Panic!:
What you're looking for isn't lost, it's just been moved.
Click Here to go to the home page.
Follow the links to find your resource
Он всё время книжку перемещает внутри сайта: искать лень было.
 

ForJest

- свежая кровь
Понятно :). Новый и интересный подход :). Аргументы/примеры не читать, а ещё и искать :) Причём искать должен оппонент :)
Ты же не сказала что это книжка. И что её перемещают. И что мне нужно найти.
На главную страницу я зашёл - но и там не было примеров. Ну и если ты не можешь найти сама то, что собиралась показать - зачем по сути ставить меня в ситуацию, когда я должен это делать сам?
 

svetasmirnova

маленький монстрик
Извини, это просто была отсылка к автору. Ну типа пример спёрла: нехорошо как-то. Книжки Eckel хорошие пишет: если хочешь, почитай. А к дискуссии книжка имеет косвенное отношение. Или тебе более развёрнутый пример namespace из C++ нужен?
 

ForJest

- свежая кровь
svetasmirnova
А. Теперь понятно. Я просто подумал что это ссылка на поясняющий пример или нечто такое.
С namespace мне объяснил AnToXa ну и мне достаточно теперь информации :).
 
Сверху