7

私はGUI拡張機能をフォローしてきましたが、例ではアンダースコアなしで_isEnabledまたはisEnabledのいずれかが使用されていることに注意してください。どちらも、既存の機能を拡張するか、場合によっては置き換えるように機能しているようです。

有効になっています

たとえば、PowerTools基本クラス(既存の機能を「拡張」していないようです)には次のものがあります。

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline)
{
    var p = this.properties;

    if (!p.initialized)
    {
        this.initialize();
    }

    if (!this.isToolConfigured())
    {
        return false;
    }

    if (this.isValidSelection)
    {
        return this.isValidSelection(selection, pipeline);
    }

    return true;
};

ツールはこの基本クラスを使用して、.isValidSelectionを宣言できます。次に例を示します。

PowerTools.Commands.CountItems.prototype.isValidSelection = 
                                       function (selection) { ... }

_有効になっています

Anguillaが._isEnabled既存の機能を使用しているのがわかります(Chromeのコンソールのコード内のさまざまな場所にあります)。たとえば、次のようにWhereUsedなります。

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable =
                      function WhereUsed$_isAvailable(selection) ...

プライベート機能?

私は、前のアンダースコアがプライベート変数の命名規則であることをよく知っています。アンダースコアで始まる_isEnabledおよびその他の関数は「プライベート」ですか?もしそうなら、

  • これらの関数をどのように拡張(既存のコードに追加機能を追加)する必要がありますか?
  • これらをどのように置き換える必要がありますか(既存のコードは実行されませんが、代わりに「オーバーライド」のように実行されます)。

同じアプローチが、、、などのアンダースコアで始まる他の関数にも当てはまると思い_isAvailableます_invoke

4

1 に答える 1

8

コマンドに対して次のメソッドが呼び出されます。

  1. 利用可能です
  2. 有効になっています
  3. 呼び出す

すべてのコマンドの基本クラスである Tridion.Core.Command には、これらのメソッドの標準実装があります。ほとんどの場合、このデフォルトの実装により、コマンドの拡張が可能になります。また、アンダースコア メソッド (_isAvailable、_isEnabled、および _execute) も呼び出します。

CME コマンドがアンダースコア メソッドのみを上書きする理由がわかりません。たぶん、誰かがその方が簡単だと思ったのでしょう。それらはプライベート(またはC#で「保護」に相当する)と見なされる必要があるため、実際には悪い習慣のように思えます。

適切なメソッド (isAvailable、isEnabled、および invoke) を実装してから、this.callBase を使用して基本実装を呼び出す方がクリーンです。ただし、この場合、パイプラインを停止するか、アンダースコア メソッドを上書きして、戻り値がデフォルトのアンダースコア メソッドによって上書きされないようにする必要がある場合があります。実装または拡張するコマンドによって異なります。

要するに、アンダースコア メソッドを使用することはおそらく悪い習慣ですが、Core の実装では、「正しく」実行することが難しくなっているようです。したがって、アンダースコアの方法を避けることを目指していますが、そうするのが難しすぎることが判明した場合でも、汗をかく必要はありません。

PS isValidSelection は、すべてのコマンドに必要な共通ロジックを各コマンドに固有のロジックから分離する、PowerTools 専用のメソッドです。

于 2012-08-13T16:29:25.633 に答える