
ã¿ãªããããã«ã¡ã¯ïŒ Server Team Badooã®éçºè
ã§ããAlexey Grezovã§ãã Badooã§ã¯ãã³ãŒããç¶æãéçºãããã³åå©çšããããããããã«åžžã«åªåããŠããŸãããããã®ãã©ã¡ãŒã¿ãŒã«äŸåããŠãã©ã®æ©èœãè¿
éãã€å¹ççã«å®è£
ã§ããããæ±ºãŸãããã§ãã ãã®ç®æšãéæãã1ã€ã®æ¹æ³ã¯ãééããèš±ããªãã³ãŒããæžãããšã§ãã æãå³å¯ãªã€ã³ã¿ãŒãã§ã€ã¹ã¯ãåŒã³åºãã®é åºãééããŸããã å
éšç¶æ
ã®æå°æ°ã¯ãæåŸ
ãããçµæãä¿èšŒããŸãã å
æ¥ããããã®ã¡ãœããã®ã¢ããªã±ãŒã·ã§ã³ãéçºè
ã®ç掻ãç°¡çŽ åããæ¹æ³ã説æããèšäºãèŠãŸããã ããã§ãããã«ãšã±ãã®åçã«é¢ããèšäºã®ç¿»èš³ãããªãã®æ³šæã«ãããããŸãã
äžèŠæš¡ãŸãã¯å€§èŠæš¡ã®ããŒã ã§ã³ãŒããæäœããå Žåãä»ã®äººã®ã³ãŒããçè§£ããŠäœ¿çšããã®ãå°é£ã«ãªãããšããããŸãã ãã®åé¡ã«ã¯ããŸããŸãªè§£æ±ºçããããŸãã ããšãã°ãç¹å®ã®ã³ãŒãã£ã³ã°æšæºã«åŸãããšã«åæããããããŒã å
šäœãç¥ã£ãŠãããã¬ãŒã ã¯ãŒã¯ã䜿çšãããã§ããŸãã ãã ããå€ãã®å Žåãããã¯ååã§ã¯ãããŸãããç¹ã«ããã°ãä¿®æ£ããããå€ãã³ãŒãã«æ°ãã颿°ã远å ããå¿
èŠãããå Žåã¯ãªãããã§ãã ç¹å®ã®ã¯ã©ã¹ãäœã®ããã«æå³ãããŠããã®ããããããã©ã®ããã«åå¥ã«ãããŠå
±åã§åäœããã¹ãããæãåºãããšã¯å°é£ã§ãã ãã®ãããªå Žåãæ°ä»ããªããã¡ã«èª€ã£ãŠå¯äœçšãééãã远å ããå¯èœæ§ããããŸãã
ãããã®ãšã©ãŒã¯ãã¹ãäžã«æ€åºã§ããŸãããå®éã«éçšã«ç§»è¡ããå¯èœæ§ããããŸãã ãããŠãããããæ€åºããããšããŠããã³ãŒããããŒã«ããã¯ããŠä¿®æ£ããã«ã¯ããªãæéããããå ŽåããããŸãã
ããã§ã¯ãã©ãããã°ãããé²ãããšãã§ããŸããïŒ ãã«ãšã±åçã䜿çšããŸãã
ãã«ãšã±ãšã¯ïŒ
ãã«ãšã±ã¯ãæ¥æ¬èªã§ã¯ããã¹ãããã¯ã·ã§ã³ãïŒãšã©ãŒä¿è·ïŒãšç¥ãããè±èªã®çšèªã§ããããã·ã¢èªçã§ã¯ãæãè
ã«å¯Ÿããä¿è·ããšããŠããç¥ãããŠããŸãã ãã®æŠå¿µã¯ãªãŒã³è£œé ã§çãŸããŸãããããã§ã¯ãæ©åšã®ãªãã¬ãŒã¿ãŒããã¹ãåé¿ããã®ã«åœ¹ç«ã€ã¡ã«ããºã ãæããŸãã
補é 以å€ã«ãããã«ãšã±ã¯å®¶é»è£œåã§ãã䜿çšãããŸãã ããšãã°ãSIMã«ãŒãã®å Žåãé察称圢ç¶ã®ãããå³åŽã®ã¢ããã¿ãŒã«ããæ¿å
¥ã§ããŸããã

å察ã®äŸïŒãã«ãšã±ã®åçã䜿çšããªãïŒã¯PS / 2ããŒãã§ãããŒããŒããšããŠã¹ã®äž¡æ¹ã§åãã³ãã¯ã¿åœ¢ç¶ãããŠããŸãã ãããã¯è²ã«ãã£ãŠã®ã¿åºå¥ã§ãããããæ··åããããã§ãã

ãã«ãšã±ã®å¥ã®æŠå¿µã¯ãããã°ã©ãã³ã°ã§äœ¿çšã§ããŸãã ã¢ã€ãã¢ã¯ãã³ãŒãã®ãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ãã§ããéãã·ã³ãã«ãã€ç°¡åã«ããã³ãŒãã誀ã£ãŠäœ¿çšããããšããã«ãšã©ãŒãçæããããšã§ãã ããã¯æãããªããã«æãããããããŸããããå®éã«ã¯ãããã§ã¯ãªãã³ãŒãã«ééããããšããããããŸãã
ãã«ãšã±ã¯æå³çãªèåŸ
ãé²ãããã®ãã®ã§ã¯ãªãããšã«æ³šæããŠãã ããã ç®æšã¯ãå¶çºçãªãšã©ãŒãåé¿ããããšã®ã¿ã§ãããæªæã®ãã䜿çšããã³ãŒããä¿è·ããããšã§ã¯ãããŸããã äœããã®æ¹æ³ã§ã誰ããããªãã®ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããéããæ¬åœã«æããªããã€ã§ããã¥ãŒãºããã€ãã¹ã§ããŸãã
ã³ãŒãã®ãšã©ãŒèæ§ãé«ããããã®å
·äœçãªå¯Ÿçã«ã€ããŠèª¬æããåã«ããã«ãšã±ã¡ã«ããºã ã2ã€ã®ã«ããŽãªã«åé¡ã§ããããšãç¥ã£ãŠããããšãéèŠã§ãã
- ãšã©ãŒé²æ¢
- ãšã©ãŒæ€åºã
ãšã©ãŒé²æ¢ã¡ã«ããºã ã¯ããšã©ãŒãæ©æã«æé€ããã®ã«åœ¹ç«ã¡ãŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãšåäœãå¯èœãªéãç°¡çŽ åããããšã«ããã誀ã£ãŠã³ãŒãã誀ã£ãŠäœ¿çšããããšããªãããã«ããŸãïŒSIMã«ãŒãã䜿çšããäŸãæãåºããŠãã ããïŒã
äžæ¹ããšã©ãŒæ€åºã¡ã«ããºã ã¯ã³ãŒãã®å€éšã«ãããŸãã 圌ãã¯ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ãç£èŠããŠãèµ·ãããããšã©ãŒã远跡ãããããã«ã€ããŠèŠåããŸãã äŸãšããŠã¯ãPS / 2ããŒãã«æ¥ç¶ãããããã€ã¹ãæ£ããã¿ã€ããã©ããã倿ããããã§ãªãå Žåã¯ããªãåäœããŠããªãã®ãããŠãŒã¶ãŒã«äŒãããœãããŠã§ã¢ããããŸãã ãã®ãããªãœãããŠã§ã¢ã¯ãã³ãã¯ã¿ãåãã§ããããããšã©ãŒãé²ãããšã¯ã§ããŸããã§ãããããããæ€åºããŠå ±åããããšãã§ããŸã ã
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®ãšã©ãŒã®é²æ¢ãšæ€åºã®äž¡æ¹ã«äœ¿çšã§ããããã€ãã®æ¹æ³ãèŠãŠãããŸãã ãã ãããã®ãªã¹ãã¯åºçºç¹ã«ãããªãããšã«æ³šæããŠãã ããã ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠã¯ãã³ãŒãã®ãšã©ãŒé²æ¢ã匷åããããã«è¿œå ã®å¯Ÿçãè¬ããããå ŽåããããŸãã ããã«ããããžã§ã¯ãã«poka-yokeãå®è£
ããããšãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ã®è€éããšãµã€ãºã«ãã£ãŠã¯ãæœåšçãªãšã©ãŒã®ã³ã¹ããšæ¯èŒããŠé«ãããå ŽåããããŸãã ãããã£ãŠãã©ã®ææ®µãæé©ã§ããããæ±ºå®ããã®ã¯ããŠãŒã¶ãŒãšããŒã 次第ã§ãã
ãšã©ãŒé²æ¢ã®äŸ
å宣èš
以åã¯PHP 5ã§åãã³ããšããŠç¥ãããŠããŸããããå宣èšã¯PHP 7ã§é¢æ°ãã¡ãœãããåŒã³åºããšãã®ãšã©ãŒããä¿è·ããç°¡åãªæ¹æ³ã§ãã颿°ã®åŒæ°ã«ç¹å®ã®åãå²ãåœãŠãããšã§ããã®é¢æ°ãåŒã³åºããšãã«åŒæ°ãæ··ä¹±ãããããšãé£ãããªããŸãã
ããšãã°ããŠãŒã¶ãŒã«éä¿¡ã§ããéç¥ãèŠãŠã¿ãŸãããã
<?php class Notification { private $userId; private $subject; private $message; public function __construct( $userId, $subject, $message ) { $this->userId = $userId; $this->subject = $subject; $this->message = $message; } public function getUserId() { return $this->userId; } public function getSubject() { return $this->subject; } public function getMessage() { return $this->message; } }
å宣èšããªããšã誀ã£ãŠèª€ã£ãåã®å€æ°ãæž¡ãå¯èœæ§ããããã¢ããªã±ãŒã·ã§ã³ãæ··ä¹±ãããå¯èœæ§ããããŸãã ããšãã°ã $userId
ã¯string
ã§ãããšä»®å®ã§ãstring
ãå®éã«ã¯int
ã§ããå¯èœæ§ããããŸãã
ã³ã³ã¹ãã©ã¯ã¿ã«ééã£ãåãæž¡ããšãã¢ããªã±ãŒã·ã§ã³ããã®éç¥ã§äœããå®è¡ããããšãããŸã§ããšã©ãŒã¯ããããæ°ä»ãããŸããã ãããŠãçŸæç¹ã§ã¯ãããããint
代ããã«string
ãæž¡ãã³ãŒããæããã®ãäœããªããšããäžå¯è§£ãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã ãããã£ãŠãéçºäžã«ã§ããã ãæ©ããã®ãããªãšã©ãŒãæ€åºããããã«ãéåžžã¯ã§ããã ãæ©ãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãããããšãæšå¥šãããŸãã
ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãå宣èšã远å ããã ãã§æžã¿ãŸããééã£ãåã®ãã©ã¡ãŒã¿ãŒãæž¡ãããšãããšãPHPã¯åæ¢ããèŽåœçãªãšã©ãŒãããã«èŠåããŸãã
<?php declare(strict_types=1); class Notification { private $userId; private $subject; private $message; public function __construct( int $userId, string $subject, string $message ) { $this->userId = $userId; $this->subject = $subject; $this->message = $message; } public function getUserId() : int { return $this->userId; } public function getSubject() : string { return $this->subject; } public function getMessage() : string { return $this->message; } }
ããã©ã«ãã§ã¯ãPHPã¯ç¡å¹ãªåŒæ°ãæåŸ
ãããåã«ãã£ã¹ãããããšããããšã«æ³šæããŠãã ããã ãããé²ããèŽåœçãªãšã©ãŒãçæãããã®ãé²ãã«ã¯ãå³å¯ãªåæå®ïŒ strict_types
ïŒãæå¹ã«ããããšãéèŠã§ãã ãã®ãããã¹ã«ã©ãŒåã宣èšããããšã¯ãã«ãšã±ã®çæ³çãªåœ¢ã§ã¯ãããŸãããããšã©ãŒãæžããããã®è¯ãåºçºç¹ãšããŠåœ¹ç«ã¡ãŸãã å³å¯ãªåæå®ãç¡å¹ã«ãªã£ãŠããå Žåã§ããå宣èšã¯ãåŒæ°ã«ã©ã®åãæåŸ
ããããã«ã€ããŠã®æãããã«ãªãå¯èœæ§ããããŸãã
ããã«ãã¡ãœããã®æ»ãå€ã®åã宣èšããŸããã ããã«ãããç¹å®ã®é¢æ°ãåŒã³åºããšãã«æåŸ
ã§ããå€ãç°¡åã«å€æã§ããŸãã
æç¢ºã«å®çŸ©ãããæ»ãå€ã®åã¯ãæ»ãå€ãæäœãããšãã«å€ãã®switchã¹ããŒãã¡ã³ããé¿ããããã«ã圹ç«ã¡ãŸããæç€ºçã«æ»ãå€ã®åã宣èšããªããŠããã¡ãœããã¯ç°ãªãåãè¿ãããšãã§ããŸãã ãããã£ãŠãç§ãã¡ã®ã¡ãœããã䜿çšããŠãã人ã¯ãç¹å®ã®ã±ãŒã¹ã§ã©ã®ã¿ã€ããè¿ããããã確èªããå¿
èŠããããŸãã æããã«ã switch
ãå¿ããããšãã§ããŸãããããã¯æ€åºãå°é£ãªãšã©ãŒã«ã€ãªãããŸãã ãã ãã颿°ã®æ»ãå€ã®åã宣èšãããšããããã¯ããŸãäžè¬çã§ã¯ãªããªããŸãã
å€ãªããžã§ã¯ã
å宣èšã§ã¯è§£æ±ºã§ããªãåé¡ã¯ãè€æ°ã®é¢æ°åŒæ°ããããšãåŒã³åºããããšãã«ãããã®é åºãæ··ä¹±ããå¯èœæ§ãããããšã§ãã
åŒæ°ã®åãç°ãªãå ŽåãPHPã¯åŒæ°ã®é åºã®éåã«ã€ããŠèŠåããããšãã§ããŸãããåãåã®åŒæ°ãè€æ°ããå Žåã¯æ©èœããŸããã
ãã®å Žåã®ãšã©ãŒãåé¿ããããã«ã å€ãªããžã§ã¯ãã§åŒæ°ãã©ããã§ããŸã ã
class UserId { private $userId; public function __construct(int $userId) { $this->userId = $userId; } public function getValue() : int { return $this->userId; } } class Subject { private $subject; public function __construct(string $subject) { $this->subject = $subject; } public function getValue() : string { return $this->subject; } } class Message { private $message; public function __construct(string $message) { $this->message = $message; } public function getMessage() : string { return $this->message; } } class Notification { public function __construct( UserId $userId, Subject $subject, Message $message ) { $this->userId = $userId; $this->subject = $subject; $this->message = $message; } public function getUserId() : UserId { } public function getSubject() : Subject { } public function getMessage() : Message { } }
åŒæ°ã¯éåžžã«ç¹æ®ãªã¿ã€ãã§ãããããæ··åããããšã¯ã»ãŒäžå¯èœã§ãã
ã¹ã«ã©ãŒåã®å®£èšãããå€ãªããžã§ã¯ãã䜿çšããããšã®ãã1ã€ã®å©ç¹ã¯ãåãã¡ã€ã«ã§å³å¯ãªåæå®ãæå¹ã«ããå¿
èŠããªããªã£ãããšã§ãã ãããŠããããèŠããå¿
èŠããªããã°ããããå¿ããããšã¯ã§ããŸããã
æ€èšŒ
å€ãªããžã§ã¯ãã䜿çšããå Žåããªããžã§ã¯ãèªäœã®å
éšã§ããŒã¿ããã§ãã¯ããããžãã¯ãã«ãã»ã«åã§ããŸãã ãããã£ãŠãç¡å¹ãªç¶æ
ã®å€ãªããžã§ã¯ãã®äœæãé²ãããšãã§ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®ã¬ã€ã€ãŒã§å°æ¥åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ããšãã°ã UserId
ãåžžã«æ£ã§ãããšããã«ãŒã«ããããŸãã å
¥åãšããŠUserId
ãååŸãããã³ã«ç¢ºèªã§ããŸãããäžæ¹ã§ã UserId
ãã§ç°¡åã«å¿ããããšããããŸãã ãŸãããã®å¿ãã£ãœããã¢ããªã±ãŒã·ã§ã³ã®å¥ã®ã¬ã€ã€ãŒã§å®éã®ãšã©ãŒã«ã€ãªããå Žåã§ãããšã©ãŒã¡ãã»ãŒãžããå®éã«äœãæªãã£ãã®ããçè§£ããããšã¯é£ããããããã°ãè€éã«ãªããŸãã
ãã®ãããªãšã©ãŒãé²ãããã«ã UserId
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æ€èšŒã远å ã§ãUserId
ã
class UserId { private $userId; public function __construct($userId) { if (!is_int($userId) || $userId < 0) { throw new \InvalidArgumentException( 'UserId should be a positive integer.' ); } $this->userId = $userId; } public function getValue() : int { return $this->userId; } }
ãããã£ãŠã UserId
ãªããžã§ã¯ãUserId
ãããšãã«ãæ£ããç¶æ
ã«ãªã£ãŠããããšãåžžã«ç¢ºèªã§ããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªã¬ãã«ã§ããŒã¿ãåžžã«ãã§ãã¯ããå¿
èŠããªããªããŸãã
ããã§ã¯ã is_int
ã䜿çšãã代ããã«ã¹ã«ã©ãŒå宣èšã远å ã§ããŸãããããis_int
ã UserId
䜿çšãããŠããå ŽåUserId
is_int
匷ãåæå®ãæå¹ã«ããããšã«æ³šæããŠãã ããã ãããè¡ãããªãå ŽåãPHPã¯ä»ã®åãUserId
ãšããŠæž¡ããããã³ã«int
ã«ãã£ã¹ãããããšãUserId
ã ããã¯åé¡ã«ãªãå¯èœæ§ããããŸããããšãã°ããŠãŒã¶ãŒIDã¯éåžžfloat
ã¯ãªãããã float
æž¡ããšèª€ã£ã倿°ã«ãªãå¯èœæ§ãããããã§ãã ä»ã®å Žåãããšãã°Price
ãªããžã§ã¯ããæäœã§ããå ŽåãPHPã¯float倿°ãint
èªåçã«å€æãããããå³å¯ãªåæå®ãç¡å¹ã«ãããšäžžããšã©ãŒãçºçããå¯èœæ§ããããŸãã
äžå€æ§
ããã©ã«ãã§ã¯ãPHPã®ãªããžã§ã¯ãã¯åç
§æž¡ããããŸãã ã€ãŸãããªããžã§ã¯ãã«å€æŽãå ãããšãã¢ããªã±ãŒã·ã§ã³å
šäœã§å³åº§ã«å€æŽãããŸãã
ãã®ã¢ãããŒãã«ã¯å©ç¹ããããŸãããããã€ãã®æ¬ ç¹ããããŸãã SMSãšé»åã¡ãŒã«ãä»ããŠãŠãŒã¶ãŒã«éä¿¡ãããéç¥ã®äŸãèããŠã¿ãŸãããã
interface NotificationSenderInterface { public function send(Notification $notification); } class SMSNotificationSender implements NotificationSenderInterface { public function send(Notification $notification) { $this->cutNotificationLength($notification);
Notification
ãªããžã§ã¯ãã¯åç
§ã«ãã£ãŠæž¡ããããããæå³ããªãå¯äœçšãçºçããŸããã SMSNotificationSender
ã¡ãã»ãŒãžã®é·ããSMSNotificationSender
é¢é£ããNotification
ãªããžã§ã¯ããã¢ããªã±ãŒã·ã§ã³å
šäœã§æŽæ°ããããããåŸã§EmailNotificationSender
ã«éä¿¡ããããšãã«ã¡ãã»ãŒãžãåãæšãŠãããŸããã
ãããä¿®æ£ããã«ã¯ã Notification
ãªããžã§ã¯ããäžå€ã«ããŸãã 倿Žãè¡ãããã®setã¡ãœãããæäŸãã代ããã«ããããã®å€æŽãè¡ãåã«å
ã®Notification
ã³ããŒãäœæããã¡ãœããã远å ããŸãã
class Notification { public function __construct( ... ) { } public function getUserId() : UserId { } public function withUserId(UserId $userId) : Notification { $c = clone $this; $c->userId = clone $userId; return $c; } public function getSubject() : Subject { } public function withSubject(Subject $subject) : Notification { $c = clone $this; $c->subject = clone $subject; return $c; } public function getMessage() : Message { } public function withMessage(Message $message) : Notification { $c = clone $this; $c->message = clone $message; return $c; } }
ããã§ãããšãã°ã¡ãã»ãŒãžã®é·ããçããããªã©ã Notification
ã¯ã©ã¹ã倿Žãããšãã¢ããªã±ãŒã·ã§ã³å
šäœã«é©çšãããªããªããããŸããŸãªå¯äœçšãé²ãããšãã§ããŸãã
ãã ããPHPã§ã¯ããªããžã§ã¯ããçã«äžå€ã«ããããšã¯ïŒäžå¯èœã§ã¯ãªãã«ããŠãïŒéåžžã«é£ããããšã«æ³šæããŠãã ããã ããããã³ãŒãããããšã©ãŒèæ§ã«ããããã«ã¯ãã¯ã©ã¹ã®ãŠãŒã¶ãŒã倿Žãè¡ãåã«ãªããžã§ã¯ãã®ã¯ããŒã³ãäœæããå¿
èŠæ§ãèŠããå¿
èŠããªããªããããsetã¡ãœããã®ä»£ããã«ãäžå€ã®ãwithã¡ãœããã远å ããã ãã§ååã§ãã
nullãªããžã§ã¯ããè¿ã
æã
ãäœããã®å€ãŸãã¯null
è¿ãããšãã§ãã颿°ãã¡ãœããã«åºãããnull
ã ãããŠããããã®nullæ»ãå€ã¯åé¡ã«ãªãå¯èœæ§ããããŸããã»ãšãã©ã®å Žåãnullå€ã䜿çšããŠåŠçããåã«nullå€ããã§ãã¯ããå¿
èŠãããããã§ãã ãããå¿ããã¡ã§ãã
æ»ãå€ã確èªããå¿
èŠããªããããã«ã代ããã«nullãªããžã§ã¯ããè¿ãããšãã§ããŸãã ããšãã°ãå²åŒä»ããŸãã¯å²åŒãªãã®ShoppingCart
ãããå ŽåããããŸãã
interface Discount { public function applyTo(int $total); } interface ShoppingCart { public function calculateTotal() : int; public function getDiscount() : ?Discount; }
applyTo
ã¡ãœãããåŒã³åºãåã«ShoppingCartã®æçµå€ãèšç®ããå Žåã getDiscount(): null
颿°ãgetDiscount(): null
ãŸãã¯å²åŒãè¿ããããšãåžžã«ç¢ºèªããå¿
èŠããããŸãã
$total = $shoppingCart->calculateTotal(); if ($shoppingCart->getDiscount()) { $total = $shoppingCart->getDiscount()->applyTo($total); }
ãã®ãã§ãã¯ãå®è¡ãããªãå Žåã getDiscount()
ãnull
è¿ããšãã«PHPèŠåããã®ä»ã®å¯äœçšãgetDiscount()
null
ã
äžæ¹ãå²åŒãæäŸãããŠããªããšãã«nullãªããžã§ã¯ããè¿ããšããããã®ãã§ãã¯ãåé¿ã§ããŸãã
class ShoppingCart { public function getDiscount() : Discount { return !is_null($this->discount) ? $this->discount : new NoDiscount(); } } class NoDiscount implements Discount { public function applyTo(int $total) { return $total; } }
ããŠã getDiscount()
ãåŒã³åºããšãããšãå²åŒããªããŠããåžžã«Discount
ãªããžã§ã¯ããååŸããŸãã ãããã£ãŠãå²åŒãé©çšãããªãå Žåã§ããåèšéé¡ã«å²åŒãé©çšã§ãã if
ã¯äžèŠã«ãªããŸãã
$total = $shoppingCart->calculateTotal(); $totalWithDiscountApplied = $shoppingCart->getDiscount()->applyTo($total);
ãªãã·ã§ã³ã®äŸåé¢ä¿
nullã®æ»ãå€ãé¿ãããã®ãšåãçç±ã§ããã¹ãŠã®äŸåé¢ä¿ãåã«å¿
é ã«ããããšã§ããªãã·ã§ã³ã®äŸåé¢ä¿ãåé€ããããšèããŠããŸãã
ããšãã°ã次ã®ã¯ã©ã¹ãèããŸãã
class SomeService implements LoggerAwareInterface { public function setLogger(LoggerInterface $logger) { } public function doSomething() { if ($this->logger) { $this->logger->debug('...'); }
2ã€ã®åé¡ããããŸãã
doSomething()
ã¡ãœããã§ãã¬ãŒãåžžã«ãã§ãã¯ããå¿
èŠããããŸãã- ãµãŒãã¹ã³ã³ããã§SomeServiceã¯ã©ã¹ãæ§æãããšãã«ããã¬ãŒã®æ§æãå¿ããããã¯ã©ã¹ããããå®è¡ã§ããããšããŸã£ããç¥ããªãå ŽåããããŸãã
LoggerInterface
å¿
é ã®äŸåé¢ä¿ã«ããããšã§ãã³ãŒããç°¡çŽ åã§ããŸãã
class SomeService { public function __construct(LoggerInterface $logger) { } public function doSomething() { $this->logger->debug('...');
ããã§ããããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ç
©éããSomeService
ã誰ããSomeService
æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããã³ã«ãã¯ã©ã¹ãLoggerInterface
ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠãšããããšãLoggerInterface
ãæå®ãå¿ããããšãã§ããªããªããŸãã
ããã«ããã¬ãŒã®ååšãåžžã«ç¢ºèªããå¿
èŠæ§ããªãããŸãããããã«ããã doSomething()
ãçè§£ãããããªãã誰ãã倿Žãè¡ããã³ã«ãšã©ãŒã®åœ±é¿ãåãã«ãããªããŸãã
ãã¬ãŒãªãã§SomeService
ã䜿çšãããå Žåãnullãªããžã§ã¯ããè¿ãå Žåãšåãããžãã¯ãé©çšã§ããŸãã
$service = new SomeService(new NullLogger());
çµæãšããŠããã®ã¢ãããŒãã¯ãªãã·ã§ã³ã®setLogger()
ã¡ãœããã䜿çšããã®ãšåã广ããããŸãããã³ãŒããç°¡çŽ åããäŸåæ§æ³šå
¥ã³ã³ãããŒã§ã®ãšã©ãŒã®å¯èœæ§ãæžãããŸãã
ãããªãã¯ã¡ãœãã
ã³ãŒãã䜿ããããããã«ã¯ãã¯ã©ã¹å
ã®ãããªãã¯ã¡ãœããã®æ°ãå¶éããããšããå§ãããŸãã ãã®åŸãã³ãŒãã®æ··ä¹±ãå°ãªããªãããªãã¡ã¯ã¿ãªã³ã°æã«äžäœäºææ§ãæåŠããå¯èœæ§ãäœããªããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¢ãããžãŒã¯ããããªãã¯ã¡ãœããã®æ°ãæå°éã«æããã®ã«åœ¹ç«ã¡ãŸãã ããšãã°ã2ã€ã®éè¡å£åº§éã®ééãèããŠã¿ãŸãããã
$account1->withdraw(100); $account2->deposit(100);
ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããŒã¿ããŒã¹ã¯ãè£å
ãã§ããªãå ŽåïŒãŸãã¯ãã®éïŒã«åŒãåºãããã£ã³ã»ã«ã§ããŸããã $account1->withdraw()
ãŸãã¯$account2->deposit()
åŒã³åºããå¿ããªãããã«ããããšã¯ã§ããŸããã誀ã£ãæäœãžã
幞ããªããšã«ã2ã€ã®åå¥ã®ã¡ãœããã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«çœ®ãæããããšã§ããããç°¡åã«ä¿®æ£ã§ããŸãã
$account1->transfer(100, $account2);
ãã®çµæããã©ã³ã¶ã¯ã·ã§ã³ãéšåçã«å®äºããããšã§ãã¹ãç¯ãããšãããå°é£ã«ãªããããã³ãŒãã®ä¿¡é Œæ§ãé«ãŸããŸãã
ãšã©ãŒæ€åºã®äŸ
ãšã©ãŒæ€åºã¡ã«ããºã ã¯ããããã鲿¢ããããã«ã¯èšèšãããŠããŸããã åé¡ãçºèŠãããå Žåã«ã®ã¿åé¡ãèŠåããå¿
èŠããããŸãã ã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®å€éšã«ãããç¹å®ã®ééã§ããŸãã¯ç¹å®ã®å€æŽåŸã«ã³ãŒãããã§ãã¯ããŸãã
åäœãã¹ã
ãŠããããã¹ãã¯ãæ°ããã³ãŒããæ£ããæ©èœããããšã確èªããããã®åªããæ¹æ³ã§ãã ãŸãã誰ããã·ã¹ãã ã®äžéšãåç·šæããåŸã§ããã³ãŒããåŒãç¶ãæ£ããæ©èœããããšã確èªããã®ã«åœ¹ç«ã¡ãŸãã
ãŠããããã¹ãã®å®æœãå¿ããå¯èœæ§ãããããã Travis CIãGitLab CIãªã©ã®ãµãŒãã¹ã䜿çšããŠå€æŽãè¡ãå Žåã¯ãèªåçã«ãã¹ããå®è¡ããããšããå§ãããŸãã 圌ãã®ãããã§ãéçºè
ã¯äœããå£ãããšãã«éç¥ãåãåããŸããããã¯ã倿Žãæå³ãããšããã«æ©èœããããšã確èªããã®ã«ã圹ç«ã¡ãŸãã
ãšã©ãŒã®æ€åºã«å ããŠãåäœãã¹ãã¯ç¹å®ã®ã³ãŒãã䜿çšããåªããäŸã§ãããä»ã®èª°ããã³ãŒãã䜿çšãããšãã«ãšã©ãŒã鲿¢ããŸãã
ãã¹ãã«ãã¬ããžã¬ããŒããšçªç¶å€ç°ãã¹ã
ååãªãã¹ããæžãããšãå¿ããŠããŸãå¯èœæ§ãããããããã¹ãæã«Coverallsãªã©ã®ãµãŒãã¹ã䜿çšããŠãã³ãŒãã«ãã¬ããžã«é¢ããã¬ããŒããèªåçã«çæãããšäŸ¿å©ã§ãã ã³ãŒãã«ãã¬ããžãäœäžãããã³ã«ãCoverallsããéç¥ãéä¿¡ãããæ¬ èœããŠãããã¹ãã远å ã§ããŸãã Coverallsã®ãããã§ãã³ãŒãã«ãã¬ããžãæéãšãšãã«ã©ã®ããã«å€åããããçè§£ããããšãã§ããŸãã
ååãªåäœãã¹ããããããšã確èªããå¥ã®æ¹æ³ã¯ãããšãã°Humbugã䜿çšããŠãçªç¶å€ç°ãã¹ãã䜿çšããããšã§ã ã ååã瀺ãããã«ã圌ãã¯ç§ãã¡ã®ã³ãŒãããã¹ãã§ååã«ã«ããŒãããŠãããã©ããã確èªãããœãŒã¹ã³ãŒãããããã«å€æŽããŠããããŠããããã¹ããå®è¡ããŸãã
ã³ãŒãã«ãã¬ããžã¬ããŒããšçªç¶å€ç°ãã¹ãã䜿çšããŠããŠããããã¹ãããšã©ãŒãé²ãã®ã«ååã§ããããšã確èªã§ããŸãã
éçã³ãŒãã¢ãã©ã€ã¶ãŒ
ã³ãŒãã¢ãã©ã€ã¶ãŒã¯ãéçºããã»ã¹ã®éå§æã«ã¢ããªã±ãŒã·ã§ã³ã®ãšã©ãŒãæ€åºã§ããŸãã ããšãã°ã PhpStormãªã©ã®IDEã¯ãã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠãšã©ãŒãèŠåããã³ãŒããèšè¿°ãããšãã«ãã³ããæäŸããŸãã ãšã©ãŒã¯ãåçŽãªæ§æããå埩çãªã³ãŒããŸã§ããŸããŸã§ãã
ã»ãšãã©ã®IDEã«çµã¿èŸŒãŸããŠããã¢ãã©ã€ã¶ãŒã«å ããŠãç¹å®ã®åé¡ãç¹å®ããããã«ããµãŒãããŒãã£ã®ã¢ãã©ã€ã¶ãŒãã«ã¹ã¿ã ã¢ãã©ã€ã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãããã»ã¹ã«å«ããããšãã§ããŸãã PHPãããžã§ã¯ãã«é©ããã¢ãã©ã€ã¶ãŒã®éšåçãªãªã¹ãã¯ã GitHubã«ãããŸã ã
SensioLabs Insightsãªã©ã®ãªã³ã©ã€ã³ãœãªã¥ãŒã·ã§ã³ããããŸãã
ãã®ã³ã°
ä»ã®ã»ãšãã©ã®ãšã©ãŒæ€åºã¡ã«ããºã ãšã¯ç°ãªãããã®ã³ã°ã¯å®çšŒåç°å¢ã§å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ãšã©ãŒãæ€åºããã®ã«åœ¹ç«ã¡ãŸãã
ãã¡ãããããã«ã¯ãäºæããªãããšãçºçãããšãã«ã³ãŒãããã°ã«æžã蟌ãããšãå¿
èŠã§ãã ã³ãŒãããã¬ãŒããµããŒãããŠããå Žåã§ããã¢ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããæã«ãã¬ãŒãå¿ããããšãã§ããŸãã ãããã£ãŠããªãã·ã§ã³ã®äŸåé¢ä¿ã¯é¿ããŠãã ããïŒäžèšãåç
§ïŒã
ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã¯å°ãªããšãéšåçã«ãã°ãèšé²ããŸãããããã«æžã蟌ãŸããæ
å ±ã¯ã KibanaãNagiosãªã©ã®ããŒã«ã䜿çšããŠåæããã³å¶åŸ¡ãããšãéåžžã«è峿·±ããã®ã«ãªããŸãã 圌ãã¯ã人ã
ãã¢ããªã±ãŒã·ã§ã³ããã¹ããããšãã§ã¯ãªãç©æ¥µçã«äœ¿çšãããšãã«ãã¢ããªã±ãŒã·ã§ã³ã§ã©ã®ãããªãšã©ãŒãèŠåãçºçããããç¥ãããšãã§ããŸãã
ãšã©ãŒãæå¶ããªã
ãšã©ãŒãèšé²ããå Žåã§ãããšã©ãŒã®äžéšãæå¶ãããããšããããŸãã ãå埩ããšã©ãŒãçºçããå ŽåãPHPã¯åäœãç¶ããåŸåããããŸãã ãã ãããã°ã¯ã³ãŒãå
ã®ãã°ã瀺ãå¯èœæ§ããããããæ°æ©èœãéçºãŸãã¯ãã¹ããããšãã«åœ¹ç«ã¡ãŸãã @ã䜿çšããŠãšã©ãŒãæå¶ãããš ãã»ãšãã©ã®ã³ãŒãã¢ãã©ã€ã¶ãŒãèŠåã衚瀺ããã®ã¯ãã®ããã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšåŸã«å¿
ç¶çã«å衚瀺ããããšã©ãŒãé ãããå¯èœæ§ããããŸãã
ååãšããŠãããããªèŠåã§ãã¡ãã»ãŒãžãåä¿¡ããã«ã¯ã error_reporting PHP E_ALL
ã¬ãã«error_reporting PHP E_ALL
ã«èšå®ããããšerror_reporting PHP E_ALL
ããŸãã ãã ãããããã®ã¡ãã»ãŒãžãã©ããã«èšé²ãããŠãŒã¶ãŒããé ãããšãå¿ããªãã§ãã ãããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ãŸãã¯æœåšçãªè匱æ§ã«é¢ããæ©å¯æ
å ±ã«ãšã³ããŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããªããªããŸãã
error_reporting
ã«å ããŠãåžžã«strict_types
ãå«ããããšãéèŠstrict_types
ããã«ãããPHPã颿°åŒæ°ãæåŸ
ãããåã«èªåçã«strict_types
ããããšããªããããæ€åºãå°é£ãªãšã©ãŒïŒããšãã°ã float
ãint
ã«ãã£ã¹ãããéã®äžžããšã©ãŒïŒã«ã€ãªããå¯èœæ§ããããŸãã
PHPã®å€éšã§äœ¿çšãã
ãã«ãšã±ã¯ç¹å®ã®ææ³ãããæŠå¿µã§ãããããPHPã«é¢ä¿ã®ãªãåéã«ãé©çšã§ããŸãã
ã€ã³ãã©
ã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ãã«ã§ã¯ã Vagrantãªã©ã®ããŒã«ã䜿çšããŠã éçšç°å¢ãšåäžã®å
±ééçºç°å¢ãäœæããããšã«ãããå€ãã®ãšã©ãŒãé²ãããšãã§ããŸãã
JenkinsãGoCDãªã©ã®ãã«ããµãŒããŒã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®å±éãèªååãããšã倿Žãã¢ããªã±ãŒã·ã§ã³ã«å±éããéã®ãšã©ãŒãé²ãããšãã§ããŸãã
REST API
REST API
ãäœæãããšããAPIã®äœ¿çšãç°¡çŽ åããããã«poka-yokeãå®è£
ã§ããŸãã ããšãã°ãURLãŸãã¯ãªã¯ãšã¹ãã®æ¬æã§äžæãªãã©ã¡ãŒã¿ãŒãæž¡ããããã³ã«ãšã©ãŒãè¿ãããã«ã§ããŸãã APIã¯ã©ã€ã¢ã³ãã®ãç Žæããé¿ãããã®ã§ãããã¯å¥åŠã«æãããããããŸããããååãšããŠãéçºããã»ã¹ã®åææ®µéã§ãšã©ãŒãä¿®æ£ãããããã«ãAPIã䜿çšããŠããéçºè
ã«èª€ã£ãŠäœ¿çšãããŠããããšãã§ããã ãæ©ãèŠåããããšããå§ãããŸã
, API color
, -, API, colour
. - , .
, API, , Building APIs You Won't Hate .
- . , . , color
colour
, , .
, . â , .
poka-yoke . , , , . .
ãããã«
poka-yoke , , , , . -, , , .
â , , , , , . , , .
, , public- .