За последние 24 часа нас посетили 16355 программистов и 1320 роботов. Сейчас ищут 1010 программистов ...

Чушь

Тема в разделе "Прочее", создана пользователем topas, 14 фев 2010.

  1. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Только сейчас задумался об абсурдности кода, например:

    PHP:
    1.  
    2. <?php
    3. function foo(Bar $bar = null){
    4.     $bar = $bar ? $bar : new Bar();
    5.     // ...
    6. }
    7.  
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мгм. В чем абсурдность?
     
  3. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    В том что первая строчка задает значение по-умолчанию. Вторая строчка тоже задает значение по умолчанию.
    Можно, конечно написать и третью, аналогичную строчку, но это уже будет домысел, а так пример из жизни.

    Встречается достаточно часто

    PS> И вообще, четыре слова "Bar" в одной строке, разделенные непонятными знаками, это вообще круто :))

    PHP:
    1. <?php
    2.  
    3. $bar = $bar , $bar | $bar & $bar * $bar / $bar // ...
    4.  
    5.  
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вот в этом твоя ошибка. В приведенном тобой коде первая строчка задает тип параметра и его необязательность.
    А вторая дефолтную инициализацию нужным объектом если не был передан параметр.

    Дело в том, что такой финт ушами
    PHP:
    1. <?php
    2. function foo(Bar $bar = new Bar()){
    3.           // ...
    4. }
    сделать нельзя.
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    я не пытаюсь сейчас выяснить как можно, как нельзя, почему можно или почему нельзя. Где происходит инициализация, чем руководствовались разработчики php. Т.к. это делается на другом сайте при помощи почтовых рассылок.

    ну да, взамен можно
    PHP:
    1. <?php function foo($bar = 'bar') ?>
    И означать это будет, в переводе на русский язык, что переменной $bar присваивается значение 'bar' если значение переменной не было передано явно.

    В общем, не думаю что стоит устраивать полемику и по этому поводу

    Simpliest, ты лучше объясни что обозначает одно и то же слово, встречающееся четыре раза в строчке и разделенное разными знаками препинания :)

    UPD>
    Ах да, совсем забыл:
    PHP:
    1. <?php $bar = $bar ?: new Bar(); ?>
    Ну да, одна и та же конструкция обозначает разные вещи.
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    [отвлеченно]
    Читал Маркуса, где он и группа программистов обсуждали на сорока страницах, стоит ли в интерфейсе объявлять публичные поля объекта :)

    [NeoPHP]
    <?neo

    function foo($name, $planet = ($planet implements SolarSistem) ? $planet : new ForeignBody::create()->inject($planet)){}
    [/NeoPHP]
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Нельзя взамен. Мы ожидаем объект, установить объект в качестве значения по умолчанию - нельзя.
    Поэтому код из первого сообщения вполне корректен.

    Ты регулярки видел? Вот задай свой вопрос автору регулярок.

    Ты сколько выпил?
     
  8. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Уместней спросить "сколько работал" :)

    Объект - та же переменная, только с яйцами. У них структура в ZendEngine общая. Конечно, объекты как "тип данных" в терминах Си ушли далеко от простых переменных. Единственная причина, почему нельзя выполнить
    Код (Text):
    1. function(ZendObject $object = new Object()){}
    является тем, что параметры не могут содержать исполняемого кода, а new stdObject и есть исполняемый код.

    :)
     
  9. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    topas
    так в чём вопрос?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Переменную тоже нельзя подставить в качестве "умолчального" значения :)
     
  11. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?
    2.  
    3. function bla-bla(){
    4.     // ...
    5.     if ( var_dump($user->isAuthorize()) ){
    6.          // ...
    7.     }
    8.     // ...
    9. }
    10.  
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    зачем?
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    чтобы по ф5 посмотреть результат возвращаемый функцией, писать на новой строке оказалось лениво :)
     
  14. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1.  
    2. <?php
    3. class Foo
    4. {
    5.     static $self;
    6.  
    7.     static public function insatnce(){
    8.         // ...
    9.         self::$self = new self();
    10.         // ...
    11.     }
    12. }
    13.  
    PHP:
    1. <? self::$self = new self(); ?>
     
  15. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    тавтология)

    два раза не повторяю, не повторяю
     
  16. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Koc
    Тебе объяснить зачем запись продублировал, или сам поймешь?
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    врать не буду, я не понял зачем.

    Единственный вариант: для того, что б второй кусок кода вынести в отдельный файл и потом его инклюдить? =)
     
  18. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    +1 Хорошая идея, жаль нельзя, а то бы я ща как развернулся :)))

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

    Эх
    Код (Text):
    1. <?neophp
    2.     $value = def new Value();
    3.  
    4.     // ...
    5.  
    6.     class UserSingletoon realized Singletoon{
    7.         // ...
    8.     }
    9. ?>
     
  19. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Продолжу с self-ами:

    PHP:
    1. <?php
    2.     static public function instance(){
    3.         if (!self::$self){
    4.             self::$self = new self();
    5.         }
    6.         return self::$self;
    7.     }
    8.  
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    так удобней же одной строкой записать
     
  21. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    На php.net есть несколько комментариев как добиться подобного в php5.3...
    Я периодически задумываюсь как такого добиться на php5.2...
     
  22. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    пишите, Киса

    Спасибо, надо бы потихоньку перебираться, а то как ознакомился с пресс-релизом полтора года назад, так до сих пор и не трогал 5.3

    никак, проще перейти на C++, либо писать кодогенераторы
     
  23. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Конкретно в http://ru.php.net/manual/en/function.ge ... .php#86230
     
  24. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Volt(220)
    не то.

    PHP:
    1. <?php class DatabaseConnection extends Singleton  ?>
    Пока множественного наследования нет, это костыль. Хотя согласен, в 80% случаев этот вариант подходит

    С другой стороны Singleton крайне не удобен в тестах, поэтому его лучше заменить реестром. Но вопрос не в том, что лучше, что хуже. Вопрос в том, что нельзя указать несколько реализаций класса. Можно объявить несколько интерфейсов, но нельзя указать множество родительских классов.

    Практически любую схему множественного наследования можно перевести в схему делегирования, но опять таки, вопрос не в том что хуже или лучше.

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

    Нет, не спорю, можно писать чушь в каждом классе: вот тебе чушь для реализации этой возможности, вот тебе чушь для реализации этой. Все счастливы, все довольны.
     
  25. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1.  
    2. <?php
    3.  
    4.     class AbstractClientSession extends stdSingleton{}
    5.  
    6.     class UserSession extends AbstractClientSession{}
    7.     class GuestSession extends AbstractClientSession{}
    8.     class AdminSession extends AbstractClientSession{}
    9.  
    10.     UserSession::instance()->setRole( new RoleUser(), new RoleGuest() );
    11.     GuestSession::instance()->setRole( new RoleGuest() );
    12.     AdminSession::instance()->setRole( new RoleUser(), new RoleModerator(), new RoleAdmin());
    13.  
    14.     // vs <?neophp
    15.  
    16.     class AbstractClientSession extends stdSingleton{}
    17.     class UserSession extends AbstractClientSession realized RoleUser, RoleGuest{}
    18.     class GuestSession extends AbstractClientSession realized RoleGuest{}
    19.     class AdminSession extends AbstractClientSession realized RoleUser, RoleModerator, RoleAdmin{}
    20. ?>
    21.  
    В реализации есть несущественные отличия, но в первом случае приходится писать рутинную "чушь".

    Второй можно оптимизировать по производительности (перекладываем часть логики на Си вместо виртуальной машины zend)
    Второй вариант проще воспринимать (имхо)
    Второй вариант быстрее написать (не нужно реализовывать механизм делегирование там где этого можно избежать)