0

数週間前に作成したかなり複雑なスクリプトを書き直しています。数人にそれを見せた後、全員が、特定の目的と堅固なオブジェクト指向プログラミングの原則を持つ小さなピース (クラス) に分割する必要があることに同意しました。

独学のプログラマーとして、これらの概念は私にとってかなり新しいものであり、ある関数/クラスから別の関数/クラスにデータを転送する最良の方法について少し混乱しています。たとえば、これは私が構築しているものの単純化された構造です。

ここに画像の説明を入力

私の質問は:

これらすべての関数/クラスを呼び出し、必要に応じてデータを渡す「コントローラー」スクリプトが必要ですか? これは、上の図の を配置する場所ですが、その一部を呼び出すことができるfor loopのと同じように機能しますか?Function 1Function 2

4

1 に答える 1

1

コントローラー/サービス スクリプトがなければ、実際には単一責任の原則を満たすことはできません。これは、私があなただったら実装する高レベルの設計です。

FileRepository
ファイルを取得するメソッドを公開する必要があります。名前をGetFileByIdにしましょう。

CRUD 操作のMongoDBRepositoryメソッド。SelectById 、SelectByQueryUpdateCreateDeleteなど

オブジェクト作成ロジックcreateNewObj
ロジックが単純な 場合は、コードが次のようになるようにオブジェクト コンストラクターに移動するだけで十分 です。工房。次に、次のようになります。var newObj = new MyObj(json[i]);var newObj = MyObjFactory.Create(json[i]);

サービス/コントローラー
最後に、コントローラー/サービス オブジェクトを実装する必要があります。リポジトリと上記の他のオブジェクトとの間のすべての対話を処理するメソッドDoWorkを持つWorkServiceという名前にしましょう。おおよその DoWork は次のようになります。

function DoWork(fileId){
  var json = fileRepository.SelectById(fileId);
  for(var i=0;i<json.length;i++){
     var newObj = new MyObj(json[i]);  // or calling factory method
     var dbRecord = MongoDBRepository.SelectByQuery(newObj.name, newObj.date);
     if(dbRecord){
       MongoDBRepository.Update(newObj);
     }
     else{
       MongoDBRepository.Create(newObj);
     }
  }
}

これは単なる JavaScript 構文の疑似コードであることに注意してください。実際のコードはまったく異なるように見えるかもしれませんが、どのようなデザインが必要かという感覚を与えてくれます。また、明示的にDoWorkメソッド内にリポジトリオブジェクトを作成していません。それらを注入する方法を考えて、依存関係の逆転の原則を満たします。

それが役に立てば幸い!

于 2013-06-13T09:22:39.513 に答える