Программирование классами

korchasa

LIMB infected
Автор оригинала: pilot911
представь, что в setInstance передается массив с конфигами (php или xml)

как тут проверишь, что все опции правильные ?
Ты правда такой? Или притворяешься?
PHP:
function setInstance($value)
{
   if('wrong_value' == $value['settings']['db']['first_connection']['host'])
     debug();
   //остальной код
}
 

pilot911

Новичок
Автор оригинала: korchasa
Ты правда такой? Или притворяешься?
PHP:
function setInstance($value)
{
   if('wrong_value' == $value['settings']['db']['first_connection']['host'])
     debug();
   //остальной код
}
дружище, ты писал о каком-то мифическом прогере, который допускает ошибку при глобалсах, которую ищет вся команда

уверяю тебя, что if('wrong_value' == $value['settings']['db']['first_connection']['host']) не есть спасение от ошибок

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

mike

pmcoder
Теперь Netman точно будет знать как программировать классами
 

john.brown

просто кулибин
pilot911
а если бы там присутствовала system_config::instance(), материться не пришлось бы ?
Да, представь себе, не пришлось бы. Т.к. не надо было бы гадать, в каком месте деятель инициализировал свою глобальную переменную, и какого хрена она до нужного места доходит уже с другим значением. Вся работа с конфигом в одном классе, и все изменения можно хоть тем же debug_backtrace() с одного места отследить. И никакого гадания на кофейной гуще :)
 

x-yuri

Новичок
triumvirat
Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса
слово "любой" лишнее. Кроме того рассматривается только инкапсуляция полей объекта. Там же (http://tinyurl.com/b9s7wr): "Предостережение: Одна из наиболее распространенных ошибок — делать сокрытие реализации только ради сокрытия"

Используя global-сы мы привязываем класс к реализации, а не к интерфейсу. Это, в принципе, относится не только к классам, но и к функциям
ты, наверное, имел в виду поля объектов. Если же глобальные переменные, то чем они хуже Singleton'ов в плане привязки?

тривиальный пример. мы пишем якобы универсальный класс для чтения файлов
http://tinyurl.com/bk9evt
если глобальные переменные используются для передачи параметров в функцию, то 1) это не по назначению, 2) засоряет глобальное пространство имен. Если же родной класс какой-либо CMS для доступа к БД зависит от ее конфига, то что в этом плохого? Не все классы рассчитаны на перемещение в другой проект

Lightning
я тебе объясню сейчас, если ты до сих пор не понимаешь, для чего нужны синглтоны.
Пример 1 (lazy initialization)
http://tinyurl.com/crz9e2
можно сделать и без Singleton (http://tinyurl.com/ck52xb Реалии PHP/Глобальные переменные), но, думаю, в большинстве проектов такая оптимизация останется незамеченной

Паттерны проектирования - это вовсе не что-то новое.
И за их правильным использованием огромное преимущество
ключевое слово правильным, или лучше разумным. Помимо этого есть 2 крайности

pilot911 а ты считаешь, что глобальные переменные лишены недостатков и всегда лучше альтернативных вариантов?
 

pilot911

Новичок
Автор оригинала: x-yuri

pilot911 а ты считаешь, что глобальные переменные лишены недостатков и всегда лучше альтернативных вариантов?
просто пытаюсь выяснить, почему так ополчились на $GLOBALS
 

Духовность™

Продвинутый новичок
Если же глобальные переменные, то чем они хуже Singleton'ов в плане привязки?
я это выше описал. Да и не только я . Вы с pilot911 вообще читаете то, что вам пишут?
Если же родной класс какой-либо CMS для доступа к БД зависит от ее конфига, то что в этом плохого?
идеология. отступ от идеологии ведёт к повторению плохой архитектуры и выход за рамки. с таким же успехом можно спросить, что плохого в мешание php+html, ведь же РАБОТАЕТ!
просто пытаюсь выяснить, почему так ополчились на $GLOBALS
тебе это пол форума на 3 страницах разжёвывают.

-~{}~ 08.03.09 12:29:

слово "любой" лишнее.
ИМХО ставить не забывай

Кроме того рассматривается только инкапсуляция полей объекта
опять же, откуда такой вывод? Инкапсуляция относится как к полям, так и к реализации. Пользователь ничего не должен знать о внутреннем устройстве класса, пока ему не нужно вносить изменения в реализацию.
 

x-yuri

Новичок
pilot911 а когда, по твоему мнению, их целесообразно использовать, а когда нет?

я это выше описал. Да и не только я . Вы с pilot911 вообще читаете то, что вам пишут?
как тебе Sinleton поможет передавать параметры в методы. Ты, наверное, не читаешь, что тебе пишут ;-)

идеология. отступ от идеологии ведёт к повторению плохой архитектуры и выход за рамки. с таким же успехом можно спросить, что плохого в мешание php+html, ведь же РАБОТАЕТ
слепое следование идеологии так же плохо, как и ее отсутствие (http://tinyurl.com/bcy23). А в мешанение php+html ничего плохого нету. Плохо смешивать логику представления с бизнес-логикой, да и то - от размеров проекта зависит

ИМХО ставить не забывай
опять же, откуда такой вывод? Инкапсуляция относится как к полям, так и к реализации. Пользователь ничего не должен знать о внутреннем устройстве класса, пока ему не нужно вносить изменения в реализацию
но ведь потомки знают что-то о реализации родителей (protected-поля/методы)? Значит такой уровень доступа нельзя использовать: никогда не наследовать классы - только реализовывать интерфейсы. Ты так поступаешь?
 

Lightning

Трудоголик
можно сделать и без Singleton
Я знаю, но считаю что в приведенном мной примере лучше использовать синглтон.
А использование глобальных переменных через проксирующие объекты - это совсем другое решение, в отличие от использования глобалсов напрямую.

Да и вообще, нечего тут спорить, архитектурные решения зависят от многих нюансов конкретного проекта. Если pilot911 использует на полную катушку глобальные переменные и еще ни разу не наступил на грабли, значит ему просто везет :)
 

x-yuri

Новичок
Я знаю, но считаю что в приведенном мной примере лучше использовать синглтон.
А использование глобальных переменных через проксирующие объекты - это совсем другое решение, в отличие от использования глобалсов напрямую
ты просто приводил lazy initialization как аргумент против глобальных переменных, но можно сделать проксирующий объект с отложенной инициализацией глобальным

Да и вообще, нечего тут спорить, архитектурные решения зависят от многих нюансов конкретного проекта. Если pilot911 использует на полную катушку глобальные переменные и еще ни разу не наступил на грабли, значит ему просто везет
я предполагаю, что pilot911 просто не согласен, что глобальные переменные нельзя использовать _никогда_
 

Lightning

Трудоголик
я предполагаю, что pilot911 просто не согласен, что глобальные переменные нельзя использовать _никогда_
У меня как-то само собой получается не использовать глобальные переменные почти никогда. "Почти" - это значит, что есть пару исключений. Например, твой пример про
родной класс какой-либо CMS для доступа к БД зависит от ее конфига
иногда конфиг нельзя полностью сделать на константах и приходится использовать глобальные переменные. Но в таком случае, я делаю специальные методы для чтения этих переменных, т.к. использование одной и той же глобальной переменной в различных методах я уже считаю дублированием логики, которое может помешать усложнить архитектуру в дальнейшем. (Да, у меня мания борьбы с дублированием )))) )
 

HraKK

Мудак
Команда форума
ты x-yuri и ты pilot911 не правы. На этом предлагаю закончить оффтопный спор или создайте отдельную тему "Остроконечники vs Тупоконечники"
 

x-yuri

Новичок
HraKK не правы потому, что 'В СНГ есть такое понятие "а вось пронесет" и лень. не однократно уже проходили, когда лень сразу делать по человечески думаю тут сейчас 5 мин сьэкономлю, а потом оказывается что не пронесло и тратят в 5 раз больше времени' ?
 

PartizaneN

I speak PHP
Клёвый спор :)

С 8 марта всех :)

Итак, вставлю и я пару фраз...

1) давайте программировать объектно, а не классово.

По-поводу синглетонов. Очень часто люди, которые вообще не понимают зачем нужны объекты прочитают про синглетон и начинают везде всовывать, ведь это же так понятно - getInstance и всё. А что это за объект такой, который нельзя создать второй раз? Почему бы не обойтись статическими пропертями, методами и т.п.?

2) соглашусь с меньшинством, что само по себе использование глобалс - не значит - капец. Создал ты себе переменную $db - используй сколько хочешь, если у тебя одна база на проекте. Если ты знаешь что делаешь - флаг тебе в руки.

3) инкапсуляция. Я всегда думал, что инкапсуляция - не состоит именно из того, что ты определил переменную прайвит или протектед. А скорее как "побочный" эффект ОО программирования. Т.е. кто-то запраграммировал объект "велосипед". дальше $velo=new Velosiped(); $velo->krutiPedali(). И тебе плевать как реализован механизм кручения педалей, и заодно плевать что там прайвит или протектед. Скорее оно поможет избежать неправильного использования объекта вело и даст будущим программистам рекомендацию, чтобы напрямую не использовать методы.
 

cDLEON

Онанист РНРСlub
Возьмём вашу быдло-кмс. И тут нам понадобилось написать, например, парсер RSS. Для экономии времени мы решили найти библиотеку стороннего разработчика. И вот не задача...Мы скачали точно такую же быдло-библиотеку, в вашем же стиле хранения данных в глобалах. А один из этих глобалов совпадает с вашим. В итоге при подключении этой библиотеки - ваша "КМС" ложится на лопатки с фатальной ошибкой.
Ещё аргументы нужны ?
 

x-yuri

Новичок
cDLEON речь не о том, чтобы использовать глобальные переменные вместо локальных. Если действительно очень надо будет, можно легко изменить название своей глобальной переменной
p.s. 1) CMS не наша, а абстрактная, 2) ты к CMS, в которой одна глобальная переменная (конфиг), сразу добавляешь приставку 'быдло-'?
 

PartizaneN

I speak PHP
Возьмём вашу крутую цмс, у которой есть синглетон MySingleton1, закачаем себе ещё более клёвую библиотечку MySingleton1, чёрт, что же делать...
 

cDLEON

Онанист РНРСlub
cDLEON речь не о том, чтобы использовать глобальные переменные вместо локальных. Если действительно очень надо будет, можно легко изменить название своей глобальной переменной
Во, херня какая, заменить название своей переменной.
Это, что ли через Find->Replace заменять $_GLOBALS['config'] на $_GLOBALS['my_config'] во всех местах, где эта переменная используется?
А если я ещё одну библиотеку скачаю, а там юзается my_config ? :D Опять заменять ? Бугага))
CMS не наша, а абстрактная
Я говорил о КМС пилота, про которую он в каждой теме 5 ять копеек вставляет.
ты к CMS, в которой одна глобальная переменная (конфиг), сразу добавляешь приставку 'быдло-'?
Нет. Это тоже касалось той "кмс". Кстати - если "кмс" эта для продакшена, то глобальных переменных там быть НЕ ДОЛЖНО!
Я не хочу играть в сапёров! А вось такая переменная в этом дерьмовом коде уже используется?
А если ты пишешь для себя и экономия времени на первом месте, то там лапша тоже подойдёт. Хотя даже в маленьких своих программках я использую наследование, для вещей которые подходят под один интерфейс - экономит время ппц как.
Возьмём вашу крутую цмс, у которой есть синглетон MySingleton1, закачаем себе ещё более клёвую библиотечку MySingleton1, чёрт, что же делать...
Если у нас есть реализация этой же самой библиотеки, то проще доработать и отрефакторить свою.
Хотя - в своих проектах я вообще отказался от синглтонов.
Передаю параметры в конструктор. И чувствую себя молодым 8)
 

HraKK

Мудак
Команда форума
x-yuri
И это тоже. Делать надо правильно. Всегда можно делать криво и зачастую нужно но либо ВЫНУЖДЕННО либо от лени но тогда не надо об этом кричать на углу.

А я вот напишу через какое-то время очень хорошую заметку насчет этого почитаешь.
 

cDLEON

Онанист РНРСlub
А я вот напишу через какое-то время очень хорошую заметку насчет этого почитаешь.
Ты уже КМС своей грозился пол года назад, а воз и ныне там ;-)
 
Сверху