2017-05-17 13 views
0

私のアプリケーションでは、現在、URLモデルクラスとURLQueryクラスがあります。さまざまなデザインパターンが混在していますか?

私のURLクラスには、いくつかのプロパティと、オブジェクトとそのプロパティをデータベースに保存するために注入されたデータベースクラスを使用するsaveメソッドがあります。

私のURLQueryクラスには、いくつかの条件を取り、データベースから行を戻し、それらをURLクラスからURLオブジェクトとしてインスタンス化するためのメソッドがあります。

最近では、私のコードがさまざまなデザインパターンを混ぜていると感じました。たとえば、URLモデルクラスにはデータベースクラスが注入されている必要があり、URLクラスのインスタンスを作成し、URLクロールと関連する別のクラス内の依存関係をセットアップするのは難しいと感じます。

私は、データベース依存関係を持つファクトリクラスを使用して、それを他のクラスに注入します。

  • - これはパラメータを取り込んでそこでURLクラスをインスタンス化し、それを返します。保存
  • - これは、このメイクセンスをURLオブジェクトを取得し、データベース

うにそれを保存しますか? URLQueryも意味があるのですか、別のデザインパターンを使用していませんか? 私は多くのチュートリアルなどで、モデルクラスなどで直接セーブメソッドを使用するなど、ちょっと混乱しています。

+0

@niksoftengはい、私はまだどちらかを決定しています。 – user5331188

答えて

0

私はあなたのジレンマを理解しています。デザインパターンの学習を始めるときには、常に使用する必要がある/考えなければならないと考えて、解決しようとしている問題を忘れてしまいます。問題を特定する前にデザインパターンを特定することは、問題そのものです。

あなたのシナリオは実際には単純なので、コードも単純です。 KISS

1つのモデル/エンティティURL、1つのクラスをdbから保存/読み込みするだけで済み、URLだけを必要とするクローラは必要ありません。

public class URL { 
    // only properties 
} 

// You inject this repository whenever you want to work with db 
public class URLRepository { 
    // This will talk to db 
    public URL Get(<param>) { } // fetch from db 
    public int Save(<param>) { } // save to db, and return it's ID 
    // .. and so on 
} 

public class Crawler { 
    // This is just concerned about URL objects 
    // nothing else 
} 
+0

私は、URLQueryをファクトリのように使うことについても疑問に思っています。そのため、保存してクラスに入ることができます。これは役に立ちました、ありがとう! – user5331188

0

私たちの持っているものから始めましょう。最初のURLはモデルクラスで、URLQueryはハンドラ/コントローラクラスのようです。あなたはCRUD操作を必要とするデータベースを持っています。これはコントローラークラス自体に入り、DBと言えます。

ここで機能性を分離してみましょう。それで、モデルはどこから来ているのか気にしないでください。同様に、モデルとコントローラは、dbがどのようにセットアップされているか、および/またはdbがリレーショナルであるかどうかを知る必要があります。コントローラーは論理的なフローハンドラーとだけ考えてください。 DBWrapperは、どのクラスのどのオブジェクトを保存しているのかを知る必要はなく、コントローラはXデータをY形式で保存してZテーブルに保存するように指示します。

だから、どのように私はそれがこの

class URL 
{ 
    // Variables/methods go here 

    String Serialize() 
    { 
    // This is the data that gets saved to DB. You could return Object, to hide the type 
    } 

    static URL Deserialize(String serializedURLModel) 
    { 
    Object xyz = /* extract data from serializedURLModel here*/; 
    return new URL(xyz); 
    } 
} 

あるだろうそして、コントローラクラスがコントロールを取り、周りのロジックを駆動する...

public class URLQuery 
{ 
    DB db; 
    public void createURL(URL url) 
    { 
     if(!db.HasTable(URLTable)) 
      db.createTable(URLTable); //Assume that you are creating columns and their types here. 

     db.put(URLTable, url.GetID(), url.Serialize()); 
    } 

    public void getURL(String urlID) 
    { 
     return URL.Deserialize(db.getObjectforColumn(URLTable, urlID)); 
    } 
} 

最後に、私はクラスDBWrapperを持っているでしょうインターフェイスであるDBを返します。したがって、DBWrapperクラスの外部では、コントローラはどのDBであるか、どのように実装されているのかわかりません。以下のような何か:

interface DB 
{ 
    void createTable(String Tablename, ... etc); 
    void GetObjectForColums(String tableName, String column); 
} 

public class DBWrapper 
{ 
    public static getDB() 
    { 
     return new MySQL_DB(); 
    } 

    private class MySQL_DB implements DB 
    { 
     void createTable(String Tablename, ... etc) // implement it here 
     void GetObjectForColums(String tableName, String column) //implementation 
    } 
} 

はその有用ホープ:)

関連する問題