0

私が取り組んでいるこのプロジェクトのベスト プラクティスとパフォーマンスに関していくつか質問があります。壮大な質問をお許しください。

私は現在、PHP と MySql を使用してテキスト ベースのゲームを構築しています。これは、これまでのコア ファイルで約 2,500 行です。現在、これは完全にモジュール化された関数のライブラリです。データ アクセスに使用されるものもあれば、データ操作に使用されるものもあります。

私の最初の質問は次のとおりです。ItemManager という 1 つのクラスには、データベース内のゲーム アイテムを追加、更新、および削除するための多数のメソッドが含まれています。これらのメソッドの唯一の共通点は、データベースと対話することです。現在、コンストラクターは mysqli オブジェクトを要求し、それをすべての関数で使用します。ただし、MongoDB をプロジェクトに追加すると、これらの関数の一部が別のデータベースと対話する可能性があります。

これらすべての関数を単純に静的にすることは、受け入れられるか、または好ましいでしょうか? オブジェクトが 1 つしかない場合にオブジェクトをインスタンス化する理由はわかりません。また、クラス メンバーを維持する必要もありません。では、静的メソッドを使用する必要がありますか? なんで?

2 番目の質問: PHP BESIDES のモジュール性でクラスを使用する利点を誰かが理解するのを手伝ってくれますか (関数のファイルで同じ効果を達成できるため)。Java のバックグラウンドを持つ私は、オブジェクトがアプリケーションの存続期間を通じてデータと状態を維持するため、永続的な環境での OOP の利点を認識しています。ただし、PHP では、スクリプトの存続期間はほんの一瞬であり、すべての状態情報はデータベース内に保存されます。ほとんどすべての関数はデータベースを操作するだけですが、その目的は何ですか? 関数を呼び出すだけでオブジェクトをインスタンス化しても意味がありませんか? クラスのオブジェクトをインスタンス化せずに、分類されたデータ操作クラスを含む完全に静的なクラスを作成できますか?関数のファイルよりもクラスを使用する必要がある理由は何ですか? 基本的に同じではないですか?完全に静的な関数は受け入れられますか?

お時間をいただきありがとうございます。その質問を短いテキストに分割する方法がわかりませんでした。申し訳ありません。

4

3 に答える 3

0

では、静的メソッドを使用する必要がありますか? なんで?

静的メソッドは通常、グローバル状態である静的変数にアクセスします (この点ではグローバル変数と同じです)。これは、多くの理由で不適切です。

また、オブジェクトのインスタンスは、同じインターフェイスを持つ別のオブジェクトに置き換えることができますが、それを使用する関数に別のオブジェクトを渡すだけでは、静的メソッドを簡単に置き換えることはできません。その結果、それらをモックすることはできず、それらを使用するコードは簡単に単体テストできません。

可能であれば、静的メソッドを使用しないでください。

于 2013-06-01T18:59:07.123 に答える
0

これらすべての関数を単純に静的にすることは、受け入れられるか、または好ましいでしょうか? オブジェクトが 1 つしか存在しない場合、オブジェクトをインスタンス化する理由がわかりません

このクラスが実行できることだけを実行したい場合は、オブジェクトをインスタンス化する必要はありません。静的メソッドを使用すると、コード ベース全体でクラス名をハードコーディングすることで、すべてのクライアント コードをクラスに結合できます。後で、別のアイテム マネージャー サービスを使用して要求を満たしたいと判断した場合、最悪の事態になることは間違いありません。

「別のアイテム マネージャー」は、単に「残りのコードの単体テストに使用されるモック マネージャー」のコードであることに注意してください。そのため、代替手段がサポートされない場合でも、そのような静的を使用すると、コードは実質的にテストできなくなります。

もちろん、別のアイテム マネージャーが存在する可能性が非常に高いことはすでに述べました。現在のアイテム マネージャーがmysqliオブジェクトを受け入れる場合、明らかに、マネージャー コードとmysqliインターフェイスの間に抽象化レイヤーはありません。別のオブジェクトを使用して Mongo に接続する場合、現在のアイテム マネージャー コードはどのように両方の構成をサポートするのでしょうか? 新しいアイテム マネージャ クラスを作成する必要はありませんか? クラス名がどこでもハードコーディングされている場合、それを残りのコードとどのように統合しますか?

反対側からも状況を見てみましょう。何がstatic得になるのでしょうか。

明らかに、それはアイテムマネージャーを「シングルトン」オブジェクトにします。PHP ではこの考えを無視することはできません (マルチスレッドがサポートされ、スレッド間の依存関係が隠されている他の言語と同様)。アイテム マネージャをシングルトンにしたい場合は、単純に 2 つ目のインスタンスを作成しないでください。何らかの理由でこれを強制したい場合は、静的変数を使用してインスタンス化をカウントし、複数回試行した場合はスローします。最後に、finalこの制限を外せないようにクラスを作成します。結果: ではないシングルトンstatic

これがすべてでstaticあり、上記に照らして、議論として立つのは非常に弱い.

クラスメンバーを維持する必要はありません。では、静的メソッドを使用する必要がありますか? なんで?

これが何を意味するのかわかりません。コンストラクターには、クラス メンバーになるすべての権利を持つデータベース ドライバー オブジェクトが既に必要であるとのことです。これは、ここで static を使用する方法ではないことを示すもう 1 つの明白なヒントです。

PHP BESIDES モジュール性でクラスを使用する利点を理解するのを手伝ってくれる人はいますか (関数のファイルで同じ効果を達成できるため)。

ここで OOP の明確な議論を提示するつもりはありませんが、代わりに反論を提起します。同じ実行時効果を実現できますが、アプリケーションの保守性とデバッグ性を同じレベルで達成することは絶対に不可能です。劣ったソリューションを使用する理由

Java のバックグラウンドを持つ私は、オブジェクトがアプリケーションの存続期間を通じてデータと状態を維持するため、永続的な環境での OOP の利点を認識しています。ただし、PHP では、スクリプトの寿命はほんの一瞬であり、すべての状態情報はデータベース内に保存されます。ほとんどすべての関数はデータベースを操作するだけですが、その目的は何ですか? 関数を呼び出すだけでオブジェクトをインスタンス化しても意味がありませんか?

プロセスの寿命はほんの一瞬です。コードベースの寿命は、月、年、数十年で測定されます。それが人々がそれを維持する期間であり、それが最初に OOP を使用する理由です。

グローバル変数は、クラス メンバーと同様に状態を保持できます。人々は、"オブジェクト指向" という用語が登場するずっと前から、状態を維持してきました。オブジェクト指向の利点は、コードのソース コード レベル モデルの複雑さを管理できることです。

于 2013-06-01T19:26:25.870 に答える
0

1)追加の db ドライバーで簡単に置き換えたり拡張したりできるため、オブジェクトに固執します (たとえば、特別なゲッターのために透過的に MongoDB にリダイレクトする関数を上書きすることができます)。 、またはさらに良いことに、レジストリ パターン。

2) PHP の寿命はそれほど短くありません。MVC パターンを使用して、ブートストラップ、ルーティング、モデル、ビジネス ロジック、および出力を処理します。そのため、1 つのリクエストに数秒しかかからない場合でも、数百のクラスと数千のメソッドが関与する可能性があります。

あなたの RPG の例に固執する: ある日、あなたはそれをマルチプレイヤーにすることに決めるかもしれません。これで、2 番目のプレーヤー オブジェクトをインスタンス化するか、約 500 の関数を適応させることができます。前者はクラスでのみ可能です。

大きな理由は人間の限界です。特にチームで作業する場合、何千もの関数の意味を念頭に置いておくことはまずありません。オブジェクトを使用することで、スリムな API を定義できます。プレーヤー オブジェクトにパブリック メソッド add_item(\item $item) と remove_item(\item $item) がある場合、これらすべてのチェック、計算、データベース処理関数を念頭に置く必要はありません。仲間の開発者に「attack() メソッドだけで \monster アイテムを作成する」ように依頼することもできます。以上で、完了です。協力は最高の状態で機能しました。

結論Java のバックグラウンドを持ち、OOP を理解している場合は、その習慣を捨てることをためらわないでください。PHP は、scriptkiddies が使用するオブジェクト指向以前のスクリプトではありません。これは本格的な OO 環境ですが、これを活用するかどうかはあなた次第です。

于 2013-06-01T19:00:00.973 に答える