2012-03-05 10 views
1

私はPHPを使って小さなCMSを開発する必要があり、今私は構造を理解しようとしています。静的メソッドかどうか

CMSは一連の機能を使用して生成されます。データベース機能、キャッシング機能、国際化などの機能

私はこのようにそれを行うには考えていた:

  • は大きな「サイト」クラスの機能は非静的メソッドの一部を作ります。そうすれば、そのクラスの複数のインスタンスを実行できます。私はここでの主な問題は、CMSが複数の小規模なサイトを管理することができるはずということですけれども...

  • または静的メソッド

と別々のクラスに機能を分割することを行う必要があるだろうかわかりません、ただ一つではない。だから私はすべてのメソッドを静的にし、 "サイトスイッチ"機能を追加するか、私が管理したいサイトに基づいてインスタンス化する通常のオブジェクトにします。

これらはどれが最適ですか?

+0

を参照してくださいクラス「1内のすべての」モノリシックを作ることはありません。さまざまな理由で悪い習慣です。クラスの実装に関する詳細については、[この質問の質問](http://stackoverflow.com/questions/9556899/database-class-design)をご覧ください。 – Bojangles

+1

これはまったく新しいプロジェクトですか?もしそうなら、何らかのMVCフレームワークを使用しないのはなぜですか?それらのほとんどはあなたの質問で言及したようにうまく動作します。 – B4NZ41

+1

*「どれが最良の選択肢ですか?」*ソフトウェアエンジニアリングについての本格的な議論なしには答えが難しいです。しかし、私はこれを言うでしょう:しばしば静的は悪です**。 [ここにはPHPベースの理由の説明があります](http://kore-nordmann.de/blog/0103_static_considered_harmful.html)、ここでは[PHP開発を目標としていない素晴らしいメタファーを持つ別のもの](http:// www .daedtech.com/static-methods-time-to-hit-rock-bottom)。私は強く依存性注入のために静的を避けることをお勧めします。自分でアップグレードしたい場合は、自分でアップグレードしてください。そうでない場合は、フレームワークを試してみてください。 – rdlowrey

答えて

1

私はこの仕事に静的なクラスを使用することをお勧めします。このルートを使用すると、すべての関数の疑似名前空間が作成されるので、関数名の衝突などを心配する必要がなくなり、ヘルパークラスのインスタンスを渡す必要がなくなるため、ヘルパー関数。

10

一般に、静的メソッドは悪い方法です。彼らは多くの潜在的な問題を導入します。

1)隠された依存関係を導入します。任意にfoo :: bar()を呼び出すコードはfooに依存し、fooが定義されていなければ実行できません。 foo :: bar()を使用するオブジェクトは正しく構築されますが、fooが定義されていない場合は使用できません。

2)統計はグローバルです。グローバルな状態は非常に悪く、何かがコードを変更でき、その状態は不明です。静的メソッドを使用して、OOPカプセル化によって達成されるパワーと制御を犠牲にします。

3)それは、ユニットテストを不可能にする異なるバージョン

4)のための機能を代用することは不可能です。より詳細な情報やコード例については

this articlethis article

+1

これは受け入れられる回答でなければなりません。 – PeeHaa

+0

'foo :: bar()'はグローバルな状態で、 'foo_bar()'とほぼ同じです...それでグローバル状態を避けることは不可能ですか?たとえば、array_push()、array_rand()などの組み込み手続き関数を取ります。メソッドのどこかで 'array_push()'を使用すると、グローバル状態も導入されますか? – Yang

+0

これらは技術的に静的な葉の方法であり、2番目のリンクでMisko Heveryが指摘している:「静的な葉の方法は、成長して問題になるのを待っている滑りやすい斜面です。 Math.abs(-5)は〜、本当に-5.abs()を書いています。組み込み関数は、時間の経過とともに変更することはできず、隠れた依存関係の問題を抱えていないため(常に利用可能です)、問題はありません。テスト中に代入することは不可能です。メソッドとともに静的メソッドをテストする必要がありますあなたはテストしようとしています。 –

関連する問題