ホームページ >バックエンド開発 >PHPチュートリアル >php でのオブジェクト指向開発についてのディスカッション

php でのオブジェクト指向開発についてのディスカッション

WBOY
WBOYオリジナル
2016-06-23 14:14:45859ブラウズ

最近、以前に作成したクラスを改訂する必要があります。基本的に、各クラスのサイズは数百 K です。オブジェクト指向とはまったく言えません。疑似オブジェクト。以前に作成した User クラスを例として、いくつかの疑問がある部分について説明します。
1. データベースをクエリするには、User の $db 変数を使用する必要があります。$db は db クラスを通じてインスタンス化されます。では、$db は User クラスの __construct() で実行する必要がありますか?この利点は、User クラスの他のメソッドが $db 変数を直接使用できることです。欠点は、$db 変数だけでなく、User クラスの他のメソッドが $db 変数をまったく使用する必要がないことです。しかし、一部のキャッシュ オブジェクトや Web サービス オブジェクトでもこの状況が発生する可能性があります。つまり、メソッドの使用時にオブジェクトをインスタンス化する必要があるのか​​、それとも __construct() でインスタンス化する必要があるのか​​ということです。それとも、この状況に対処するための設計パターンはあるのでしょうか?
2. クラス分類の問題。 User クラスでは、アイテムの追加、アイテムの削除、ユーザーのアイテムのリストの表示を行うことができます。アイテムだけでなく、ポイントやお金なども含まれます。これらのほとんどはリストの追加、削除、表示です。ユーザーに配置されました。クラスには問題がないようです。すべてユーザーに関連しています。しかし、User クラスは単にメソッドのコレクション (特にリストを表示するためのメソッド) であると常々感じています。たとえば、ポイントを例に挙げると、User クラスを継承する UserScoreMgr クラスがあります。 、そしてポイントを使用します すべての操作をこのクラスに入れた方が良いでしょうか?それとも、この問題に対処するための設計パターンはあるのでしょうか?


ディスカッションへの返信 (解決策)

1. 私は常に DB クラスのシングルトン モードを使用し、静的メソッド getInstance() を呼び出してオブジェクトを取得しており、プログラムに必要なすべてのクラスをインスタンス化することに慣れています。 __construct() で。どこにインスタンス化するかについては、特に問題はないと思います(メモリ使用量に多少の影響はあるかもしれません) __construct() で統一処理することで管理が楽になります。
2. 次のように分割できます:
アイテムの追加、アイテムの削除、ユーザーアイテムリストの表示
ポイントの増加、ポイントの減少、ポイントの表示
お金の増加、お金の減少、残高の表示
これらはすべて独立したクラスとして書くことができます。それら自体は互いに影響を与えません。 User を継承する必要はありません。混乱を招くと思われる場合は、これらのクラスを指定して統一されたインターフェイスを実装します。
User クラスのジョブは、呼び出し、つまりこれらのクラスにいくつかのパラメーターを渡すことのみを担当します

これには厳密な制限はありません。ビジネス ロジックが多い場合は、階層化する必要があります。データ、データ ロジック、ビジネス ロジックの間には複数の層があります。
厳密に言えば、ユーザーはエンティティであり、ユーザー情報を保存し、ユーザー関連のビジネス ロジックを作成します。
ユーザーに関連する補助ポイント、アイテム、お金などは主にビジネスロジックに焦点を当てています。
もちろん完璧な設計方法はありません。最良の設計方法が最善です。
PHP のオブジェクト指向のアプローチ、「あえて使用する人は多くないと思います」、とても大胆ですね。あはは、もちろんすべては混合の祝福です

シングルトン モードやファクトリー モードについては何も知りません。基礎となる開発モードを使用したい場合は、配列のようなものであることだけを知っています。関数と文字列関数 そのようなものは使用せず、オリジナルの PHP イテレータを使用してください。

<リファクタリング> を読んでみましょう。もちろん、デザイン パターンや OO 設計に関する他の本も入手できます

実際、php のパターン構造は JSP に似ています。 JSP フレームワークをよく理解している場合。実際、原理は同じです。

PHP はクラスをパラメータとして渡すことができますか?

シングルトン モードやファクトリー モードについては何も知りません。知っているのは、これが PHP の基礎となる実装モードであることだけです。基礎となる開発モードを使用したい場合は、配列関数や文字列関数などを使用しないでください。など、オリジナルのphpイテレータを直接使用します。
今リファクタリングを検討するには遅すぎます。提起された問題を解決する必要があります。

ご質問はリファクタリングについてです
リファクタリングとは、ソフトウェアの既存の機能を変更することなく、プログラムのコードを調整して、プログラムの設計モデルとアーキテクチャをより合理的なものにすることで、ソフトウェアの品質とパフォーマンスを向上させることです。ソフトウェアの拡張性と保守性。

UserScoreMgr クラスのように、既存のクラスを分割して単一のオブジェクトを形成します
以下の点に注意してください: 継承のレベルが多すぎてはならず、通常は 2 レベル以下が適切です

実際、今読んでも遅くなくても、その精神を理解するには 1 ~ 2 晩しかかかりません
この本には多くの具体的な解決策が記載されているので、必要な章にジャンプして詳細を読むことができます。
再構成された具体的な方法は、あなたの既存のコード、あなたの要件の詳細、あなたの個人的な好みや習慣を含むあなたのソフトウェアアーキテクチャに関連しています
したがって、他の人はあなたの投稿に書かれた内容だけを見ることはないと思います。状況、具体的な解決策がどれだけあるのか
まだ自分でやる必要があります


3 階の xjl756425616 からの返信を引用します:
シングルトン モードかファクトリー モードかはわかりません。基礎となる実装モードです。基礎となる開発を使用する場合は、配列関数や文字列関数などを使用せず、オリジナルの PHP イテレータを使用してください。

今リファクタリングするには遅すぎます。提起された問題の解決策が必要です。

コードが保守しやすく明確である限り、問題はありません。oop を本格的に使用する必要はありません

実際、私は oop とデザインパターンに関する本を読んできましたが、巨人の肩の上で、私があなたの側に立つことができればいいのですが、結局は自分でやるしかありません。何かをする前に英雄たちの意見を聞くのは常に良いことです。

実際、今読んでも遅くなくても、その精神を理解するには 1 ~ 2 晩しかかかりません

この本には多くの具体的な解決策が記載されているので、必要な章にジャンプして詳細を読むことができます。
再構成された具体的な方法は、あなたの既存のコード、あなたの要件の詳細、あなたの個人的な好みや習慣を含むあなたのソフトウェアアーキテクチャに関連しています
したがって、他の人はあなたの投稿に書かれた内容だけを見ることはないと思います。状況、具体的な解決策はいくつありますか?
やはり自分でやる必要があります
PHP はオブジェクト指向です、それは面白くありませんか? Java をプレイする人は漂流します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。