Хочу обсудить что-нибудь умное

Фанат

oncle terrible
Команда форума
вынесено из http://phpclub.ru/talk/showthread.php?s=&threadid=119196

triumvirat
предложи тему - обязательно обсудим.
 

baev

‹°°¬•
Команда форума
triumvirat, Вы просто узко мыслите: знание программы, по которой работает лифт, поможет Вам выбрать оптимальную стратегию эвакуации в день апокалипсиса.
 

AmdY

Пью пиво
Команда форума
ага. и делать то нужно тоже самое - молиться и надеяться на быструю смерть. ;)

могет тему толстых фреймворков а-ля zf и symfony ?
 

Krishna

Продался Java
Прелагаю обсудить, как правильно реализовывать паттерн Special Case в контексте объектов ORM.
 

fixxxer

К.О.
Партнер клуба
а в каком оно месте там надо, и какой интерфейс спешлкейсим? :)
 

AmdY

Пью пиво
Команда форума
можно для реквестов разве что.
$request->get('id')->toInt()
я возвращаю что-то типо NullClass с магическими методами __get __set __call, которые при запросе возвращают такой же объект, плюс методы toInt, toFloat - 0, toStrig - ''. Проблема в том, что его безболезненно не введёшь, так как требуется соблюдать некоторые правила, например.
if ($request->get('id')) - плохо
нуно if ($request->get('id')->isNull()) или if ($request->get('id')->toInt())

вобщем хня, проще бросать исключения или обрабатывать ифами

-~{}~ 14.05.10 01:29:

я. надеюсь, правильно понял про что вопрос?
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Я для реквестов перепробывал кучу всего и пришел примерно к такому варианту
PHP:
function int($paramName,...,$default=0/* or Exception class instance*/){}

function string(....) {}
и т.д.

вроде даж как-то и гибко и наглядно получается

try {
$id = int('id','form',new RequiredException);
}catch(...){}
 

craz

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

P.s. это достаточно умные вопросы для обсуждения, можно по обсуждать с точки "теории знания"(раздел философии) кстати?)
 

Духовность™

Продвинутый новичок
Описание Special Case

Подкласс, содержащий особую логику для отдельных ситуаций.

Null-значения в ООП - неуклюжая вещь, так как она зарубает на корню полиморфизм. Обычно есть возможность вызова какого-либо метода на переменной заданного типа без необходимости беспокоиться о том, принадлежит ли эта переменная конкретному классу или подклассу. В строго типизированных языках эту проверку делает компилятор. Тем не менее, из-за того, что переменная может содержать null, существует опасность возникновения ошибки во время выполнения, при вызове метода на null-значении.
я что-то не понял - проблема в NULL в PHP?
 

AmdY

Пью пиво
Команда форума
ну да, в php можно NULL и не использовать, а делать приведение/ вот в мускуле с null можно намучаться, если забыть правила, поэтому лучше не пользоваться как миной замедленного действия
 

whirlwind

TDD infected, paranoid
Прелагаю обсудить, как правильно реализовывать паттерн Special Case в контексте объектов ORM.
А какое иное поведение, кроме возбуждения сигнала о возникновении исключительной ситуации может реализовывать подобный объект? Возбуждать исключение проще в порождающей объект части - factory, table gateway и тп. Это заставит писать такой код, который предполагает обработку NULL значений (только там где это требуется).
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Дело не в null, а в отсутствии значения (самый примитивный случай в $_GET не пришло значение, а ты на него расчитываешь)
вот и получается
PHP:
if(isset($_GET['id'])) { $id = intval($_GET['id']);}
else {...}
куча кода, Special Case предлагает возвращать поведенческий объект, но имхо это может нарушить бизнес логику, особено когда несколько человек над проектом работают
 

akd

dive now, work later
Команда форума
Автор оригинала: craz
Слушайте, а вообще как и где можно получить системные знания по веб-разработке, в данный момент есть уже знания которые приносят профит обеспечивающий в принципе безбедное существование, но как только вы начинаете умничать, у меня складывается устойчивое ощущение, что я ваааще ничего не наю в веб-разработке, вы такие узкие специалисты в каких то областях? И причем чем больше я вникаю в те вопросы, которые вы обсуждаете, открываются все новые и новые горизонты. Зато сколько мне не попадался сторонний продакшн код, он почему завсегда был невообразимо глуп.
Тут, что реально сливки общества?)

P.s. это достаточно умные вопросы для обсуждения, можно по обсуждать с точки "теории знания"(раздел философии) кстати?)
ага сливки в сливочной :)
 

Krishna

Продался Java
Не ожидал реального обсуждения ))) Просто высказал наболевший вопрос).

а в каком оно месте там надо, и какой интерфейс спешлкейсим?
Ну, есть персистентные объекты сущности Hibernate (пусть будет Doctrine, не важно). У одного класса есть обязательная ссылка на другой (агрегация). Например у класса Person есть поле типа Address.
И тут нам надо в уже существующий legacy code добавить новый функционал, работающий с людьми без прописки.
Создаём класс BOMZH extends Person. При этом, нам надо, чтобы вызовы родительского метода getAddress() возвращали что-то валидное (Например, чтобы бомжи могли участвовать в печати общего отчёта по людям, где в графе адрес у них будет всавляться "Неопределённое место жительства").

Для этого надо либо как-то перегрузить в свою очередь Address (VirtualAddress), но при этом он должен вести себя как Active_Record, но желательно не писаться в базу при создании нового бомжа (не писаться, чтобы, например, не участвовать в запросах "... COUNT(*) FROM address"). Либо, как оказалось сделано в нашем проекте (чем я и воспользовался в итоге) - заведена таблица, хранящая карту "Класс" => "ID виртуальной сущности в таблице". И метод $bomzh->getAddress() возвращает сущность полученную по этому id.


Special Case - это изящно-завуалированная @
Нет.
 

whirlwind

TDD infected, paranoid
Krishna тогда уж extract class bomzh и person extends bomzh. Не думаю, что у бомжа больше возможностей, чем у обычного гражданина :D

Вообще твой пример трудно рассматривать не зная деталей. На первый взгляд выглядит как-то запутано. А как у вас загрузка бомжей идет, если это другая сущность? Если вы не стали добавлять "Неопределенное место жительства" в таблицу адресов только из-за одного COUNT(*) и вместо этого гемороитесь со Special Case, вместо того что бы поправить запрос, на мой взгляд поспешное решение.

PS. так что у вас FK на адресе нету? Вот был бы, пришлось бы делать как проще без выкрутасов :)
 

A1x

Новичок
BOMZH extends Person имхо как-то слишком
чем не подходит бомж у которого addressId == 0 ?

PHP:
class Person {

    .............

    public function getAddress()  {
        $address = new Address;
        if ($this->addressId > 0) {
            $address->loadById($this->addressId);
        }
        return $address;
    }
}
т.е getAddress для бомжа просто возвращает объект Address с пустыми полями у которого нет соответствующей записи в базе и который в графе адрес отображается как N/A
 
Сверху