Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> global в методах класса 
V
    Опции темы
NewDima
Дата 24.9.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



sTa1kEr, сначала нужно, чтобы bars80080 решил, что соединение должно быть одно. А потом многое отпадет smile 
PM ICQ   Вверх
youri
Дата 24.9.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(bars80080 @  24.9.2009,  16:15 Найти цитируемый пост)
ну, есть у меня интерфейс работы с БД. одно подключение со своей базой использует сам сайт, другое интерфейс. чтобы не заморачиваться на переходе и выставлении установок туда-сюда для интерфейса мы определяем своё подключение, и там уже выставляем нужную ему БД

кстати, вот вторая причина: чтобы не писать постоянно global. Самое простое решение использовать функцию, которая возвращает нужный коннект (и создает, если нужно)
Код

db('connect_name')->query(...)


Цитата(bars80080 @  24.9.2009,  16:31 Найти цитируемый пост)
Ну и, как уже сказал, Simpliest можно использовать шаблон Singleton

мне нужно несколько экземпляров

Singleton допускает больше одного объекта: "Permits a variable number of instances. The pattern makes it easy to change your mind and allow more than one instance of the Singleton class. Moreover, you can use the same approach to control the number of instances that the application uses. Only the operation that grants access to the Singleton instance needs to change." (книжка банды четырех)

Цитата(Simpliest @  24.9.2009,  16:44 Найти цитируемый пост)
Конкретно для БД - все вменяемые. Такое уточнение подойдет?Чем меньше точек входа для базовых операций - тем лучше.

не подойдет. TDD-шники не любят Singleton

Цитата(Simpliest @  24.9.2009,  16:44 Найти цитируемый пост)
В статье, кстати, сказано, что привязка к именам классов хуже, чем к именам переменных

Глупость кстати. Никаких разумных доводов этому нет.

есть разумные доводы. Ты б статью почитал прежде чем говорить ;) : "Характер зависимости может быть Динамическим – когда мы легко можем подменить один объект другим, и клиент об этом не узнает, если интерфейсы все также поддерживаются." Динамическую зависимость можно подменить, в отличие от статической. Важно как минимум для TDD. А статья - хорошая

Цитата(sTa1kEr @  24.9.2009,  17:12 Найти цитируемый пост)
Имхо, да, любые переменные должны быть инкапсулированны настолько, насколько это возможно.

я бы сказал "в разумных пределах"

Это сообщение отредактировал(а) youri - 24.9.2009, 17:25
PM   Вверх
bars80080
Дата 24.9.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(sTa1kEr @  24.9.2009,  17:08 Найти цитируемый пост)
то вполне оправданно было бы использовать полные имена и отказаться от select_db.

что сие значит?


Цитата(sTa1kEr @  24.9.2009,  17:08 Найти цитируемый пост)
Тогда я не совсем понимаю, что значит "для интерфейса работы"

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

Добавлено через 24 секунды
Цитата(NewDima @  24.9.2009,  17:19 Найти цитируемый пост)
что соединение должно быть одно

почему?
PM MAIL WWW   Вверх
Simpliest
Дата 24.9.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(youri @  24.9.2009,  17:23 Найти цитируемый пост)
не подойдет. TDD-шники не любят Singleton

Это личные тараканы вас неопытных TDD-шников. Я говорил про вменяемых программистов, которые исповедуют KISS & DRY.

Цитата(youri @  24.9.2009,  17:23 Найти цитируемый пост)
Ты б статью почитал прежде чем говорить 

Нет там разумных доводов, там есть искусственно созданные проблемы самому себе. 

Вы бы, прежде чем давать глупые советы, приняли за факт, что эту статью я читал больше года назад (а появилась в сети она еще раньше). И я уже цитировал ее же на этом форуме.

Одна эта фраза
"В тестах иногда нужно иметь возможность изменить поведение этих методов" начисто убивает.  
И такого там достаточно много. Статья написана с претензией, но не более того. Относится к ней следует достаточно критически, особенно некорепшим умам.

Добавлено через 8 минут и 36 секунд
Цитата(bars80080 @  24.9.2009,  17:36 Найти цитируемый пост)
дабы не мешать всё в кучу, для этих операций создаётся отдельный коннект

Брр, прошу прощения, но меня это запутало еще больше.

Что ты пытаешься не мешать в кучу?
Точнее, что от чего ты хочешь отделить?

Вот смотри, есть у нас некоторый слой абстракции работы с БД. 
  •  мы ему можем передать запрос
  • можем использовать какой-либо из реализованных примитивов

Допустим, нам нужно чтобы работа некоторых модулей с БД логировалась отдельно. Тогда нам нужно предусмотреть это в асбтракции.

Например -
Декларация выглядит примерно так

Код

public function query ($query, array $params, LogObject $log = 'default log') {};


Все, когда нам надо, мы передаем другой объект ведения лога
Код

$log =  new LogObject('individual.log');
DB->query($query, $params, $log);





--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 24.9.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(bars80080 @  24.9.2009,  18:36 Найти цитируемый пост)
одна страница/скрипт реализует интерфейс работы с базой данных. разные операции: создать базу, редактировать, создать таблицу, редактировать таблицу, её значения, слить дамп базы, загрузить дамп, закачать дамп на сервер, просто осуществить прямой запрос. дабы не мешать всё в кучу, для этих операций создаётся отдельный коннект

Все равно не понимаю. Имеем один, сервер, один коннект к нему и два разных интерфейса взаимодействия. Первый интерфейс реализует операции " создать базу, редактировать, создать таблицу...", второй то, что необходимо сайту. Все. Зачем тут два коннекта?

Цитата(bars80080 @  24.9.2009,  18:36 Найти цитируемый пост)
что сие значит?

Это значит
Цитата(bars80080 @  24.9.2009,  18:36 Найти цитируемый пост)
чтобы не приходилось впоследствии переключаться на прежнюю базу

Точнее вообще отказаться от переключения баз.

Добавлено через 1 минуту и 7 секунд
Цитата(youri @  24.9.2009,  18:23 Найти цитируемый пост)
я бы сказал "в разумных пределах"

Это само собой, разумеется.
PM MAIL   Вверх
nerezus
Дата 24.9.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

Синглтон для работы с БД.
 Я юзаю Registry-паттерн.

Цитата

Коннект - статик свойство.
 Зачем? о_О


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
bars80080
Дата 24.9.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Господи, какие же вы демагоги. ни одну проблему не можете решить в рамках поставленных условий. Саймон говорит прыгать на одной ноге, училка по рисованию - не использовать чёрную краску, родители - не лижи качельку на морозе. какая разница почему?

отлипли от БД.
есть класс подключения страницы, один объект, одна страница, ряд операций с ней. надеюсь, религия вам не мешает загонять три контента в один вывод?

теперь задаю вопрос: внимание!
может теперь увидите

Код

function metod() {
    global $content;
    ....
}

в ряде методов некоего третьего класса. нужно ли отходить от этой схемы?


-------------------------------------------------------------------------------------------------------------
вопрос был выше



как я понял, нужно. но судя по всему вы не можете определиться как. или я что-то упустил. можете конкретезировать?

/ни о какой БД мы здесь не говорим/
PM MAIL WWW   Вверх
Simpliest
Дата 24.9.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Тебе уже давно ответили. Только ты ответа не захотел увидеть.

Отходить нужно.

Как именно отходить - тебе дали "надцать" вариантов ответов.

Singletone, Registry, через одно место можно Factory.


--------------------
user posted image
PM   Вверх
bars80080
Дата 24.9.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



вот, registry. значит, завтра (может быть) будем разбираться, что это за зверь такой

Цитата(Simpliest @  24.9.2009,  19:50 Найти цитируемый пост)
тебе дали "надцать" вариантов ответов.

в слове три, формы "надцать" нет smile 
PM MAIL WWW   Вверх
youri
Дата 24.9.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(Simpliest @  24.9.2009,  17:41 Найти цитируемый пост)
Я говорил про вменяемых программистов, которые исповедуют KISS & DRY.

палишься ;)

Цитата(Simpliest @  24.9.2009,  17:41 Найти цитируемый пост)
Нет там разумных доводов, там есть искусственно созданные проблемы самому себе. 

если человек не хочет слушать...

Цитата(bars80080 @  24.9.2009,  19:27 Найти цитируемый пост)
теперь задаю вопрос: внимание!
может теперь увидите
в ряде методов некоего третьего класса. нужно ли отходить от этой схемы?

ответили почему: чтобы постоянно не писать и не забыть написать global
ответили как... чем отличаются варианты можно почитать в статье (кстати, писали разработчики limb). Фактически, если не практикуешь TDD, можно остановиться на Singleton, остальные варианты скорее для TDD (если неправ, объясните почему). Причем не обязательно создавать класс Singleton, можно обойтись функцией (см. выше)
PM   Вверх
Simpliest
Дата 24.9.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(youri @  24.9.2009,  21:31 Найти цитируемый пост)

Цитата(Simpliest @  24.9.2009,  17:41 Найти цитируемый пост)
Я говорил про вменяемых программистов, которые исповедуют KISS & DRY.

палишься ;)

??? вменяемость как-то противоречит KISS & DRY?

Цитата(youri @  24.9.2009,  21:31 Найти цитируемый пост)
если человек не хочет слушать...

Тут не о чем говорить. Тесты не должны менять поведение тестируемого класса. Нигде и никогда.
Иначе я вам рефлексией такого наменяю, что из детской коляски у меня получится АК-47, как в пресловутом анекдоте.

Если вы и автор той статьи допускаете такое поведение - значит грошь цена вам, как профессионалам.


--------------------
user posted image
PM   Вверх
youri
Дата 24.9.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(Simpliest @  24.9.2009,  21:51 Найти цитируемый пост)
Тесты не должны менять поведение тестируемого класса.

а кто сказал менять. Неужели моки уже considered harmful?
PM   Вверх
Simpliest
Дата 24.9.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Мда, и как я такое пропустил

Цитата(youri @  24.9.2009,  21:31 Найти цитируемый пост)
ответили почему: чтобы постоянно не писать и не забыть написать global

К сведению. Отказаться от этого нужно не по причине забывчивости.

А по причине безопасности. Переменные в global scope могут быть изменены любым! случайным модулем. Этого быть не должно.

Цитата(youri @  24.9.2009,  21:31 Найти цитируемый пост)
Фактически, если не практикуешь TDD, можно остановиться на Singleton

Никакой прямой связи между Singleton и TDD нет. Проблема в узком мышлении и попытке покрыть непокрываемое, впихнуть невпихуемое.

Singleton это объект, который должен существовать в одном (ограниченном) числе. Все. Остальное от лукавого.
Все домыслы о том, что он мешает TDD - суть домыслы. Внятных аргументов, - чем он мешает, - нет, не было и не будет.
Боитесь статических связей? Откройте для себя делегаты и фабрики. И наслаждайтесь динамическими связями. Но причем тут Singleton и TDD?

Добавлено @ 22:30
Цитата(youri @  24.9.2009,  22:18 Найти цитируемый пост)
а кто сказал менять.

А вы не пробовали читать статью на которую ссылаетесь?
Я вам даже цитату оттуда приводил.

"В тестах иногда нужно иметь возможность изменить поведение этих методов"
Ага?

Там еще куча перлов. Например, паническая боязнь статических связей.
Пишем: Синглтон - зло он завязывает на себя объект статически.
и сразу код где мы напрямую в коде класса (статически) зависим от класса Log

Код

class Server{ 
  function serve(){
    […]
    Log :: logOk(‘Served Ok’);
  }
}


И тут же пишем какая классная вещь сервислокатор.
и сразу код.
Код

class Client(){
  protected $server;
 
  public function __construct(){
    $this->server = Locator :: instance()->getServer();
  }
 
  public function action(){
    [...]
    $this->server->serve();
    [..]
  }
}

Убейте меня тапком, если Locator :: instance()->getServer(); не статическая зависимость.
Что мы поменяли? Подсунули еще одну прослойку(абстракцию), а от статической связи не избавились.
Статическая - не значит что вызывается статический метод. А то что мы зависим от класса Locator напрямую

Черт побери! И эти люди запрещают ковыряться мне в носу?

Я вам говорил что статья очень спорна. И написана далеко не гуру. Специально освежил свои впечатления.
И таких ляпсусов там с полдесятка точно, и это на мой взгляд непрофессионала, который около полутора лет не писал ничего вообще.

Это сообщение отредактировал(а) Simpliest - 25.9.2009, 13:46


--------------------
user posted image
PM   Вверх
bars80080
Дата 25.9.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

Цитата(youri @  24.9.2009,  21:31 Найти цитируемый пост)
Фактически, если не практикуешь TDD

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

Цитата(Simpliest @  24.9.2009,  22:21 Найти цитируемый пост)
Переменные в global scope могут быть изменены любым! случайным модулем. Этого быть не должно.

а разве в register я не могу поменять переменные любым случайным модулем?
PM MAIL WWW   Вверх
youri
Дата 25.9.2009, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 6
Всего: 16



Цитата(Simpliest @  24.9.2009,  22:21 Найти цитируемый пост)
Переменные в global scope могут быть изменены любым! случайным модулем. Этого быть не должно.

если разумно использовать (для отдельных нужных везде объектов), никаких проблем не будет. Хотя если писать общедоступную библиотеку, то глобальные переменные не стоит использовать

Цитата(Simpliest @  24.9.2009,  22:21 Найти цитируемый пост)
Никакой прямой связи между Singleton и TDD нет. Проблема в узком мышлении и попытке покрыть непокрываемое, впихнуть невпихуемое.

может ты и прав, что проблема высосана из пальца

Цитата(Simpliest @  24.9.2009,  22:21 Найти цитируемый пост)
Пишем: Синглтон - зло он завязывает на себя объект статически.
и сразу код
includeSyntax('php');
class Server{   
function serve(){    
[…]    
Log :: logOk(‘Served Ok’);  
}
}

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

Цитата(Simpliest @  24.9.2009,  22:21 Найти цитируемый пост)
И тут же пишем какая классная вещь сервислокатор.

Цитата

Убейте меня тапком, если Locator :: instance()->getServer(); не статическая зависимость.

да, статическая зависимость, но мы же можем подменять объекты, которые service locator раздает

Цитата(bars80080 @  25.9.2009,  00:32 Найти цитируемый пост)
а разве в register я не могу поменять переменные любым случайным модулем?

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

Это сообщение отредактировал(а) youri - 25.9.2009, 02:41
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.