3

データベースへのアクセスを処理するクラス (ProjectsDataAccess) を作成しました。これがクラスでできることです。

  1. Project オブジェクトを受け取り、データベースに保存します。
  2. データベースから ID でプロジェクトを取得し、それを Project オブジェクトとして返します。

これは、クラスの疑似コードです。

 class ProjectsDataAccess {

        public void addProject(Project project) {
          // get the project data from the object and save it to the database
        }

        public void getProject() {
         // get the project data from the database and return new project 
         //object with that data
        }

      }

これがプロジェクト オブジェクトです。

class Project{

   private String name;
   private int id;

   private Project(){}

   Project(int id, String name){
     this. id = id;
     this.name = name;
   }
   Project(String name){
     this. id = // generate id
     this.name = name;
  }
}

私の問題は、クラスのユーザーがこのコンストラクターを使用してオブジェクトを作成し、独自の ID を提供することをProject(int id, String name)望んでいないことですが、 ProjectsDataAccess クラスのみがそれを使用するようにして、データベースからデータを取得できるようにすることです (ID を含む)そして、コンストラクターを使用して設定します。そうするためにデザインを変更する方法はありますか?

4

2 に答える 2

1

解決策は、ProjectsDataAccessProjectクラスを同じパッケージに保持し、コンストラクターProject(int id, String name) パッケージを表示できるようにすることです (現在のように修飾子なしで)。他のコンストラクターは、クライアント コードで表示できるようにするProject(String name)必要があります。publicそしてもちろん、クライアント コードを別のパッケージに入れます。

 package foo;

 public class ProjectsDataAccess {

    public void addProject(Project project) {
      // get the project data from the object and save it to the database
    }

    public void getProject() {
     // get the project data from the database and return new project 
     //object with that data
    }

  }



package foo;

public class Project {

   private String name;
   private int id;

   private Project(){}

   Project(int id, String name){
      this. id = id;
      this.name = name;
   }

   public Project(String name){
      this. id = // generate id
      this.name = name;
   }
}
于 2012-09-02T19:58:00.413 に答える
0

ユーザーが呼び出すはずのメソッドのみを使用して、別のインターフェイスをユーザーに返すことをお勧めします。

例えば:

interface UserProjectInterface
{
   void AnyMethodUserIsSupposedToCall();
}

class Project implements ProjectUserInterface
{
   //constructor won-t be no longer visible to the client class
   public Project(){}
}

次に、インターフェースのみを返します。

class ProjectsDataAccess {

   public void addProject(ProjectUserInterfaceproject);


   public ProjectUserInterfacegetProject getProject() {
     return new Project();
   }

}

具象型をクライアント クラスに公開しないため、このパターンにはさまざまな利点があります。


編集:

ユーザーが UserProjectInterface を作成することになっている場合は、オブジェクトの作成をカプセル化するために、ファクトリ (es. AbstractFactory ) を使用できます。

interface AbstractProjectFactory
{
    UserProjectInterface CreateProject();

}

具体的なオブジェクトをインスタンス化する実装を提供します。

public AConcreteProjectFactory implements AbstractProjectFactory
{
    public UserProjectInterface CreateProject()
    {
       return new Project();
    }
}

使用例:

//client class:
AbstractProjectFactory factory = new AConcreteProjectFactory();
UserProjectInterface project = factory.CreateProject();

ProjectsDataAccess access = new ProjectsDataAccess();
access.addProject(project );
于 2012-09-02T19:59:05.183 に答える