Coldfusion: Ist es sicher, die Variablen Schlüsselwort in einem CFC auszulassen?

StackOverflow https://stackoverflow.com/questions/59390

  •  09-06-2019
  •  | 
  •  

Frage

In einer Coldfusion-Komponente (CFC), ist es notwendig, für Variablen-scoped Variablen vollständig qualifizierte Namen zu verwenden?

Werde ich mich in Schwierigkeiten bringen, wenn ich das ändern:

<cfcomponent>
    <cfset variables.foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>
</cfcomponent>

das?

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>
</cfcomponent>
War es hilfreich?

Lösung

Es spielt keine Rolle „Variablen“ angeben, wenn Sie die Variable zu erstellen, weil foo standardmäßig in dem Variablen Umfang platziert werden; aber es wird wichtig, wenn Sie die Variable zugreifen.

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name="doSomething">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>

    <cffunction name="doAnotherThing">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>

</cfcomponent>

doSomething ( "args") gibt "Ich habe args und Funktion lokale Variable "

doAnotherThing ( "args") gibt "Ich habe eine private Instanz einer Variablen und Funktion lokalen Variable ."

Andere Tipps

Ich werde sagen Ja. Ist es ausdrücklich notwendig? Nee. Können Sie mit nicht tun es weg? Sicher. Fragen Sie Probleme? Absolut. Wenn Sie das folgende in einem cffunction haben:

<cfset foo = "bar" />

Das wird nicht setzt diese Variable in der Funktion lokaler var Umfang, wird es in dem globalen Variablen Umfang des CFC platzieren, was bedeutet, dass es zu jeder Methode der CFC zur Verfügung steht. Es gibt Zeiten, wenn Sie möchten, dies zu tun, aber die meiste Zeit würden Sie für eine Race-Bedingung fragen.

Wenn eine Variable vom Server gelesen wird, wenn diese Variable nicht explizit als Teil eines Gültigkeitsbereiches deklariert ist (REQUEST., SESSION., Etc.), dann wird Coldfusion laufen Scopecheck (), um festzustellen, welche Tragweite der Variable in . dies ist nicht nur Platzierung unnötige Overhead auf dem Anwendungsserver, sondern auch die Möglichkeit, für Hijacking einführt, wodurch Ihre Variable in einem Umfang, aber Scopecheck () eine Variable mit dem gleichen Namen höher in der Rangfolge.

Immer, immer, immer, Umfang aller Variablen. Egal, wie trivial. Auch Dinge wie Abfragenamen und Looping-Indizes. Sparen Sie sich, und diejenigen, die hinter dir kommen, von den Schmerzen.

Vor allem in FCKW, richtiger Scoping ist wichtig. Das Extra ‚Ausführlichkeit‘ ist die Klarheit wert. Variablen aus ihrem indended Aktivitätsspektrum, verursacht schwere Probleme rutschen und sehr schwer zu diagnostizieren.

Ausführlichkeit ist nicht immer eine schlechte Sache. Wir nennen unsere Funktionen und Methoden in beschreibender Art und Weise wie getAuthenticatedUser () statt gau (). Datenbank Spalten und Tabellen werden am besten beschreibende links wie EmployeePayroll statt empprl. So kurz und bündig sein ‚leichter‘ könnte sein, wenn Ihr Kurzzeitgedächtnis ist voll von den Einzelheiten des Projektes, sondern beschreibend zu sein zeigt Ihre Absicht und ist hilfreich, während die Wartungsphase einer Anwendung, lange nach dem Kurzzeitgedächtnis hat mit anderen Sachen gefüllt .

Die kurze Antwort auf Ihre Frage ist, dass nein, werden Sie wahrscheinlich nicht in Schwierigkeiten versuchen, das zu tun. Außerhalb des Kontextes eines UDF (auch noch in einem CFC), eine un-scoped gesetzt Aussage impliziert den Variablen Umfang.

Darüber hinaus in einem CFC ist der Variablen Umfang zu allen Funktionen zur Verfügung; es ist eine Art globalen Bereichs innerhalb dieser CFC -. ähnlich den „dieses“ Umfang, außer Variablen Umfang auf „privates“ Variablen verwendet ist, während die dieser Bereich der öffentlichen Variablen verwendet ist

Um dies zu testen, erstellen test.cfc:

<cfcomponent>
    <cfset foo = "bar" />
    <cffunction name="dumpit" output="true">
        <cfdump var="#variables#" label="cfc variables scope">
        <cfdump var="#this#" label="cfc this scope">
    </cffunction>
</cfcomponent>

und eine Seite zu testen, test.cfm:

<cfset createObject("component", "test").dumpit() />

Und die Ergebnisse werden:


Nun Adresse ein anderes Problem, das ich in Ihrem Beispiel-Code zu sehen ...

In CF alle User Defined Functions haben einen besonderen un-named Umfang allgemein als "var" scope bezeichnet. Wenn Sie die folgenden in einem UDF tun:

<cfset foo = "bar" />

Dann CF Sie sagen, dass die Variable in die var Rahmen zu setzen.

Um die Dinge ein wenig Verbindung, können Sie Probleme (Variablenwerte zu ändern, wenn man sie nicht erwartet wurden), wenn Sie sind nicht mit dem var Umfang in Ihr Inline-UDFs.

So ist die Faustregel, immer, immer, immer, immer var-scope Ihre Funktion interner Variablen (einschließlich Abfrage-Namen). Es gibt ein Tool namens varScoper , die Sie bei der Suche nach Variablen unterstützen, die var-scoped sein müssen. Letzt Ich habe es nicht perfekt war, aber es ist auf jeden Fall ein Anfang.

Es ist jedoch ein schlecht Idee (Anzeige / Nutzung) Variablen ohne Rahmen (natürlich mit Ausnahme var-scoped Variablen, wie Sie den Umfang festlegen können von lesen) verweist in FCKW oder sogar auf Ihren Standard-CFM-Seiten. Ab CF7 gab es 9 Bereiche, die in einer bestimmten Reihenfolge geprüft wurden, wenn Sie eine Variable lesen, ohne den Umfang Angabe gewinnt erstes Spiel. Mit CF8, könnte es in dieser Liste mehr Bereiche sein, habe ich nicht überprüft. Wenn Sie das tun, laufen Sie Gefahr, einen Wert von einem Umfang bekommen, wenn Sie es von einem anderen erwarten; das ist ein Alptraum zu debuggen ist ... Ich versichere Ihnen. ;)

Also kurz gesagt: Implizieren ein Variable Umfang (am Set) ist keine schreckliche Idee (obwohl ich angeben es in der Regel sowieso); aber Inferenzabschnitts Variable Umfang (auf Lese) für Ärger bittet.

Scoping nicht explizit in den Variablen Umfang arbeiten kann, aber es ist keine gute Idee, und ehrlich gesagt der einzige Grund, nicht ist IMO aus Faulheit. Wenn Sie explizit Umfang alles 1) Sie vermeiden mögliche Probleme und 2) es macht den Code leichter zu lesen, weil es keine Frage ist, welche Tragweite der Dinge sind in.

Für mich ist es nicht machen Sie den Code ein ausführlicher (und schon gar nicht unnötig ausführlich) - es ist eigentlich leichter zu lesen, vermeidet Verwirrung und vermeidet seltsame Nebenwirkungen, die auftauchen können, wenn Sie nicht explizit Umfang tun <. / p>

Die einfache Antwort auf Ihre Frage ist: „Nein, es ist nicht notwendig,“

Aber ich denke, Best Practices würde vorschlagen, dass Sie in der Tat, das Variablen indentifier verwenden, wenn diese Variablen zugreifen. Meiner Meinung nach alle, die in Zukunft auf Ihrem Code kommen, und ist in der Mitte einer Funktion suchen, werden sofort das Scoping der Variablen kennen, ohne dass die Spitze der Funktion der lokalen Funktionen zu scannen.

In der Tat, füge ich eine wenig mehr Ausführlichkeit zu meinem CFC UDF durch eine lokale Struktur zu erstellen:

Dann habe ich meine alle lokalen Vars in dieser Struktur und verweisen sie auf diese Weise so meinen Code so etwas wie folgt aussehen:

Nachdem Sie Ihre Antworten hier zu lesen ist, was ich denke:

Ja, es ist sicher. In der Regel ist es nicht notwendig oder nützlich, um explizit den Variablen Bereich angeben. Es kommt noch hinzu, Unordnung zu einer bereits ausführlichen Sprache.

Zugegeben, es ist eine kleinere Ausnahme, wie Soldarnal wies darauf hin, wo ein Variablen-scoped Qualifying Variable erforderlich. Das ist, wenn Sie eine Funktion lokale Variable mit dem gleichen Namen haben. (Aber Sie sollten wahrscheinlich nicht tun sowieso.)

Best Practices beiseite, ich glaube, es ist auch davon abhängen könnte, wie Ihr Ihr FCKWs zugreifen werde ich habe keine Probleme hatte sie aus verlassen, wenn Objekte zu schaffen und sie von Coldfusion zugreifen. Aber ich denke, es ist erforderlich beim Zugriff auf und / oder die Abbildung sie aus der Ferne über Actionscript in Flex / Flash.

Hier ist ein sehr guter CFC Umfang Bezug von Raymond Camden. Ich persönlich lieber ein ‚Selbst‘ Hash machen alle Verwirrung zu vermeiden (bemerke ich nicht verwenden, um den ‚Variablen‘ Umfang in den Funktionen):

<cfcomponent>
  <cfset variables.self = structNew()>
  <cfscript>
    structInsert(variables.self, <key>, <value>);
    ...
  </cfscript>

  <cffunction name="foo">
    self.<key> = <value>
    <cfreturn self.<key> />
  </cffunction>

  ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top