Удобный способ декларации свойств

tenshi

Новичок
новый тип - говнокод от любителей jQuery.
при чём тут jQuery?

автокомплит даже с помощью property не прикрутишь.
почему это?

забыл передать параметр - получи evil баг.
при строгой типизации не получим.

какой плюс такого подхода, когда сеттер с гетером объеденные в один метод?
они не объединённые. это просто ещё один, иногда удобный, интерефейс.

-~{}~ 03.06.10 13:54:

Автор оригинала: triumvirat
в каждом классе модели. что значит "заново"? есть класс user, у него есть массив описания свойств.
а потом заводишь класс VIPUser и все эти свойства определяешь заново?
 

fixxxer

К.О.
Партнер клуба
омг

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

$foo->bar = 1 плохо (в книжге прочитали), ок, сделаем $foo->bar(1) гы
 

soines

Новичок
tenshi, как писал triumvirat есть модель, у модели есть свойства, есть магические геттеры, сеттеры, если нужно сделать особое поведение пишем явный сеттер.
В твоем примере есть модель User, нужно добавить свойства, наследуешь от него VIPUser и добавляешь новые свойства. В чем проблема?
 

tenshi

Новичок
Автор оригинала: fixxxer
омг

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

$foo->bar = 1 плохо (в книжге прочитали), ок, сделаем $foo->bar(1) гы
вообще-то у меня оба варианта поддерживаются, если ты не заметил

-~{}~ 03.06.10 15:11:

Автор оригинала: soines
tenshi, как писал triumvirat есть модель, у модели есть свойства, есть магические геттеры, сеттеры, если нужно сделать особое поведение пишем явный сеттер.
В твоем примере есть модель User, нужно добавить свойства, наследуешь от него VIPUser и добавляешь новые свойства. В чем проблема?
в том, что у него все свойства декларируются в виде массива, который в дочернем классе можно перегрузить только целиком.
 

pilot911

Новичок
это похоже на рефлексию в java, где объект описывается в xml ?
 

tenshi

Новичок
эм.. ну лёгкая рефлексия, конечно, есть, но я бы не сказал, что тут есть какие-то сходства с явой
 

soines

Новичок
Во-первых, можно объявлять их как protected.

PHP:
class User extends Model
{
    protected $id;
    protected $name;
    .....
}

Во-вторых, пускай даже они будут храниться в массиве, можно сделать API для добавления свойств

PHP:
class VIPUser extends User
{
    public function __construct( )
    {
        $this->addProperty( 'status' ); // добавить поле к уже существующим.
    }
}
 

fixxxer

К.О.
Партнер клуба
если нужен value object для этого есть SPL ArrayObject

а в классе реализующем бизнес логику такой хрени нечего делать
 

tenshi

Новичок
Во-первых, можно объявлять их как protected.
угу, вот я так и делаю

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

-~{}~ 03.06.10 15:50:

если нужен value object для этого есть SPL ArrayObject
он ни чем не лучше __get и __set, только доступ к полям не удобный: $obj['title'] вместо $obj->title

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

soines

Новичок
PHP:
$div->divident( 6 )->divisor( 3 )->result;
Мне не нравиться такой метод, т.к. при беглом просмотре кода не понятно это вызов метода и обращению к свойству и хрен знает что вернется.
 

tenshi

Новичок
традиционно поля именуются как существительные, а методы - как глаголы.
 

AmdY

Пью пиво
Команда форума
потому что я не встречал ни одной нормальной либы кроме jQuery где бы геттер с сетером отличались только наличием аргумента.
как ты прикрутишь автокомплит, если не понятно что вернёт метод значение или объект?
PHP:
var_dump( $title->text( '' )->text() ); // string(10) "[untitled]"
вот так понятно, удобно и модно не бояться что тебя встретит в тёмном переулке тот, кто этот код будет трогать после тебя.
PHP:
$title->setText('')->getText();
ты так и не назвал в чём заключается удобство и красота того подхода.
 

tenshi

Новичок
потому что я не встречал ни одной нормальной либы кроме jQuery где бы геттер с сетером отличались только наличием аргумента.
а jquery - нормальная? х)
вообще, это пошло наверно отсюда: http://martinfowler.com/dslwip/MethodChaining.html только там веселее - сеттеры тоже могут быть без параметров.

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

PHP:
var_dump( $title->text( '' )->text() ); // string(10) "[untitled]"
вот так понятно, удобно и модно не бояться что тебя встретит в тёмном переулке тот, кто этот код будет трогать после тебя.
PHP:
$title->setText('')->getText();
чтобы освоить использование моего дсл нужно прочитать 5 строчек документации. а чтобы писать твоим способом придётся нагромождать интерфейс класса тучей однотипных методов. ты отрицаешь пользу дсл?

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

AmdY

Пью пиво
Команда форума
@return а дальше? если с параметром он работает как сеттер и возвращает $this, а без параметра работает как геттер и возвращает mixed

tenshi jQuery - удобная и на javascript мне не приходится писать такие тоны кода как на php. php не поддерживает полифоризм и не нужно стремиться его эмулировать. ты как раз смешал вместе цепочки и полифоризм. в моём примере всё работает точно так же как у тебя, только читается проще, т.к. понятно где устанавливается значение, а где оно берётся. внутри всё так же как у тебя, только в __call анализируется префикс функции set или get. тогда вечает
@method string getText()
@method Foo setText() setText($value)
 

tenshi

Новичок
@return а дальше? если с параметром он работает как сеттер и возвращает $this, а без параметра работает как геттер и возвращает mixed
а если два ретурна написать? а вообще, давно пора в пхп нативную статическую типизацию функций добавить..

jQuery - удобная и на javascript мне не приходится писать такие тоны кода как на php
а мне приходится ._."

php не поддерживает полифоризм и не нужно стремиться его эмулировать.
1. почему это не нужно?
2. очень даже поддерживает. это иде не поддерживают полиморфизм..

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

@method string getText()
@method Foo setText() setText($value)
@method string text()
@method Foo text( $value )
 
Сверху