1. PHP / Говнокод #19330

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 19 Января 2016

    Комментарии (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.
        Ответить

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