0

私はOOPで比較的新しいです。

クラス、メソッドなどは理解していますが、哲学に問題があります。

現在、プロジェクト管理、クラス、メソッド、変数、ユーザー、グループ、ログ、およびタスク管理を使用して、プロジェクトを管理するプロジェクトに取り組んでいます。

だから、Projectクラスから始めて、私はそれを持っています:

public function create_project()
public function get_projects()
public function delete_project()

次に、ProjectClassクラス:

public class create_class()
public class get_classes()
public class delete_class()

しかし、それは正しい方法ではないと思ったので、次のように変更しました。

Projectクラスメソッド:

set_name、get_name (および同様のメソッド) add_class get_classes add_log get_logs

ProjectClassクラスメソッド:

set_project_id (および get) add_variables (および get) add_method ...

したがって、最初のケースでは、Project新しいプロジェクトを作成するクラス、ProjectClassクラスを作成するMethodクラス、およびメソッドを作成するクラスであり、2 番目のケースでは、そのProjectクラスを作成および管理するクラスであり、作成するProjectClassクラスです。そのメソッドを管理します。

それで、これらの「スタイル」は正しいですか?

2 番目のケースが正しい場合、誰がプロジェクトを作成しますか? 自体?

どうもありがとう

4

1 に答える 1

0

一般に、割り当てる明確な責任がない場合、設計が他の設計よりも優れているかどうかを判断するのは非常に困難です (これは、getter と setter 以外の動作を意味します)。時間が経つにつれて、事前の設計から反復的/増分的な設計に移行し、一度に 1 つの問題に取り組み、必要に応じて設計をリファクタリングしました。この場合、私はあなたのシステムの基本的な要件を規定し、それぞれについて設計と実装のサイクルを開始し、新しい要件に取り組みながらモデルを再構築しようとします。

ほんの一例として、次の質問を考えてみましょう: プロジェクトにバインドされていないクラスを持つことは理にかなっていますか? 答えが「いいえProject>>createClass(aClassName)」の場合は、クラスがプロジェクトのコンテキストで作成されることを明示的に述べているため、のようなメソッドを用意することをお勧めします。また、メソッドの実装内で、クラスとそれが属するプロジェクトとの間に適切な接続を作成できます。ただし、コンストラクターを定義することも有効なアプローチです。ProjectClassプロジェクトをパラメーターとして受け取るクラス。そのようにして、「新しいクラスを作成したい場合は、それが属するプロジェクトを提供する必要があります」と言っています。どちらのアプローチを使用するかは多くのことに依存し、そのうちの 1 つはプログラマーの好みです :)、そのため、特定のコンテキストを評価することなく、一方が他方よりも優れているかどうかを述べるのは非常に困難です。

最後に、役立つ場合は、言及する価値のあることがいくつかあります。

  • それがインスタンス メソッドであると仮定するとpublic function create_project()、なぜ のインスタンスはProject他のプロジェクトを作成する方法を知っているのでしょうか? これは基本的にクラス側の責任であるため、最初はあまり意味がありません。これに対する特定の動機がない限り (たとえば、Prototypeパターンなど)。
  • プロジェクトが に対応するのはなぜget_projects()ですか? それらは何らかの形で関連していますか?それとも、すべてのプロジェクトをリストするだけですか? 繰り返しになりますが、これはクラス側の責任のように聞こえます。
  • 私は通常、メッセージの受信者がメッセージの一部として表す概念を追加するのは好きではありません。そのため、私はメッセージを とは呼びません。これは説明するのdelete_project()が冗長であるためです$project->delete_project()(メッセージの受信者がプロジェクトであることは既にわかっています)。
  • クラス名と一致している必要があります。ProjectClassクラスを表すために使用する場合はProjectMethod、メソッドを表すために使用する必要があります (個人的にはこれらの名前は好きではありませんが、誤解を招く可能性があります)。適切な名前を選択し、ドメイン モデルで一貫性を保つことは非常に重要です。

HTH

于 2013-02-07T12:18:56.520 に答える