문제

이전 코드를 검토하면서 "요청" 범위의 사용법을 자주 확인했습니다.이 범위의 적절한 사용법은 무엇입니까?

도움이 되었습니까?

해결책

코드의 모든 부분에 사용할 수 있는 여러 범위가 있습니다.세션, 클라이언트, 쿠키, 애플리케이션 및 요청.일부는 특정 방식으로 사용하는 것이 권장되지 않습니다(예:사용자 정의 태그 또는 CFC 내에서 요청 또는 애플리케이션 범위를 사용합니다.이것은 커플 링, 캡슐화 원칙을 위반하고 나쁜 관행으로 간주됨) 일부는 특별한 목적을 가지고 있습니다.쿠키는 클라이언트 컴퓨터에 물리적 쿠키로 유지되며 세션 범위 변수는 사용자별로 지정되며 웹사이트에서 사용자 세션과 함께 만료됩니다.

변수가 변경될 가능성이 매우 낮고(모든 의도와 목적에 대해 일정함) 애플리케이션 시작 시 간단하게 초기화되고 다시 작성되지 않을 수 있는 경우 일반적으로 모든 사용자와 모든 세션 간에 유지되므로 이를 애플리케이션 범위에 넣어야 합니다.올바르게 구현되면 한 번 작성되고 N 번 읽혀집니다.

Application.cfm에서 응용프로그램 변수의 적절한 구현은 다음과 같습니다.

<cfif not structKeyExists(application, "dsn")>
    <cflock scope="application" type="exclusive" timeout="30">
        <cfif not structKeyExists(application, "dsn")>
            <cfset application.dsn = "MyDSN" />
            <cfset foo = "bar" />
            <cfset x = 5 />
        </cfif>
    </cflock>
</cfif>

잠금 전후에 애플리케이션 범위에 변수가 있는지 확인하므로 두 명의 사용자가 애플리케이션 시작 시 경쟁 조건을 생성하면 그 중 한 명만 애플리케이션 변수를 설정하게 됩니다.

이 접근 방식의 이점은 요청이 있을 때마다 저장된 변수를 지속적으로 새로 고치지 않아 사용자의 시간과 서버의 처리 주기를 낭비한다는 것입니다.단점은 약간 장황하고 복잡하다는 것입니다.

이는 Application.cfc를 추가하여 크게 단순화되었습니다.이제 애플리케이션 시작 시 어떤 변수가 생성되는지 지정할 수 있으며, 존재 여부 확인 및 잠금에 대해 걱정할 필요가 없습니다.

<cfcomponent>
    <cfset this.name = "myApplicationName" />

    <cffunction name="onApplicationStart" returnType="boolean" output="false">
        <cfset application.dsn = "MyDSN" />
        <cfset foo = "bar" />
        <cfset x = 5 />
        <cfreturn true />
    </cffunction>
</cfcomponent>

사용 가능한 다양한 특수 기능과 이를 사용하는 방법에 대한 모든 세부 사항을 포함하여 Application.cfc에 대한 자세한 내용을 보려면, Raymond Camden의 블로그에서 이 게시물을 추천합니다..

요약하자면, 요청 범위는 코드의 모든 곳에서 사용할 수 있지만 그렇다고 해서 모든 곳에서 사용하는 것이 반드시 "올바른" 것은 아닙니다.전임자가 캡슐화를 깨기 위해 이를 사용했을 가능성이 있으며 리팩터링이 번거로울 수 있습니다.그대로 두는 것이 가장 좋을 수도 있지만 어떤 범위가 작업에 가장 적합한 도구인지 이해하면 향후 코드가 확실히 더 좋아질 것입니다.

다른 팁

이것은 매우 주관적인 질문이며 일부는 최신 ColdFusion 응용 프로그램에서 요청 범위를 사용하는 것이 결코 "적절하지 않다"고 주장하기도합니다.

이 면책 조항을 없애고 요청 범위가 무엇이고 어디에 유용할지 정의 해 보겠습니다.

요청 범위는 단일 ColdFusion 페이지 요청의 절대 전역 범위입니다. 응용 프로그램, 서버, 클라이언트 및 세션 범위와 같은 공유 범위가 아니므로 스레드 안전을 위해 잠금이 필요하지 않습니다 (CF8의 CFTHREAD 태그를 사용하여 단일 요청에서 작업자 스레드를 생성하지 않는 한). 전역 범위로서 부모에서 호출자로 전달하지 않고도 요청 스택의 모든 수준에서 변수를 유지하는 매우 편리한 방법입니다. 이것은 이전 CF 앱에서 중첩되거나 재귀적인 사용자 정의 태그를 통해 변수를 유지하는 매우 일반적인 방법이었습니다.

많은 애플리케이션이이 범위를 사용하여 애플리케이션 수준 변수 (예 : 구성 설정)를 저장하지만 요청 범위와 애플리케이션 범위 사이의 큰 (때로는 미묘한) 차이점은 동일한 요청의 값입니다. 범위 변수는 개별 페이지 요청마다 다를 수 있습니다.

전임자는이 범위를 명시 적으로 전달하지 않고도 캡슐화 된 코드 단위 또는 중첩 된 코드 단위 사이의 점프에서 살아남는 데 필요한 변수를 편리하게 설정하는 수단으로 사용했다고 생각합니다.

알겠습니다. 귀하의 코드에 대해 설명하고 싶었습니다.내가 미친 것 같으면 용서 해주세요.그러나 처음에 structKeyExists가 이미 확인되었습니다.그것이 사실이라는 것을 알고 있기 때문에 다른 검사를 실행하는 것은 말이되지 않습니다.그래서 제 버전은 이것입니다 ...하지만 그건 저뿐입니다. <시간> 라코 디스 <시간>

좋습니다.

저는 사이트를 강화하는 데 사용할 회사의 프레임 워크를 작성하고 있습니다.

요청 변수를 사용하여 다른 CFC에서 사용할 수있는 특정 데이터를 설정해야했습니다. 이렇게하면 데이터를 지속적으로 전달할 필요없이 애플리케이션 전체에서 데이터를 사용할 수 있습니다.나는 정직하게 request 및 응용 프로그램을 정적 함수 구성 요소로 사용하면 문제가 없어야한다고 믿습니다.제 생각이 틀렸는 지 모르겠지만 프레임 워크를 공개하면 보게 될 것입니다.

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