2012-02-15 12 views
2

私はゲームのサイトにSteamのようなアチーブメントを追加する予定です。計算はスケジュールされたcronによって処理され、結果は典型的なMySQLデータベースに格納されます。便宜上、さまざまな計算方法をすべて1つの巨大なSTATSクラスにダンプすることを検討していました。これらは、この特定の業績cronのためだけにサイトの他の側面によって決して呼び出されない方法です。クラスは大きすぎることができますか?

このクラスが大きくなり過ぎることを心配する必要はありますか?メモリの制約がある程度存在しないので、それは今およそ2kのLOCだが、それは時間をかけて、10K、または50Kに拡張することができなかった理由はありません...

これは...、共有ところでホスティングに

です

答えて

2

はい、クラスが大きくなりすぎる可能性があります。

このような状況が発生した場合、それは通常、間違った責任の兆候です。あまりにも多いクラスはAntiPattern called The Blob aka God classです。これらのクラスはSingle Responsibiliy Principleに違反しており、結合と結合にマイナスの影響を与えます。これにより、アプリケーションの再利用性が低下し、拡張と保守が難しくなります。

責任を適切に分割するには、どのデータを論理的にグループ化してから別のオブジェクトにするかを検討します。 longongy longメソッドについても同様です。それらを分けなさい。特定のサブルーチンがオブジェクト内に多くの領域を占めていることがわかったら、そのアルゴリズムをカプセル化した戦略にそのコードを宣伝できるかどうかを確認してください。

具体的なケースでは、コマンドパターンの恩恵を受けるようです。多くのStatCommands(戦略である)を使用する1つのStatsCommanderがあります。これにより、さまざまな統計情報をきれいに分離するために必要なロジックが維持されます。新しいStatを追加する必要があるときは、新しいStrategy/Commandを追加するだけです。

0

なぜクラスが大きくなりすぎると思いますか?

そして、あなたは同じクラスの複数のインスタンスを使用することができると思うなら、あなたはstaticとして、すべてのこれらのメソッドを作ることができるのいずれか(だから、すべての機能がインスタンスを1つだけ持つことになります。)

それとものインスタンスを1つだけ作成します元のインスタンスの前に&を使用して他の人が同じインスタンスにアクセスできるようにします。

Singleton Patternを使用することもできます。あなたは、小さなクラスを作成し、それらをあなたの今の大きなクラスのメンバにすることを検討することができます

EDIT

これにより、コードが整理され、クラスがそれに応じて分割されます。

+0

私はそうは思わない。もし私がそう思ったら、私はこの質問に「クラスが大きくなりすぎることはできないのですか? – Drew

0

クラスを大きくすると、ほとんどの関数が使用されず、オブジェクトが存在するまでメモリに残りますが、それよりもシンプトンのようなオブジェクトをほとんど作成しないと、メモリが漏れてしまうという欠点しかありません完璧です。

非常に良い事実は、クラス内にいくつの関数がありますかということですが、単一関数の実行には、クラス内の単一の関数を宣言して使用するのと同じ時間がかかります。

クラス間で継承を実装することをお勧めします。コード構成も同じです.OODを作成してください。したがって、コードの変更と管理に要する時間は短くなります。カプセル化とポリモーフィズムを利用してください:)

0

クラスを記述する場合は、あなたが「インスタンスとして必要なこの機能であるか、またはグローバル関数として?」自問し、これが最良の例で説明されています

class House { 

    private $door; 
    private $window; 
    private static $adverb; 

    public function __construct(Door $door, Window $window) { 
     $this->door = $door; 
     $this->window = $window; 
    } 

    public function placeNewDoor($door) { 
     $this->door = $door; 
    } 
    public function placeNewWindow() { 
     $this->window = $window; 
    } 

    public static function advertiseNeighborhood() { 
     echo "Advertisment! " . self::$adverb; 
    } 

} 

多くの家があり、それぞれがおそらくDoorWindowを持っています。したがって、これらはそれぞれ、インスタンスメソッド/プロパティを取得します。ただし、Neighborhoodは1回のみ(自宅ではない)広告するので、機能は静的で、House::advertiseNeighborhoodでアクセスされます。

この例を投稿したのはなぜですか?インスタンス化する必要のない関数がある場合は、staticのままにしておく必要があります。複数のオブジェクトをインスタンス化するときにメモリリークが発生しないようにします。

あなたの実際の質問については、非常に大きなクラスを持つことは完全に容認できます。あなたのメモリを過度に使用しないようにしてください。

関連する問題