Hi nathan 
> Well, I figured people might be getting sick of my constant 
> posts to this list, but since nobody else is answering..... ;)

This is the best cf-list I subscribed ever...
You are an important part of getting us over the mountain to the not
easy usage of cfc in an oo-way - thus please continue to share your
experience and knowledge ;)

- daniel


> Here's one way to consider doing what you're talking about:
> 
> You could use what the patterns people call "composition" to 
> have your components use each other.  It's a fancy word for 
> basically just having components use other components 
> functionality.  So, you might do something like this:
> 
> application.ActiveDirectoryService =
> createObject("component","ActiveDirectoryService").init();
> 
> application.UserService = 
> createObject("component","UserService").init(application.Activ
> eDirectoryServ
> ice);
> 
> In that scenario you would be passing UserService an instance 
> of the ActiveDirectoryService when you instantiate -- you 
> then have two cached component instances, one of which 
> (UserService) has an internal "instance" reference to the 
> ActiveDirectoryService.  The guts of the UserService can then 
> use the ActiveDirectoryService in its instance data without 
> worrying about where that instance actually lives (which in 
> that case of that code would be in the Application scope).
> 
> So, now UserService has a clean way to use ActiveDirectoryService.
> 
> When you instantiate your AceLinkUser into the session you 
> could then pass the UserService to your init() method of 
> AceLinkUser.  UserService could then expose whatever methods 
> are needed in ActiveDirectoryService.  Or, you could just 
> pass both to the UserService.  Since components pass by 
> reference there should be very little overhead associated 
> this doing it that way.  You might also consider having the 
> init() method of AceLinkUser just get whatever information is 
> needed from the other services directly.  That is, rather 
> than having the AceLinkUser component actually call those 
> methods, just call them when you instantiate.  In other 
> words, instead of this:
> 
> session.AceLinkUser = 
> createObject("component","AceLinkUser").init(username,applicat
> ion.UserServic
> e);
> 
> You could just do:
> 
> session.AceLinkUser = 
> createObject("component","AceLinkUser").init(username,applicat
> ion.UserServic
> e.isFacutly(username));
> 
> Which one you use will depend on the extent to which the 
> AceLinkUser uses the methods of the UserService and 
> ActiveDirectoryService during its life a lot or just during 
> instantiation.
> 
> I'm also not sure if it's necessarily bad if both the 
> UserService and the AceLinkUser have an isFaculty method.  
> The UserService's isFaculty method receives a username and 
> does some kind of data retrieval to give you the answer.  The 
> AceLinkUser's isFaculty() method just returns a boolean value 
> (presumably already stored in the instance data) without 
> needing an argument.  So, although the methods have the same 
> name, they serve different and appropriate purposes in the 
> respective components.
> 
> Those with greater OO design experience may have a better 
> critique, but I've had good success using composition -- 
> particularly when I build a single component that gives the 
> developer an API to use, where that single component has a 
> few other "services" that get passed at init() time.  That 
> way the developer needs to learn only a single component's 
> API and I can worry about the ways they interact with each 
> other.  Thus, I achieve a clean separation of interface from 
> implementation.  If you're interested in a working example, 
> I'm almost ready to do the first public alpha test of a 
> blogging tool that makes extensive use of composition 
> (impart.sourceforge.net).  I'd be happy to share that code, 
> rough as it may be in its current form.
> 
>  - Nathan
> 
> 
> 
> > -----Original Message-----
> > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > Behalf Of Dawson, Michael
> > Sent: Tuesday, August 19, 2003 12:08 PM
> > To: [EMAIL PROTECTED]
> > Subject: [CFCDev] Suggestions for Handling Multi-Use Methods
> >
> >
> > I'm struggling with the best location to put some methods 
> that will be 
> > used for both loading a session-based instance as well as 
> performing 
> > simple actions.
> >
> > For example, I have three components:
> >
> > AceLinkUser
> > --The main component
> > --Is aware of the user; stores data in an instance variable --An 
> > instance of this will be stored in the session scope 
> --Calls methods 
> > from ActiveDirectoryService to load data during Init() 
> --Calls methods 
> > from UserService to load data during Init()
> >
> > UserService
> > --Used to gather user-related information
> > --Is unaware of data; only returns data to the caller; no instance 
> > variables --Calls methods from ActiveDirectoryService
> > --Contains methods that pull information from other data sources
> >
> > ActiveDirectoryService
> > --Communicates with Active Directory
> > --Is unaware of data; stores connection information in an instance 
> > variable --Does not consume any other components
> > --Contains the main LDAP query method
> > --Contains other utility methods that use the LDAP query method
> >
> > As you can see, AceLink user calls the other two components. 
> > UserService, in turn, may also call the ActiveDirectoryService 
> > component.
> >
> > To instantiate my AceLinkUser object, I need to know if a user is a 
> > faculty member.  This information is stored in an Active Directory 
> > domain group.
> >
> > Currently, AceLinkUser's Init() calls "IsFaculty(username) 
> method from 
> > the UserService component.  I could have also placed this 
> same method 
> > in the ActiveDirectoryService component, but I felt it 
> would be best 
> > to "abstract" the call by creating a UserService component.
> >
> > Is it best to keep the methods "at the lowest level" in the 
> component 
> > organization?  Where is the best location for IsFaculty()?
> >
> > Is it bad to have a single component call a common 
> component directly 
> > AS WELL AS call a compoent that, in turn, calls the common 
> component?
> >
> > I'm not really concerned about performance at this time.  I'm only 
> > interested in how components would be best structured in 
> this example.
> >
> > Thanks
> >
> > M!chael A. Dawson
> > Group Manager, Programming and Software Development
> > Office of Technology Services
> > University of Evansville
> > 1800 Lincoln Avenue
> > Evansville, IN 47722
> > 812-479-2581
> 
> ----------------------------------------------------------
> You are subscribed to cfcdev. To unsubscribe, send an email
> to [EMAIL PROTECTED] with the word 'unsubscribe cfcdev' 
> in the message of the email.
> 
> CFCDev is run by CFCZone (www.cfczone.org) and supported
> by Mindtool, Corporation (www.mindtool.com).
> 

----------------------------------------------------------
You are subscribed to cfcdev. To unsubscribe, send an email
to [EMAIL PROTECTED] with the word 'unsubscribe cfcdev' 
in the message of the email.

CFCDev is run by CFCZone (www.cfczone.org) and supported
by Mindtool, Corporation (www.mindtool.com).

Reply via email to