"PHP" / Говнокод #19330 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
static public function createFromStr($string)
        {
            $arr = explode('|', trim($string));
            if (!empty($arr)) {
                $object = new Fingerprint();
                for($i = 0, $stop = count($arr); $i < $stop; $i++) {
                    $value = trim($arr[$i]);
                    switch($i) {
                        case 0:
                            $object->fingerprint = $value;
                            break;
                        case 1:
                            $object->ctrlV = (int)$value;
                            break;
                        case 2:
                            $object->printableKey = (int)$value;
                            break;
                    }
                }

                return $object;
            } else {
                return null;
            }
        }

создание объекта класса FingerPrint c помощью статического метода; facepalm

Запостил: bykovski bykovski, (Updated )

Комментарии (36) RSS

  • В "PHP" не завезли конструкторов с параметрами?
    Ответить
        • Только делать параметры по умолчанию, а внутри ифать их количество или тип.
          Ответить
  • > создание объекта класса FingerPrint c помощью статического метода
    Нормальная практика, тащемта. В той же жабе есть подобный valueOf().
    Ответить
    • > Нормальная практика

      Завёз пруфы

      Effective Java (2nd edition) - библия жаболюбов:
      Item 1: Consider static factory methods instead of constructors
      Ответить
        • Вывод типов генериков (особенно до диамондов), возможность потом прозрачно сделать так чтоб возвращало разные подтипы (см. EnumSet=> RegularEnumSet vs JumboEnumSet ) и просто плюшки в виде обхода разных ограничений конструкторов.
          Ответить
  • Ну, у конструкторов есть недостатки, например: создать множество объектов из списка параметров. В ж.скрипте можно:

    [1, 2, 3, 4].map(String) // ["1", "2", "3", "4"]

    Но если это, например обычный конструктор типа:
    function Foo(i) {
        this.i = i
    }

    то нужно уже так:
    [1, 2, 3, 4].map(function (i) { return new Foo(i); })
    Ответить
    • Причем тут конструкторы, блжад, тут проблема с поздним связыванием.
      Ответить
      • Тут засада в том, что в js конструктор от обычной функции можно отличить только в момент вызова (конструктор - new Foo(), функция - Foo()). Ну и соответственно map никак не узнает, что надо дёрнуть эту функцию как new Foo() и вызовет её как обычную функцию Foo(). В this попадёт Window (в браузерах) и функция насрёт в глобалки, вернёт undefined и не покажет ошибок...

        P.S. Ну можно делать комбо-конструкторы, которые и как new Foo() и как Foo() работают... Но, имхо, это то ещё говно.
        Ответить
        • А, так в js можно вызвать конструктор не как положено?
          Ответить
          • > конструктор
            Ложки нет.

            Конструкторы никак не маркируются. Рантайму похуй. Ты любую функцию можешь вызвать как new SomeFunction(), при этом запилится объект, который будет доступен в SomeFunction() как this. Вот такой вот жс.
            Ответить
            • >> конструктор
              > Ложки нет.
              > (new function F(){}).constructor
              function F(){}
              Ответить
              • Дык это просто отметка о том, какую функцию new заюзало как "конструктор" при запиливании объекта...

                Это совершенно не мешает делать new Foo() на любой функции и вызывать "конструкторы" как Foo()... Апофеоз слабой тупизации... Но адептам, наверное, нравится такая свобода.
                Ответить
              • Не. В питоне всё наоборот же - вызов выглядит одинаково, но рантайм точно знает, где конструктор (имя класса), а где просто функция. И это удобно.
                Ответить
                  • А в питоне разве конструктор это не всегда __init__ внутри class?
                    Ответить
                    • По вызову в питоне ты никогда не определишь конструктор это или просто функция.
                      Ответить
                      • Ну да. Просто в жс с точностью до наоборот - по вызову понять можно, а по описанию никак не понять, будет это конструктор или нет. Ну только косвенно: вроде в this чё-то пишет, наверное это конструктор (или вдруг всё же просто метод, да хуй его поймёт...)

                        P.S. Ну и то, что по вызову нельзя отличить - это даже плюс иногда. Вон в примере wvxvw с мапом. В питоне ты там можешь передать конструктор, а можешь просто функцию. И всё будет ок без всяких оборачиваний в лямбду...

                        P.S. + соглашение, что конструкторы пишутся с большой буквы, а методы - нет 🙂
                        Ответить
                        • Да везде можно передать ссылку на конструктор, даже в жаве.
                          Ответить
                        • > + соглашение, что конструкторы пишутся с большой буквы, а методы - нет 🙂
                          Вот это - сомнительная штука по-моему. Потому, что часто неясно, это конструктор или преобразование.
                          x = Integer(y); vs x = toInteger(y);
                          В идеале надо скрывать конструирующий побочный эффект конструктора, делегировать разруливание компилятору, оставляя программисту просто функцию. Ну и запиливать аналог экстеншн методов. Чтоб каждый мог написать свой "конструктор" для объекта и вызывать Integer(myObject). В C++ хотя бы в описании своего ярко выраженного типа можно описать как бы конструктор другого типа; жаль, для произвольного нельзя в виде свободной функции.
                          Ответить
        • можно же завернуть в обычную функцию конструктор и радоваться

          тем не так часто это фича нужна
          Ответить
      • О, тут столько обсуждения...
        Ну какбы тут связывание ни при чем. Тут речь о том, что нельзя использовать конструктор как функцию (а иногда хочется).

        Более того, с точки зрения типов, конструктор - это что-то непонятное. Т.е. вот функция: она понятная, у нее есть тип Range -> Image, а у конструктора вроде тоже есть точно такой же тип, но синтаксически его нельзя использовать там, где можно использовать любую другую функцию.
        Ответить
        • Я не в курсе экмапроблем, я подумал там та же хрень что и здесь google: python lambda late binding. Можно теперь тему закрыть?
          Ответить
  • статик подходит для этого, тем более там есть вилка что обьект может и не создаться.
    Ответить
  • ..$i < $stop;... Интересное условие выхода из цикла. А как тогда при count(arr) = 3 case 2 получить? Или есть своя специфика в $string?
    Ответить
    • Что тут интересного? Для count(arr) == 3 цикл выполнится 3 раза с 0, 1 и 2 в i.
      Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8