はむはむエンジニアぶろぐ

365日エンジニアリング

マーカーインターフェースを使った例外設計

f:id:secret_hamuhamu:20150906230549j:plain
マーカーインターフェースを使った例外設計をPHPで行います。
マーカーインターフェースは、実装を持たない空っぽのインターフェースです。

こんなやつ。

<?php
interface MarkerInterface {}

複数の例外をキャッチしなければならない場合、マーカーインターフェースを使用すると例外処理の重複を減らしコンパクトにすることができます。

例外処理の重複

例えば以下のように、とあるメソッドを実行すると複数の例外パターンが返ってくる場合、たくさんのcatchを書かねばなりません。

<?php
class Controller
{
    public function index()
    {
        try {
            $facade = new HogeFacade();
            $facade->execute();
        } catch(NotSupportProtocolException $e) {
            echo '400エラー';
        } catch(InvalidParamsException $e) {
            echo '400エラー';
        } catch(NotExistDataException $e) {
            echo '500エラー';
        } catch(DatabaseErrorException $e) {
            echo '500エラー';
        } catch(Exception $e) {
            echo '500エラー';
        }
    }
}


例外クラス

<?php
class NotSupportProtocolException  extends Exception {}
class InvalidParamsException       extends Exception {}
class NotExistDataException        extends Exception {}
class DatabaseErrorException       extends Exception {}

かなり、辛い。
例外のパターンが増えた際、テストが大変ですし例外処理が重複しています。


マーカーインターフェースを使う

<?php
class Controller
{
    public function index()
    {
        try {
            $facade = new HogeFacade();
            $facade->execute();
        } catch(BadRequestMarkerInterface $e) {
            echo '400エラー';
        } catch(InternalServerErrorMarkerInterface $e) {
            echo '500エラー';
        } catch(Exception $e) {
            echo '500エラー';
        }
    }
}


マーカーインターフェース

<?php
interface BadRequestMarkerInterface {}
interface InternalServerErrorMarkerInterface {}


例外クラス

先ほどのマーカーインターフェースを実装する

<?php
class NotSupportProtocolException  extends Exception implements BadRequestMarkerInterface {}
class InvalidParamsException       extends Exception implements BadRequestMarkerInterface {}
class NotExistDataException        extends Exception implements InternalServerErrorMarkerInterface {}
class DatabaseErrorException       extends Exception implements InternalServerErrorMarkerInterface {}

各例外クラスにマーカーインターフェースを実装させたことで、catchできる例外名にマーカーインターフェースを指定することができる。
グルーピングみたいなもんですね。
重複処理が減り、今後の機能拡張に負債を残さずに済みました。

おすすめの本

実装パターン

実装パターン

  • 作者: ケント・ベック,Kent Beck,永田渉,長瀬嘉秀,株式会社テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/12/22
  • メディア: 単行本(ソフトカバー)
  • 購入: 30人 クリック: 502回
  • この商品を含むブログ (91件) を見る

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)

  • 作者: マイケル・C・フェザーズ,ウルシステムズ株式会社,平澤章,越智典子,稲葉信之,田村友彦,小堀真義
  • 出版社/メーカー: 翔泳社
  • 発売日: 2009/07/14
  • メディア: 大型本
  • 購入: 45人 クリック: 673回
  • この商品を含むブログ (152件) を見る

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

  • 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2012/06/23
  • メディア: 単行本(ソフトカバー)
  • 購入: 68人 クリック: 1,802回
  • この商品を含むブログ (131件) を見る