Заменить простые типы на объекты в PHP? @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 10 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: Заменить простые типы на объекты в PHP?
Сообщение Добавлено: 25 Октябрь 2008, 19:35:49 
Я вот подумываю уходить от простых типов переменных, как integer, string в PHP.
А вместо них создавать объекты: Integer, String.

Это неплохо работает в помощи метода: __toString().

Приемущества очевидные:

1. Method chaining
$objString->method_a()->method_b()->method_c();

2. Type Hinting
function foo(String $string) {}

:glasses:

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 25 Октябрь 2008, 20:27:35 
Что делают с людьми кризис и нервное напряжение...

Рецепт: больше витаминов в пище, прогулки на свежем воздухе и спать, больше спать.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 25 Октябрь 2008, 21:43:01 
оффтопик:
Прошедшей ночью затеял я игру в шахматы с компом. Кстати здорово усыпляет.
Проснулся после шести, сделал пару ходов и опять уснул. Проснулся уже в 10 часов, продолжил играть и проиграл: допустил одну ошибку
(хотя переиграв партию с того места где просчитался - выиграл). Потом сел писать этот топик. :lol:


Crazy,
на практике я давно использую вместо родных PHP массивов - свой класс. В этом случае, результат SQL запроса выглядит лаконично:
Код:
$database->query($query)->getResult()->fetchArray()->get("field1");

Также, номер телефона хорошо держать не в обычной переменной: $phone = '123-456-7890', а в специальном объекте.
Объект не допустит неверных входных данных, например: $phone->set('bla-bla') - выдаст ошибку.
Программе не надо знать что $phone это String (инкапсуляция).
Исходя из этих предпосылок, я решил что простые типы тоже можно заменить на объекты. Мне это уже помогло сделать код компактнее.

Вместо:
Код:
if ($color == "red" xor $color == "green" xor $color == "blue") {}

Я могу писать так:
Код:
if ($color->in("red", "green", "blue") {}

Единственный недостаток - нагрузка процессора. Но ИМХО она возрастет линейно (liniar):
O(NC), где С - коффициент, во сколько раз объект медленнее переменной простого типа.
см. Big O Notation

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 25 Октябрь 2008, 22:26:09 
А теперь отделим мух от котлет.

Даже если забыть о существовании "in_array", то ничто не мешает писать так:

Код:
if (my_cool_in_array($color, array("red", "green", "blue"))) {


...а равно -- писать:

Код:
$database->query($query)->getResult()->fetchArray()->get("field1");


...не создавая никаких врапперов вокруг массивов.

Есть такая штука: структурное программирование. Которое никто не отменял. И никто не заставляет выбирать между ООП-кодом и грязным неструктурированным кодом -- есть и другие альтернативы.

То же ООП нужно использовать правильно. Например, создание класса Phone вполне может быть разумно, если он соответствует сущности предметной области. В отличие от создания бессмысленного враппера вокруг абстрактного понятия "строка".

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

Про O-большое -- спасибо, посмеялся.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 25 Октябрь 2008, 22:53:12 
Да, эти термины более точны: класс-враппер и примитивный тип.

Но Method chaining работает только с объектами.
Код:
$database->query($query)->getResult()->fetchArray()->get("field1");

Код будет работать только если fetchArray() вернет объект (например Array).
Без класса-враппера тут не обойтись.

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

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 26 Октябрь 2008, 00:53:50 
Код:
Код будет работать только если fetchArray() вернет объект (например Array).


Определенно. Но это вовсе не означает, что возвращенный объект должен быть враппером над array. Здравый смысл говорит, что при нормальном проектировании метод должен называться не fetchArray, а fetchRow и возвращать объект, представляющий строку выборки. И array здесь ни при чем.

Что касается читабельности, то здесь помогает правильное проектирование, а не слепое оборачивание примитивов в объекты.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 27 Октябрь 2008, 07:29:18 

Crazy писал(а):
Здравый смысл говорит, что при нормальном проектировании метод должен называться не fetchArray, а fetchRow и возвращать объект, представляющий строку выборки. И array здесь ни при чем.


Но мы должны иметь возможность производить итерацию объекта Row.
Поэтому логично предположить что он наследует Array.

Только что нашел что PHP имеет класс: ArrayObject.
и какие то экспериментальные разработки, вроде Integer объекта.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 27 Октябрь 2008, 10:02:15 

AlexShop писал(а):
Но мы должны иметь возможность производить итерацию объекта Row.
Поэтому логично предположить что он наследует Array.



Первое утверждение неверно. Второе утверждение не следует из первого. И вот почему:

1. Нам нужно иметь возможность итерирования по выборке. При этом Row является одним из элементов выборки.

2. Для итерирования нам нужно иметь возможность проверить наличие следующего элемента и перейти к нему. Хорошим примером организации итерирования по выборке является RecordSet из JDBC. Там для этого введен единственный метод next():boolean. Никакие массивы здесь не нужны.

Соответственно, если отбросить примеры очевидно неуместного использования, то врапперы вокруг примитивных типов дадут нам исключительно syntactic sugar. Не имею ничего против того, чтобы кто-то лично для себя такое создавал. Вот только нужно осознавать, что ни на скорости разработки, ни на читабельности кода они существенно не сказываются.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 28 Октябрь 2008, 06:00:44 
Оказывается термин уже для этого есть: syntactic sugar. :beer:
Опробую немного на практике. К сожелению несовместимости уже выявляются.

Например этот код дает ошибку (object to Integer conversion):
Код:
$k = (int) $objString;

Можно заменить на такое (к примеру):
Код:
$k = $objString->toInt();

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: Re: Заменить простые типы на объекты в PHP?
Сообщение Добавлено: 31 Октябрь 2008, 05:19:01 
Затея - ерунда. Потому что много несовместимостей с существующим кодом и вообще с языком:

if else - не работает: любой объект (в том числе и String) оценивается как TRUE.
Объект Integer не будет работать с циклами как: for

Поддержка примитивных типов ввиде объектов врятли пойдет дальше существующей функции __toString().
В PHP6 осознанно не будут это развивать, потому что это Weak typed язык:
http://www.php.net/~derick/meeting-note … tive-types

Наверно поэтому нет Type Hinting как: function foo(String $string) {}

Сама по себе __toString полезная функция, например для таких объектов как Phone (см. выше).

Вообщем я успокоился.

P.S. Но объект массив - имхо это очень удобно

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 10 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100