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

Духовность™

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

Стал за собой замечать, что в попытке создать ОО-код, заточенный конкретно под свои нужды, стал писать иногда совершенно лишние вещи. Сегодня, например, рефакторил свой сырой давнишний недоделанный код. Пол дня я изучал phpfaq.ru, ибо ЗАБЫЛ как работают сессии (да-да), потом пол дня дописывал обертку над сессиями. А в половину первого ночи решил включить мозг, плюнул на все и ограничился СТАНДАРТНЫМИ средствами языка:

PHP:
session_start();

$_SESSION['var'] = true;
это все, что мне было нужно на данный момент.

И это вместо класса Session, который я год назад зачем-то написал (зачем - не помню), а сегодня отлавливал на его базе ошибки в программе.

Но тем не менее, иногда приходится всё же писать обертки. Типичный пример - обертка над СУБД.

В общем, как при проектировании и построении архитектуры не впадать в маразм? Есть какие-либо рекомендации?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я проверяю PHPSESSID - народ туда шлет всякую хрень
PHP:
    $session_id = filter_input(INPUT_COOKIE,'PHPSESSID');
    $sid_allowed_chars = '0123456789abcdefghijklmnopqrstuv';
    if ($session_id && strspn ($session_id,$sid_allowed_chars) != strlen($session_id)){
        $_COOKIE['PHPSESSID'] = md5(mt_rand().microtime());
    }
2. Еще я проверяю на случай повторного запуска (вызывает ворнинг)
и пишу флаг на случай закрытия сессии, а потом открытия опять в том же скрипте
 

serglt

Анус, ой, Ахтунг
Простейшая завертка
PHP:
class Session {
	protected $val;
	protected static $inst = array ();
	protected static $started = false;
	
	protected function __construct ($sessName) {
		if (!self::$started) {
			session_start ();
			self::$started = true;
		}
		if (empty ($_SESSION [$sessName])) $_SESSION [$sessName] = array ();
		$this -> val = &$_SESSION [$sessName];
	}
	
	function getInstance ($sessName) {
		if (empty (self::$inst [$sessName]))
			self::$inst [$sessName] = new self ($sessName);
		return self::$inst [$sessName];
	}
	
	function __set ($k, $v) {
		$this -> val [$k] = $v;
	}
	
	function __get ($k) {
		return isset ($this -> val [$k]) ? $this -> val [$k] : null;
	}
}
На коленке за 5 минут :)
псевдомультисесси :)

-~{}~ 21.05.10 01:04:

Тоесть
Session::getInstance ('admin') -> isLogged;
Session::getInstance ('user') -> isLogged;

-~{}~ 21.05.10 01:08:

Чаще использую обертки чем нет, потом в будущем проще жить, надо что то добавить, а у тебя обернуто, красота. Всегда стараюсь юзать простенькие конструкции, и в будущем расширять, но без фанатизма, класс сессии в 1 - 2к строк - по мне перебор :)

-~{}~ 21.05.10 01:20:

[off]
Почему то после моих постов очень долго молчат...
В коем веке ришил не почитать, а пописать с пивом в обнимку:)
[/off]

-~{}~ 21.05.10 01:39:

Ушили наверно перепиливать свои MVC :)
 

LeoKee

Новичок
Автор оригинала: serglt
[off]
Почему то после моих постов очень долго молчат...
В коем веке ришил не почитать, а пописать с пивом в обнимку:)
[/off]
Ушили наверно перепиливать свои MVC :)
[off] скорее наверно смотреть хоккей РОссия Канада :) [/off]
 

AmdY

Пью пиво
Команда форума
ну, обёртка не должна мешать, не удобно же Session::getInstance ('admin') -> isLogged, а если 3 уровень?
если получается примерно такой же функционал, только в обёртке, которую можно расширить - то лучше завернуть. а если функционал и удобство теряется - то в топку такое ООП.
недано на хабре было
PHP:
Я бы никогда не прошел ваше тестовое задание :)
Если конечно вы не примете за верный ответ что то вроде
$db = new DB(Config::DB_HOST, Config::DB_USER, Config::DB_PASSWORD, Config::DB_NAME) or die("error");
$arData = $db->getRowSet("SELECT data FROM table WHERE 1") or die("select error");
foreach($arData as $v) {
echo $v['data'];
}
и нафик такие обёртки, если с mysql_* даже кода меньше, вот если так, то и мультисинглетон и исключение и сокращение синтаксиса и расширяемость
PHP:
try {
$db = Db::getInctance('first');
$data = $db->fetchAll(«SELECT data FROM table») or throw new EmptyListException('Таблица пуста');
} catch(MysqlException $e) {
// обработка исключения
}
 

Духовность™

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

На примере функций для работы с сессиями вопрос. Вот список уже имеющихся инструментов - функций для работы с sessions - http://www.php.net/manual/en/ref.session.php

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

С.

Продвинутый новичок
Т.е. обертка должна быть максимально универсальной или она должна быть создана под конкретные нужды?
Максимальная универсальность предоставляется самим языком. Любое оборачивание ее снижает. Поэтому лучше не тешить себя иллюзиями "максимально универсальной обертки", а создавать удобные инструменты под конкретные нужды.
 

fixxxer

К.О.
Партнер клуба
давайте вы все хором пойдете наконец смотреть zend framework / symfony?

там на ВСЕ подобные вопросы есть ответы. на языке php.
 

serglt

Анус, ой, Ахтунг
fixxxer
А песдеть? :)
> давайте вы все хором пойдете наконец смотреть zend framework / symfony
У каждого свои взгляды на жизнь

> там на ВСЕ подобные вопросы есть ответы. на языке php.
Форум можно закрывать?
Без таких вопросов тут останутся ветки типа "АААА, помогите, я с анонировал, ничего не работает"
 

Wicked

Новичок
часов через 12 после таких постов обычно пишут: "простите, был пьян и несдержан" :D
 

Духовность™

Продвинутый новичок
iceman
нет, просто есть аргумент - php сам по себе универсален.

iceman
у тебя есть другое мнение - выскажись. я с удовольствием его изучу.
 

Димон

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

fixxxer

К.О.
Партнер клуба
Машина Тьюринга сама по себе тоже универсальна. Умники.
 

AmdY

Пью пиво
Команда форума
triumvirat
кроме универсальности есть ещё параметр - удобство.
никто не мешает пользоваться нативными функциями для сесий, как например, session_save_path, но при этом использовать singlton с проверкой запущена ли сессия, чтобы по всему коду не ставить проверки.
ищи баланс между белым и чёрным, а не бросайся в крайности
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я следую принципу Бритвы Оккама:
«сущности не следует умножать без необходимости»
он же KISS
нет необходимости - убираем и прослойку, и обертку

-~{}~ 21.05.10 16:02:

AmdY
+1
 

Димон

Новичок
Следовать, в первую очередь, надо принципу DRY. И еще принципу, что код делать надо не для машины, а для людей, причем для нормальный людей, а не для мазохистов.
 

Димон

Новичок
Автор оригинала: Fortop
А мне лень.

Чего вдруг я должен этому принципу следовать, если он дает больше геморроя?
Ну тогда, батенька, Битрикс и php-nuke вам в помощь. Очень крутые образцы того, как кодят "суровые" мужики. :D
 
Сверху