It is not considered good practice for a component to know about scopes outside itself (application, request, session and so forth)*.

From http://coldfusion.sys-con.com/read/47203.htm (emphasis mine):
*/Shared scopes/*: Inside a cfcomponent, you can access the shared scopes, such as application and session. Since the component is part of a request, request-based scopes such as URL, form, and request, are available to the component. /Accessing these scopes is generally considered bad practice because it makes the code less reusable./
This is not just limited to CFCs... it is considered bad practice in general OO programming for a component to know about things outside itself.

Oh, and Ben is right. The pages themselves aren't singletons, but the thing that contains them is.

* Unless you are writing a facade for the scope, but that's a different story.
Peter Bell wrote:
Hello Haikal,

Thanks for the feedback. WOULD this be a better idea? Are there any best
practices/heuristics on whether the objects should sit inside the Singleton
vs. just being created by it?

I haven't seen this pattern before (which means very little - this is my
first OO app since college in '91 in an old 4GL with a buggy compiler). Are
there any benefits or downsider to the creator creating the objects within
its own scope - either conceptually or from a performance perspective?
Anywhere I could read up more on this appraoch?

Any thoughts much appreciated.

Best Wishes,
Peter

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf
Of Haikal Saadh
Sent: Tuesday, February 28, 2006 2:25 AM
To: [email protected]
Subject: Re: [CFCDev] Lazy Load - any patterns to encapsulate?


Rather than having PageSingleton save it's data in application scope, wouldn't it be better to have page singleton save it's data inside it, and have page singleton itself in application scope?

so:

PageSingleton
=========
- Struct pages;
=========
+ init(String pageFilePath) : PageSingleton
+ getPage(String path): String
=========

getPage() would basically check if the page has been loaded into 'pages' (structKeyExists), if so, return it, otherwise load it and return it.


Rob Munn wrote:
This looks like the Singleton pattern to me:
page =

CreateObject("component","prototype.entity.systemsforge.PageSingleton").Init
("#ThisPageFilePath#");};
Inside the PageSingleton.cfc init() function you put the logic to check whether the page exists in your application.page structure, initialize it if it doesn't exist, and return it. That way the only place you ever reference the application scope is in PageSingleton. I can post a clearer code example tomorrow when my brain is less foggy, but this is the method I learned from others here and it has worked well for me.
    -----Original Message-----
    *From:* [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
    *On Behalf Of *Peter Bell
    *Sent:* Monday, February 27, 2006 7:58 PM
    *To:* [email protected]
    *Subject:* [CFCDev] Lazy Load - any patterns to encapsulate?

    Hi There,
So, I have a page class that I lazy load to minimize initial
    application load time for large sites. However, for performance
    purposes, I store each page object once it has been created using
    the application scope (I don't have so many instances of the page
    class that this would be a problem in terms of memory and each one
    is fairly small).
So, my calling code looked like this:
    <cfscript>
      // If the page doesn't exist in application scope, initialize it
    (lazy load)
      if(not isDefined("Application.page.#ThisPageFilePath#"))
       {"Application.page.#ThisPageFilePath#" =

CreateObject("component","prototype.entity.systemsforge.Page").Init("#ThisPa
geFilePath#");};
    </cfscript>
That looked plain wrong (seemed to be wrong for anything other
    than a page something - e.g. a page service to be worrying about
    whether or not a given page had been constructed or not), so I
    created an Application.PageService, provided it with a
    GetbyFilePath() method and put the above code in there.
Is this going in the right direction? Best Wishes,
    Peter




--
Haikal Saadh, Applications Programmer
Teaching and Learning Support Services
K405, Queensland University of Technology, Kelvin Grove Campus
[EMAIL PROTECTED], 3864 8633
CRICOS No. 00213J



----------------------------------------------------------
You are subscribed to cfcdev. To unsubscribe, send an email to 
[email protected] with the words 'unsubscribe cfcdev' as the subject of the 
email.

CFCDev is run by CFCZone (www.cfczone.org) and supported by CFXHosting 
(www.cfxhosting.com).

An archive of the CFCDev list is available at 
www.mail-archive.com/[email protected]


Reply via email to