2012-08-13 9 views
7

Ich habe verfolgt, GUI-Erweiterungen und bemerken Beispiele verwenden entweder _isEnabled oder isEnabled, ohne den Unterstrich. Beide scheinen zu arbeiten, um bestehende Funktionalität zu erweitern oder möglicherweise zu ersetzen.Was ist der Unterschied zwischen _isEnabled und isEnabled in Anguilla?

isEnabled

Zum Beispiel kann die Powerbasisklasse (die nicht vorhandene Funktionalität zu „erweitern“ scheint) hat:

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; 
}; 

Ein Werkzeug, um diese Basisklasse verwenden kann und erklären. isValidSelection, zum Beispiel:

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

_isEnabled

Ich sehe Anguilla verwendet ._isEnabled für vorhandene Funktionalität (in Chrome-Konsole an zahlreichen Stellen im Code). Zum Beispiel WhereUsed hat:

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

Privat Funktionen?

Ich bin vertraut mit einem vorangehenden Unterstrich eine Benennungskonvention für private Variablen. Sind _isEnabled und andere Funktionen, die mit einem Unterstrich beginnen, "privat"? Wenn ja, dann

  • Wie soll wir erweitern (fügen Sie zusätzliche Funktionalität zu vorhandenen Code) diese Funktionen?
  • Wie sollten wir ersetzen (nicht vorhandenen Code ausführen, aber haben unsere statt wie in einem "override") diese?

mir den gleichen Ansatz unter der Annahme gilt auch für andere Funktionen, die mit einem Unterstrich wie _isAvailable und _invoke starten.

  1. isAvailable
  2. isEnabled
für alle Befehle

Die Basisklasse aufrufen - Tridion.Core.Command - hat einen Standard:

Antwort

8

Die folgenden Verfahren werden für einen Befehl aufgerufen Implementierung dieser Methoden. Diese Standardimplementierung ermöglicht in den meisten Fällen Erweiterungen von Befehlen. Sie rufen auch die Unterstrichmethoden auf (_isAvailable, _isEnabled und _execute).

Ich weiß nicht, warum die CME-Befehle nur die Unterstreichung Methoden überschreiben. Vielleicht dachte jemand, es wäre einfacher. Sie sollten als privat betrachtet werden (oder das Äquivalent von "geschützt" in C#), so dass es für mich tatsächlich eine schlechte Übung ist.

Es wäre sauberer, die richtigen Methoden zu implementieren (isAvailable, isEnabled und invoke) und dann die Basisimplementierung mit this.callBase aufzurufen. Möglicherweise müssen Sie in diesem Fall jedoch die Pipeline anhalten oder die Unterstrichmethoden überschreiben, um zu vermeiden, dass der Rückgabewert von den Standard-Unterstrichmethoden überschrieben wird. Es hängt von dem Befehl ab, den Sie implementieren oder erweitern.

Kurz gesagt: die Verwendung der Unterstrich-Methoden ist wahrscheinlich eine schlechte Methode, aber die Core-Implementierung scheint es schwieriger zu machen, es "richtig" zu machen. Also würde ich versuchen, die Unterstreichungsmethoden zu vermeiden, aber nicht schwitzen, wenn es sich als zu schwierig herausstellt.

P.S. isValidSelection ist eine PowerTools-only-Methode, die die gemeinsame Logik, die sie alle benötigen, von der für jeden Befehl spezifischen Logik trennt.

+0

Guter Punkt auf PowerTools 'isValidSelection. Um die Pipeline zu verwalten, setzen wir sie einfach auf "wahr/falsch"? Ich sehe 'pipeline.stop = true;' in der .js-Quelle. –

+0

pipeline.stop = wahr; bedeutet in der Tat, dass es nicht zu anderen Erweiterungen oder den Unterstreichungsmethoden weitergehen sollte. Art von "Ich weiß es am besten, hör auf andere Antworten zu suchen" –