2

Backbone を使用して、再利用可能なコンポーネントを作成しています。モデルとビューの間のバインディングをセットアップするためにコントローラーを作成します。モデルとビューを独自の実装に置き換える機能を人々に提供したいと考えています。

大部分の人は私たちが提供するコンポーネントを使用するので、開発者にデフォルトと変わらないものを構成または作成するよう強制したくありません。

これは、誰かがモデルまたはビューとして使用したいオブジェクトのインスタンスをコントローラーに渡すことができる必要があることを意味し、すべてが構成され、セットアップされ、準備ができています。または、コントローラーが使用するものに構成を渡すことができます。デフォルト。

最善のアプローチが何であるかはわかりません。

// Idea #1
var controller = new Controller({
    dependencyA: {
         conf: { // config for depedencyA }
    },
    dependencyB: {
         conf: { // config for dependencyB }
         class: custom.implement.Class
    }
});

このアプローチでは、ユーザーはオブジェクトをインスタンス化する方法を制御できません。これの悪い点は、たとえば、バックボーン モデルはコンストラクターで 2 つの引数を取るのに対し、ビューは 1 つしかとらないことです。

// Idea #2
var controller = new Controller({
    dependencyA: {
        args: ['arg1',{
            opt1: 'opt-value',
        }]
    },
    dependencyB: {
        args: ['a','b','c']
        class: custom.implement.Class
    }
});

Args は、コンストラクターに渡される引数になります。これは、コントローラーが args 配列を使用してコンストラクターを呼び出すことを意味します。これは、デフォルトの依存関係のカスタム構成を渡す場合にのみ、本当にメリットがあります。独自の実装を渡したい場合は、もっと面倒です。

// Idea #3  
var controller = new Controller({
    dependencyA: new outOfBoxModel({ // configuration }),
    dependencyB: new custom.imeplement.Class('a','b','c')
});

このアプローチでは、ユーザーはすぐに使えるモデルをインスタンス化する必要があります。ただし、モデルのデフォルト設定がすべて適切である場合、ユーザーは不要な作業を行っています。彼らがしなければならないことは、独自のカスタム実装のインスタンスを作成することだけです。

ここで最善のアプローチが何であるかわかりませんか?

4

1 に答える 1

2

3 つのアプローチのうち、私はアプローチ番号 3 を最も好みます。理由は次のとおりです。

  1. 他のアプローチより一貫性があります。3 番目のアプローチでは、ユーザーは構築された依存関係のインスタンスをコントローラーに渡す方法を学ぶだけで済みます。他のアプローチでは、ユーザーは args を渡すか、args とクラス名を渡す必要があります。
  2. 単一責任の原則に違反していません。最初の 2 つのアプローチでは、コントローラーがその依存関係の構築と構成を担当します。これは、依存性注入のようにはまったく感じられません! 依存関係の構築をユーザーまたはアプリケーションの別の部分に任せる方が、より適切で簡単だと思います。私の意見では、ユーザーに独自の実装を構築するように強制することはひどいことではありません。Controllers依存関係のコンストラクター API を定義して維持することを強制し、ユーザーに強制するのではなく、好きなようにコンストラクターを自由に定義できるようにします。それらに準拠すること。

別のアイデア:

アプリケーションにこの自由がある場合は、Controller構築ロジックをファクトリ クラスまたはメソッドに配置することを検討します。

var createController = function(config) {
  // Parse, validate, extract relevant config items
  // var a = create dependency a
  // var b = create dependency b
  return new Controller(a, b);
}

このアプローチにより、定義を好きなだけ空想することができますconfig-元の投稿で提供した3つの構成定義すべてをサポートできます-ただし、お勧めしません:-)。少なくとも、引数なしの呼び出し (この場合は のデフォルトの構造を返すController) と、好みの構成定義の 1 つをサポートするファクトリ メソッドを用意します。

于 2013-06-09T17:32:39.993 に答える