䟋ずしおPHPを䜿甚したプログラミングでのポカペケ原理の適甚


みなさんこんにちは 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); // Send an SMS... } /** * Makes sure the notification does not exceed the length of an SMS. */ private function cutNotificationLength(Notification $notification) { $message = $notification->getMessage(); $messageString = substr($message->getValue(), 160); $notification->setMessage(new Message($messageString)); } } class EmailNotificationSender implements NotificationSenderInterface { public function send(Notification $notification) { // Send an e-mail ... } } $smsNotificationSender = new SMSNotificationSender(); $emailNotificationSender = new EmailNotificationSender(); $notification = new Notification( new UserId(17466), new Subject('Demo notification'), new Message('Very long message ... over 160 characters.') ); $smsNotificationSender->send($notification); $emailNotificationSender->send($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('...'); } // do something if ($this->logger) { $this->logger->warning('...'); } // etc... } } 

2぀の問題がありたす。


  1. doSomething()メ゜ッドでロガヌを垞にチェックする必芁がありたす。
  2. サヌビスコンテナでSomeServiceクラスを構成するずきに、ロガヌの構成を忘れたり、クラスがこれを実行できるこずをたったく知らない堎合がありたす。

LoggerInterface必須の䟝存関係にするこずで、コヌドを簡玠化できたす。


 class SomeService { public function __construct(LoggerInterface $logger) { /* ... */ } public function doSomething() { $this->logger->debug('...'); // do something $this->logger->warning('...'); // etc... } } 

これで、パブリックむンタヌフェむスの煩雑さが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- .



Source: https://habr.com/ru/post/J333592/


All Articles