6

私はちょうど 450 行の長さの PHP クラスを作成しており、14 の静的メソッドと 4 つの静的プロパティ、および 6 つの定数 (およびプライベート__construct()__clone()) が含まれています。

ここで私は何か間違ったことをしているのだろうか、私のクラスは悪なのでしょうか?

クラスを使用するときは、常に次のような単一のメソッドを呼び出します。

MyClass::coolMethod();

そして、それを完全に放っておくので、それを構築可能にするのはばかげていると感じますか?

直接呼び出すことができるいくつかのメソッドを含むツールに似ているため、そこからオブジェクトを構築することにはあまり意味がありません。

実際には、これらの 14 個のメソッドのうち、7 個はパブリックであり、残りはクラスが使用するためのプライベートです。

4

5 に答える 5

4

staticほど避けるべきglobalです。

スタティックは、グローバルがもたらすのと同じ欠点をもたらします。クラスメソッドを使用しているときはいつでも、そのクラスへの依存関係を消費コードにハードコーディングしています。その結果、保守性の低い密結合コードになります。これは、静的を完全に回避し、依存性注入を規則正しく使用することで簡単に回避できます。

静的クラスを注入して渡すことはできないため、たとえば、それらを単体テストする必要がある場合、それらをモックすることはできません(または少なくともいくらかの努力が必要です)。単純に痛いです。静的メソッドは、テスト容易性にとって致命的です。

また、クラスは 1 つのことだけを行う必要があることに注意してください。単一の責任を持つ必要があります。あなたのクラスを調べて、神のクラスを書くのを避けるために他の場所に配置した方が良いものがそこにあるかどうかを確認してください。

于 2010-12-06T15:13:27.550 に答える
3

このクラスの目的によります。メソッドがデータに関してほとんど一貫性がない場合、これはグループ化関数 (現在はメソッド) の完全に有効なソリューションです。関数間で値を共有する必要がある場合、これは非常に悪い考えです。共通の名前でグループ化された関数の単純なリスト以上のものになるからです。名前空間も別のオプションですが、5.3 より前のバージョンの PHP を使用している場合は、おそらくこれが最適なソリューションです。

于 2010-12-06T15:06:30.720 に答える
2

これは、「私は寝室が 4 つある家を持っています。それは悪いことですか?」と言っているようなものです。

静的メソッドは良くも悪くもありません。14 のメソッドを持つことは、良いことでも悪いことでもありません。14 個の静的メソッドを持つことは、ひいては、良いことでも悪いことでもありません。

14 個のメソッドで、オブジェクト インスタンスをシミュレートしたり、継承をシミュレートしたりするために多大な時間を費やしている場合は、何かがひどく間違っています。PHP ではインスタンスを作成でき、継承がサポートされているため、他の方法でそれらをシミュレートしようとするのはばかげています。

しかし、クラスを本質的に名前空間のように使用しているだけで、関数とデータがすべて一緒に機能し、競合するクラスの個々のインスタンスがない場合、それはまったく問題ありません。

于 2010-12-06T15:07:26.400 に答える
1

悪くない。ただし、これらすべての静的な小道具を使用して、これをシングルトンにすることを検討することをお勧めします。

これは、私が構築しているフレームワークで使用しているシングルトン コードです。それをバラバラにして、それ自体の 1 つのバージョンを返すクラスの唯一のパブリック メソッドにすることができます。

class ClassName {
    function getInstance()
        {
            static $instance;

            if (!isset($instance)) 
      {
                $instance = new ClassName();
            }

            return $instance;
        }
}

これを使用するには、ClassName::GetInstance()->othermethod(); を実行します。

クラスは大量のプライベート値を持つことができ、それ以外の場合は、オブジェクトで持っているすべての優れたものを取得できます。

于 2010-12-06T15:14:19.683 に答える
0

いいえ、悪くはありません。実際、これは以前に特定の動作を偽造する唯一の方法でした。たとえば、名前空間を偽造する方法でした。関数を「無料で」使用する代わりに、静的クラスにカプセル化することもできます。したがって、多くのphp開発者はこれに精通しており、実際にはほとんどの人を混乱させることはありません。しかし、最近はPHPの「新しい」名前空間機能を利用し、実際にデータをオブジェクト形式で格納する必要がある場合は、それをシングルトンパターンと組み合わせる必要があります。名前空間に「グローバル」変数を含めることもできますが、それは時々正常に機能する可能性があります。しかし、名前空間を見て、それが何らかの形であなたに合うかどうかを確認し、その後、シングルトンパターンが特定のニーズに一致するかどうかを確認してください。

于 2010-12-06T15:35:22.857 に答える