19

まず第一に、ググってみましたが、ほとんどの場合、定数やその他の無関係な情報で配列を定義する方法についての議論しか見つかりませんでした.

コードを読みやすく (そしてきれいに) するための解決策について質問があります。基本的に、私はほとんどの関数が成功を示すステータス コードを返すか、何か問題が発生した場合はエラー コードを返すようにしています。このために、次のように、定数のみを含む「StatusCode」というクラスを作成しました。

<?php
class StatusCode {
  const success = 0;
  const badArgument = -1;
  const badQuery = -2;
  const outOfMana = -3; //Really just for demonstration purposes
  ...
}

目的は、コードからマジック ナンバーを消し、どこかで説明を探す必要なく、何が問題なのかを明確にすることです。

if (mana > 10) {
  //Do some magic
  return StatusCode::success;
}
else {
  //Oh god this is not good!
  return StatusCode::outOfMana;
}

また、誤って重複したエラー コードを使用する可能性を排除する必要があります。これにより、アプリケーションにわずかなオーバーヘッドが追加されることは間違いありませんが、コードが理解しやすくなりました。これを行わない、地球を揺るがすような理由はありますか? 多分それについてもっと良い方法はありますか?

(私はこのアプローチを避けてきましdefine(CONSTANT, "value")た。なぜなら、見た目が悪く、ドイツ語のキーボードで書くのが面倒だからです :))

4

3 に答える 3

29

In Java and other languages this is a commonly used way to namespace constants to avoid naming collisions. See here;

The way that I would implement such a class is like this"

// make this final so no one can extend it
final class Errors{
    const SUCCESS = 0;
    const BAD_ARGUMENT = -1;
    const BAD_QUERY = -2;
    const OUT_OF_MANA = -3;

    // make this private so noone can make one
    private function __construct(){
        // throw an exception if someone can get in here (I'm paranoid)
        throw new Exception("Can't get an instance of Errors");
    }
}
于 2013-05-31T05:55:10.547 に答える
1

これには、名前空間とグループ化定数の利点があります。そのクラスでリフレクションを使用して、定義された定数を反復処理できます。これにより、たとえば、値が特定の定数グループの値であることを検証できます (貧しい人の定数型ヒントを有効にします)。

欠点は、クラスを悪用していることです (わずかですが)。純粋主義者はそれを好まないかもしれません。同じクラスで使用されていない定数は、グローバル定数にする必要があります。\StatusCodes\SUCCESSPHP 5.3 以降のようなものに名前空間を付けることもできます。

選択はあなた次第です。

于 2013-05-31T06:07:45.750 に答える
0

静的クラスを作成すると問題が解決し、複数のインスタンスの作成を回避できますStatusCode

アプリケーションが複数の StatusCode クラスを持つことができるが、それでも StatusCode が静的であると思われる場合は、名前空間を使用できます。

シングルトンパターンを使用したい場合、これも機能します

選択はあなた次第です!

于 2013-05-31T06:25:29.233 に答える