문제

에 ColdFusion 구성 요소(CFC),은 그것을 사용하는 데 필요한 완전한 이름을 위한 변수 범위 변수가?

나는 나 자신을 얻기 위해 문제로 변경하는 경우 이:

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

이?

<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>
도움이 되었습니까?

해결책

그것이 문제가되지 않습을 지정하"변수"를 만들 때 가변기 때문에,foo 에 배치됩니다면 변수 범위 기본적으로;하지만 그것이 문제에 액세스할 때 변수입니다.

<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능 지역 변수"

doAnotherThing("인자")반환합니다"나는 개인 변수의 인스턴스능 지역 변수."

다른 팁

나의할 것이다.그것은 명시적으로 필요한가?Nope.멀리 얻을 수 있습니와 그것을 하지 않?확실합니다.을 요청하고 있습니다 문제가?물론입니다.이 있는 경우 다음과 같은 내 cffunction:

<cfset foo = "bar" />

는 것입니다하지 않는 장소에서 변수 기능 지 var 범위에,그 장소에서 CFC 의 글로벌 변수 범위를 의미는 그것이 가능한 모든 방법을 CFC.시간이 있을 때 당신은 작업을 수행 할 수 있습니다 이지만,대부분의 시간을 요구한 경쟁 상태입니다.

을 때 어떤 변수를 읽고 있는 서버는 경우는 변수하지 않은 명시적으로 선언된 부분의 범위(요청을 합니다., SESSION., 등.) 다음 ColdFusion 실행됩니다 ScopeCheck()을 결정하는 범위 변수입니다.뿐만 아니라 이를 배치 불필요한 오버헤드 애플리케이션 서버에서,그것은 또한 기능을 소개한 납치된 변수들이 하나의 범위이지만,ScopeCheck()가 발견되는 동일한 이름의 변수에서 높은 우선 순서입니다.

언제,범위의 모든 변수입니다.어떻게 하는 것입니다.심지어 같은 것들을 쿼리 이름 및 루프 인덱스입니다.자신을 저장,그리고 그는 당신의 뒤에서 고통입니다.

특히 CFCs,적절한 범위를 지정하는 중요합니다.추가'자세한 정도'가치가있다.는 변수를 미끄러짐이 자신의 indended 범위는 원인이 될 것이 심각한 문제를하는 것은 매우 어렵고 진단할 수 있습니다.

자세한 정도가 나쁜 것은 아니다.우리는 이름이 우리의 기능 및 방법을 설명하는 방식 같은 getAuthenticatedUser(),오히려 보다 gau().데이터베이스를 열와 테이블은 최고의 왼쪽 설명하는 다음과 같 EmployeePayroll 보다 empprl.따라서,되는 간결 될 수 있습'쉽게 때'당신의 짧은 기억이 전체의 프로젝트 세부사항을,하지만 설명을 보여줍 당신의 의도와 도움이 동안 유지보수 단계 응용 프로그램의 후 오랫동안 당신의 짧은 기간 메모리로 가득했다.

짧은 당신의 질문에 대한 대답은 없는지,당신은 아마 문제로 실행하려고 시도 하십니다.외부의 컨텍스트 UDF(심지어는 아직도 내부 CFC),유엔 범위 설정 문을 의미한 변수 범위가 있습니다.

또한,CFC,변수 범위를 사용할 수 있습니다 모든 기능그것은 일종의 글로벌 범위 내에 있는 CFC--비슷한"이"범위를 제외하고,범위 변수에 가깝다"private"변수는 반면,이 범위는 공공 변수입니다.

이 테스트를 위해,생성 테스트입니다.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>

고 페이지를 테스트하는 테스트입니다.cfm:

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

그 결과는:


지금 주소로 다른 문제가 나오에서 당신의 예제 코드...

에 CF,모든 사용자 정의 기능은 특별한 un-지명 범위에 일반적으로"var"범위가 있습니다.당신이 할 경우 다음과 같은 내부에는 UDF:

<cfset foo = "bar" />

그때 당신은 말하고 CF 을 넣어하는 변수로 var 범위가 있습니다.

것을 합성하는 비트를 실행할 수 있습으로 문제(변수 값을 변경하는 경우 당신이 기대하지 않은 그들을하는)경우 당신은 당신 를 사용하 var 범위에 당신의 인라인 Udf.

그래서 엄지손가락의 규칙을 항상,항상,항상 var 범위의 기능-내부 변수가(을 포함한 쿼리 names).이라고 불리는 도구를 varScoper 에서 당신을 도움이 될 것입니다 찾는 변수가 될 필요가 var 범위입니다.마지막 선택이 완벽하지 못했지만,그것은 확실히 시작합니다.

그러나,그것은 아이디어를 참조(디스플레이/사용)하지 않고 변수 범위(제외하고는 분명히 var 범위 변수를 지정할 수 없는 범위에서 읽을 수)에 CFCs 또는 당신의 표준 CFM 페이지입니다.로 CF7 가 있었 9 는 범위를 확인 특정 순서대로 읽을 때 변수를 지정하지 않고 범위의 첫 경기를 승리합니다.와 CF8,더 될 수 있습 범위 목록에 없 확인합니다.이렇게 할 때,당신은 위험에서 값을 가져오는 하나의 범위에 있을 때 기대에서 다른;는 악몽 디...나는 확신합니다.;)

그래서 짧은: 암시 변수의 범위(설정)지 않은 끔찍한 아이디어(내가 일반적으로 지정한 어쨌든 그것);지 유추 변수의 범위(읽기)이라고 생각하고 있었습니다.

적인 범위 지정에서 변수 범위를 작동할 수 있지만,그것은 좋은 아이디어를,그리고 솔직히 이 하의 게으름 IMO.는 경우 명시적으로 범위 모두 1)을 방지할 잠재적인 문제,그리고 2)이 코드는 쉽게 읽을 수 없기 때문에 질문하는 범위를 찾을 수 있습니다.

나에게 그것을 만들지 않는 코드를 더욱 자세한 정보(확실하게 불필요하게 자세한 정보)-그것은 실제로 편리하게 읽고 혼동을 피할 수 없는 이상한 부작용할 수 있는 자를 하지 않는 경우 명시적으로 범위가 있습니다.

간단한 질문에 대한 답입니다:"아니,그것은 필요가 없다"

그러나 내가 생각하는 최고의 관행할 것을 제안하고,사실,를 사용하여 변수 indentifier 에 액세스할 때 사람들 변수입니다.내 생각에 오는 사람을 따라 당신의 코드를 미래에,보고는 중간에서의 함수,즉시 알고 범위의 변하지 않고도 검사는 최고의 기능은 로컬능합니다.

사실,좀 더 추가 자세한 정도를 나 CFC Udf 에 의해 하나를 만드는 로컬 구조체:

<cfset var="" local="structNew()" />

그 후 나는 모든 나의 지역 변수는 구조체를 참조하는 방법도록 내 코드는 아래와 같습니다:

<cfset local.foo="variables.bar" +="" 10="" />

후 읽기 당신의 답변을 여기에 내가 무슨 생각:

네,그것은 안전합니다.에서 일반적으로,그것은 필요 없거나 유용하지 않을 명시적으로 변수를 지정합니다.그냥 깔끔하는 이미 자세한 언어입니다.

여,거기에 하나의 사소한 예외로 Soldarnal 지적한 곳 자격 변수 범위 변수가 필요합니다.는 경우 기능 지역 변수로 동일한 이름입니다.(하지만 당신은 아마 하지 말아야 할 것입니다.)

모범 사례를 따로,나는 그것을 믿을 수 있도에 따라 달라집하는 방법에 액세스하려고 당신의 cfc 의 없었어요 어떤 문제를 떠나 그 개체를 만들 때 액세스하에서 그들을 coldfusion.그러나 나는 생각은 그것이 필요할 수도 있습니다면 액세스 및/또는 그들을 매핑을 통해 원격으로 actionscript 에 flex/flash.

여기에 매우 좋 CFC 범위 참조 부터 레이몬드 Camden.개인적으로 선호하는'자'해시 모든 혼란을 방지하려면(예를 사용하지 않는'변수 범위에서 기능):

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

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

  ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top