- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 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
gost 19.01.2016 19:59 # 0
3_dar 19.01.2016 20:58 # 0
bormand 19.01.2016 21:01 # 0
3_dar 19.01.2016 21:12 # 0
bormand 19.01.2016 21:03 # 0
Нормальная практика, тащемта. В той же жабе есть подобный valueOf().
roman-kashitsyn 22.01.2016 10:16 # +2
Завёз пруфы
Effective Java (2nd edition) - библия жаболюбов:
Item 1: Consider static factory methods instead of constructors
3_14dar 23.01.2016 05:35 # 0
3.14159265 26.01.2016 14:48 # 0
3_14dar 26.01.2016 15:16 # 0
wvxvw 20.01.2016 14:10 # +3
Но если это, например обычный конструктор типа:
то нужно уже так:
3_14dar 22.01.2016 02:33 # −3
3_14dar 23.01.2016 05:34 # −4
3_dar 23.01.2016 22:58 # −1
3_14dar 24.01.2016 02:51 # −2
3_14dar 24.01.2016 11:52 # −3
kegdan 11.02.2016 10:05 # +1
bormand 24.01.2016 08:07 # 0
P.S. Ну можно делать комбо-конструкторы, которые и как new Foo() и как Foo() работают... Но, имхо, это то ещё говно.
3_14dar 24.01.2016 11:53 # 0
bormand 24.01.2016 12:13 # 0
Ложки нет.
Конструкторы никак не маркируются. Рантайму похуй. Ты любую функцию можешь вызвать как new SomeFunction(), при этом запилится объект, который будет доступен в SomeFunction() как this. Вот такой вот жс.
1024-- 24.01.2016 12:21 # 0
> Ложки нет.
bormand 24.01.2016 12:25 # 0
Это совершенно не мешает делать new Foo() на любой функции и вызывать "конструкторы" как Foo()... Апофеоз слабой тупизации... Но адептам, наверное, нравится такая свобода.
3_14dar 25.01.2016 03:25 # 0
bormand 25.01.2016 06:18 # 0
3_14dar 25.01.2016 15:11 # 0
bormand 25.01.2016 17:05 # 0
3_14dar 26.01.2016 02:14 # 0
bormand 26.01.2016 06:12 # 0
P.S. Ну и то, что по вызову нельзя отличить - это даже плюс иногда. Вон в примере wvxvw с мапом. В питоне ты там можешь передать конструктор, а можешь просто функцию. И всё будет ок без всяких оборачиваний в лямбду...
P.S. + соглашение, что конструкторы пишутся с большой буквы, а методы - нет :)
3_14dar 26.01.2016 10:12 # 0
bormand 26.01.2016 17:13 # 0
1024-- 27.01.2016 01:57 # 0
Вот это - сомнительная штука по-моему. Потому, что часто неясно, это конструктор или преобразование.
x = Integer(y); vs x = toInteger(y);
В идеале надо скрывать конструирующий побочный эффект конструктора, делегировать разруливание компилятору, оставляя программисту просто функцию. Ну и запиливать аналог экстеншн методов. Чтоб каждый мог написать свой "конструктор" для объекта и вызывать Integer(myObject). В C++ хотя бы в описании своего ярко выраженного типа можно описать как бы конструктор другого типа; жаль, для произвольного нельзя в виде свободной функции.
kegdan 11.02.2016 10:09 # 0
тем не так часто это фича нужна
wvxvw 24.01.2016 15:25 # 0
Ну какбы тут связывание ни при чем. Тут речь о том, что нельзя использовать конструктор как функцию (а иногда хочется).
Более того, с точки зрения типов, конструктор - это что-то непонятное. Т.е. вот функция: она понятная, у нее есть тип Range -> Image, а у конструктора вроде тоже есть точно такой же тип, но синтаксически его нельзя использовать там, где можно использовать любую другую функцию.
3_14dar 25.01.2016 03:27 # 0
guest 05.02.2016 20:57 # 0
guest 12.02.2016 00:52 # 0
bormand 12.02.2016 06:21 # 0