<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>Bob&apos;s Blog - ColdFusion Tidbits - How I Use Transfer</title>
			<link>http://www.silverwareconsulting.com/index.cfm</link>
			<description>Some stuff about ColdFusion and Transfer</description>
			<language>en-us</language>
			<pubDate>Thu, 09 Sep 2010 05:23:10 -0400</pubDate>
			<lastBuildDate>Mon, 24 Nov 2008 16:33:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>bob.silverberg@gmail.com</managingEditor>
			<webMaster>bob.silverberg@gmail.com</webMaster>
			
			<item>
				<title>How I Use Transfer Today - A Gateway MapFactoryBean</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/11/24/How-I-Use-Transfer-Today--A-Gateway-MapFactoryBean</link>
				<description>
				
				I left something critical out of my &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/11/12/How-I-Use-Transfer-Today--Encapsulating-Database-Access&quot;&gt;last post&lt;/a&gt; about how I&apos;m using Transfer (an ORM for ColdFusion) these days.&lt;/p&gt;
&lt;p&gt;If you&apos;ve been following along you&apos;ll know that I&apos;m using an &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/21/How-I-Use-Transfer--Part-VIII--My-Abstract-Transfer-Decorator-Object--Simple-Methods&quot;&gt;Abstract Transfer Decorator&lt;/a&gt;, which all of my concrete decorators extend, and that I&apos;m using &lt;a href=&quot;http://www.briankotek.com/blog/&quot; target=&quot;_blank&quot;&gt;Brian Kotek&lt;/a&gt;&apos;s most excellent &lt;a href=&quot;http://coldspringutils.riaforge.org/&quot; target=&quot;_blank&quot;&gt;Bean Injector&lt;/a&gt; to load singletons into my Transfer objects.  This raises an interesting issue: How to inject the appropriate Gateway Object into my Transfer Object.  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>Coldspring</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Mon, 24 Nov 2008 16:33:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/11/24/How-I-Use-Transfer-Today--A-Gateway-MapFactoryBean</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer Today - Encapsulating Database Access</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/11/12/How-I-Use-Transfer-Today--Encapsulating-Database-Access</link>
				<description>
				
				I&apos;ve been meaning to follow up on my &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/How-I-Use-Transfer&quot;&gt;How I Use Transfer&lt;/a&gt; series, as I&apos;ve made a few changes to the way I write my ColdFusion code since that series was written.  One of the biggest changes was to encapsulate all database access in my Gateway components.&lt;/p&gt;
&lt;p&gt;Now I say biggest not because it took a lot of time and effort to make the change, in fact the opposite is true.  I say biggest simply because it represented a significant shift in the way I&apos;m designing my model.  Let me start with the rationale for making this change.  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Wed, 12 Nov 2008 10:59:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/11/12/How-I-Use-Transfer-Today--Encapsulating-Database-Access</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part X - My Abstract Transfer Decorator Object - Validations</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/27/How-I-Use-Transfer--Part-X--My-Abstract-Transfer-Decorator-Object--Validations</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/22/How-I-Use-Transfer--Part-IX--My-Abstract-Transfer-Decorator-Object--The-Populate-Method&quot;&gt;previous post&lt;/a&gt; in this series about Transfer (an ORM for ColdFusion) I discussed the populate() method of my AbstractTransferDecorator.  Having discussed some of the simple methods of this object in the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/21/How-I-Use-Transfer--Part-VIII--My-Abstract-Transfer-Decorator-Object--Simple-Methods&quot;&gt;post prior to that&lt;/a&gt;, what remains is a discussion of how I&apos;m currently using this object to do validations.&lt;/p&gt;
&lt;p&gt;There are three methods in this object that are used to support validations in my apps:
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;getValidations()&lt;/strong&gt; - This returns an array of business rules that apply to the Business Object.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;addValidation()&lt;/strong&gt; - This is a helper method to make defining validations simpler.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;validate()&lt;/strong&gt; - This contains generic validation routines that are shared by all Business Objects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Let&apos;s start with getValidations(), which returns an array of business rules.  This array does not include any information about implementing those rules, it simply describes the rule, and any requirements for the rule.  For example, one rule might be &lt;em&gt;Required&lt;/em&gt;, which simply means that the user must enter a value for the property.  Another rule might be &lt;em&gt;Range&lt;/em&gt;, in which case the array item would also include the upper and lower limits of the range.  One of the nice things about this approach is that this array can be used to generate both client side and server side validations.  So I only have to describe the validations for a given object once in my app, and then I have additional pieces of code which take these rules and automatically generate the JavaScript required for client validations, and the CF code required for server side validations.  We&apos;ll see an example of the latter when we discuss the validate() method later in this post.  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Sun, 27 Jul 2008 04:49:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/27/How-I-Use-Transfer--Part-X--My-Abstract-Transfer-Decorator-Object--Validations</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part IX - My Abstract Transfer Decorator Object - The Populate Method</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/22/How-I-Use-Transfer--Part-IX--My-Abstract-Transfer-Decorator-Object--The-Populate-Method</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/21/How-I-Use-Transfer--Part-VIII--My-Abstract-Transfer-Decorator-Object--Simple-Methods&quot;&gt;previous post&lt;/a&gt; in this series about Transfer (an ORM for ColdFusion) I introduced my AbstractTransferDecorator and discussed some of its simpler methods.  In this post I want to go through the populate() method in detail.  I have posted bits and pieces of this method in the past, but I don&apos;t think I&apos;ve ever documented the whole thing, as it stands today. I&apos;ll break it into pieces to make it a bit more manageable.
&lt;code&gt;
&lt;cffunction name=&quot;populate&quot; access=&quot;public&quot; output=&quot;false&quot; returntype=&quot;void&quot; hint=&quot;Populates the object with values from the argumemnts&quot;&gt;
	&lt;cfargument name=&quot;args&quot; type=&quot;any&quot; required=&quot;yes&quot; /&gt;
	&lt;cfargument name=&quot;FieldList&quot; type=&quot;any&quot; required=&quot;no&quot; default=&quot;&quot; /&gt;
	
	&lt;cfset var theFieldList = &quot;&quot; /&gt;
	&lt;cfset var TransferMetadata = getTransfer().getTransferMetaData(getClassName()) /&gt;
	&lt;cfset var Properties = TransferMetadata.getPropertyIterator() /&gt;
	&lt;cfset var theProperty = 0 /&gt;
	&lt;cfset var varName = 0 /&gt;
	&lt;cfset var varType = 0 /&gt;
	&lt;cfset var varValue = 0 /&gt;
	&lt;cfset var CompType = 0 /&gt;
	&lt;cfset var hasIterator = false /&gt;
	&lt;cfset var theIterator = 0 /&gt;
	&lt;cfset var theComposition = 0 /&gt;
	&lt;cfset var ChildClass = 0 /&gt;
	&lt;cfset var ChildPKName = 0 /&gt;
	&lt;cfset var theChild = 0 /&gt;
&lt;/code&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Tue, 22 Jul 2008 10:44:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/22/How-I-Use-Transfer--Part-IX--My-Abstract-Transfer-Decorator-Object--The-Populate-Method</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part VIII - My Abstract Transfer Decorator Object - Simple Methods</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/21/How-I-Use-Transfer--Part-VIII--My-Abstract-Transfer-Decorator-Object--Simple-Methods</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/14/How-I-Use-Transfer--Part-VI--My-Abstract-Gateway-Object&quot;&gt;past&lt;/a&gt; &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/15/How-I-Use-Transfer--Part-VII--A-Concrete-Gateway-Object&quot;&gt;two&lt;/a&gt; posts in this series about &lt;a href=&quot;http://www.transfer-orm.com/&quot;&gt;Transfer&lt;/a&gt; (an ORM for ColdFusion) I discussed how I have implemented my Abstract and Concrete Gateways.  As you may recall from &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/6/24/How-I-Use-Transfer--Part-II--Model-Architecture&quot;&gt;Part II&lt;/a&gt;, that leaves my AbstractTransferDecorator Object as the final abstract object in my model.  There is a lot of code in this object, and I plan to provide a lot of explanation, so I&apos;m going to break this up into a few posts.&lt;/p&gt;
&lt;p&gt;My AbstractTransferDecorator acts as a base object for all of my Concrete Decorators, and, because most of my Business Objects are created for me by Transfer, it really acts as an Abstract Business Object.  For a basic overview of what a decorator is, and how one is used with Transfer, check out &lt;a href=&quot;http://docs.transfer-orm.com/wiki/Writing_Decorators.cfm&quot;&gt;this page&lt;/a&gt; from the Transfer docs.&lt;/p&gt;
&lt;p&gt;I have blogged about this object a &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2007/9/26/A-Generic-Decorator-for-Transfer--A-Populate-Method&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/4/16/Using-Transfer-Decorators-to-Deal-with-Invalid-Data&quot;&gt;times&lt;/a&gt; &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/6/17/Using-Transfer-Metadata-to-Create-a-Memento&quot;&gt;before&lt;/a&gt;, but the posts in this series will, for now, supercede all of those previous posts, as this object continues to change.  In fact, this object has a few methods and techniques the design of which I&apos;m not crazy about right now.  There will definitely be changes coming, at some point down the road.  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Mon, 21 Jul 2008 12:11:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/21/How-I-Use-Transfer--Part-VIII--My-Abstract-Transfer-Decorator-Object--Simple-Methods</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part VII - A Concrete Gateway Object</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/15/How-I-Use-Transfer--Part-VII--A-Concrete-Gateway-Object</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/14/How-I-Use-Transfer--Part-VI--My-Abstract-Gateway-Object&quot;&gt;previous post&lt;/a&gt;, I described my Abstract Gateway Object.  As I did with the Service Objects, I&apos;m going to take a moment to describe a Concrete Gateway Object as an illustration of how I use the Abstract Gateway.  I&apos;ll start with a recap of the differences between the Abstract Gateway and Concrete Gateways, followed by a look at the code of a specific Concrete Gateway.&lt;/p&gt;
&lt;ul&gt;&lt;strong&gt;The Abstract Gateway Object&lt;/strong&gt;
	&lt;li&gt;Is never instantiated as an object.&lt;/li&gt;
	&lt;li&gt;Cannot be used as is.&lt;/li&gt;
	&lt;li&gt;Is only ever used as a base object for Concrete Gateway Objects.&lt;/li&gt;
	&lt;li&gt;There is only one Abstract Gateway Object, called AbstractGateway.cfc.&lt;/li&gt;
	&lt;li&gt;Does not have any Transfer classes associated with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;strong&gt;Concrete Gateway Objects&lt;/strong&gt;
	&lt;li&gt;Are instantiated as objects.&lt;/li&gt;
	&lt;li&gt;Methods on them are called by Service Objects.&lt;/li&gt;
	&lt;li&gt;All extend AbstractGateway.cfc.&lt;/li&gt;
	&lt;li&gt;There are many Concrete Gateway Objects, e.g., UserGateway.cfc, ProductGateway.cfc, ReviewGateway.cfc, etc.&lt;/li&gt;
	&lt;li&gt;Have one &quot;main&quot; Transfer class associated with them, but can interact with others via code specific to the Concrete Gateway.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing to note here is that my Gateway Objects are all injected into Service Objects via Coldspring, and are only called by Service Objects.  So the Service acts as an API to the entire model.  If a Business Object needs to call a method on a gateway, it calls it via a Service Object that is injected into the Business Object.  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Tue, 15 Jul 2008 13:27:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/15/How-I-Use-Transfer--Part-VII--A-Concrete-Gateway-Object</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part VI - My Abstract Gateway Object</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/14/How-I-Use-Transfer--Part-VI--My-Abstract-Gateway-Object</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/3/How-I-Use-Transfer--Part-IV--My-Abstract-Service-Object&quot;&gt;past&lt;/a&gt; &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V--A-Concrete-Service-Object&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V1--A-Comment-and-Response&quot;&gt;posts&lt;/a&gt; in the series I discussed, at length, how I have implemented my service layer, which consists of an Abstract Service Object and Concrete Service Objects.  I decided to take it easy this time around and just look at my AbstractGateway Object, as it&apos;s pretty simple in comparison.&lt;/p&gt;
&lt;p&gt;As with the AbstractService, this object is not meant to be instantiated on its own, but rather acts as a base object which my concrete Gateway Objects extend. There are only three public methods in my AbstractGateway:
&lt;ul&gt;
	&lt;li&gt;GetList(), which returns a listing for the default entity&lt;/li&gt;
	&lt;li&gt;GetActiveList(), which returns a listing for the default entity, but only includes Active records&lt;/li&gt;
	&lt;li&gt;ReInitActiveList(), which is used to reinitialize the cached query for the Active List (see below for details)&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Mon, 14 Jul 2008 06:35:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/14/How-I-Use-Transfer--Part-VI--My-Abstract-Gateway-Object</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part V.1 - A Comment and Response</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V1--A-Comment-and-Response</link>
				<description>
				
				&lt;a href=&quot;http://www.briankotek.com/blog/&quot;&gt;Brain Kotek&lt;/a&gt; wrote a lengthy and informative comment to &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V--A-Concrete-Service-Object&quot;&gt;my last blog post&lt;/a&gt;.  I started composing a response as a comment of my own, but it got very long, and I think that both Brian&apos;s comment and my response contribute greatly to the series, so I&apos;ve turned my response into a blog post.  I&apos;m including Brian&apos;s comments in quotes throughout this post.&lt;/p&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Tue, 08 Jul 2008 10:28:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V1--A-Comment-and-Response</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part V - A Concrete Service Object</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V--A-Concrete-Service-Object</link>
				<description>
				
				I was going to describe my Abstract Gateway Object in this post, but during a conversation with a fellow developer it was suggested that I should take a moment to describe a Concrete Service Object, as there was still a bit of confusion in his mind about how I use the Abstract Service Object.&lt;/p&gt;
&lt;p&gt;To recap a bit, I have an Abstract Service Object and it is used as an extension point for most of my Concrete Service Objects.  Perhaps a bit more of a definition is in order.&lt;/p&gt;
&lt;ul&gt;&lt;strong&gt;The Abstract Service Object&lt;/strong&gt;
	&lt;li&gt;Is never instantiated as an object.&lt;/li&gt;
	&lt;li&gt;Cannot be used as is.&lt;/li&gt;
	&lt;li&gt;Is only ever used as a base object for Concrete Service Objects.&lt;/li&gt;
	&lt;li&gt;There is only one Abstract Service Object, called AbstractService.cfc.&lt;/li&gt;
	&lt;li&gt;Does not have any Transfer classes associated with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;strong&gt;Concrete Service Objects&lt;/strong&gt;
	&lt;li&gt;Are instantiated as objects.&lt;/li&gt;
	&lt;li&gt;Methods on them are called by Controllers, other Concrete Service Objects and Business Objects.&lt;/li&gt;
	&lt;li&gt;Most extend AbstractService.cfc.&lt;/li&gt;
	&lt;li&gt;There are many Concrete Service Objects, e.g., UserService.cfc, ProductService.cfc, ReviewService.cfc, etc.&lt;/li&gt;
	&lt;li&gt;Have one &quot;main&quot; Transfer class associated with them, but can interact with others via code specific to the Concrete Service.&lt;/li&gt;
&lt;/ul&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Tue, 08 Jul 2008 07:15:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/8/How-I-Use-Transfer--Part-V--A-Concrete-Service-Object</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part IV - My Abstract Service Object</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/7/3/How-I-Use-Transfer--Part-IV--My-Abstract-Service-Object</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/6/30/How-I-Do-Transfer--Part-III--Abstract-Objects&quot;&gt;previous post in the series&lt;/a&gt; I discussed how I base most of my objects on Abstract Objects, which allows me to eliminate a lot of duplicate code.  I then took a look at one method in my AbstractService object to demonstrate this.  In this post I&apos;m going to look at the rest of the methods in the AbstractService, so be prepared for a lot of code.&lt;/p&gt;
&lt;p&gt;Let&apos;s start with the Init() method and the Configure() method:
&lt;code&gt;
&lt;cffunction name=&quot;Init&quot; access=&quot;Public&quot; returntype=&quot;any&quot; output=&quot;false&quot; hint=&quot;I build a new Service&quot;&gt;
	&lt;cfargument name=&quot;AppConfig&quot; type=&quot;any&quot; required=&quot;true&quot; /&gt;
	&lt;cfset variables.Instance = StructNew() /&gt;
	&lt;cfset variables.Instance.AppConfig = arguments.AppConfig /&gt;
	&lt;cfset Configure() /&gt;
	&lt;cfreturn this /&gt;
&lt;/cffunction&gt;

&lt;cffunction name=&quot;Configure&quot; access=&quot;Public&quot; returntype=&quot;void&quot; output=&quot;false&quot; hint=&quot;I am run by the Init() method&quot;&gt;
&lt;/cffunction&gt;
&lt;/code&gt;
&lt;/p&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Thu, 03 Jul 2008 11:11:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/7/3/How-I-Use-Transfer--Part-IV--My-Abstract-Service-Object</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part III - Abstract Objects</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/6/30/How-I-Do-Transfer--Part-III--Abstract-Objects</link>
				<description>
				
				In the &lt;a href=&quot;http://www.silverwareconsulting.com/index.cfm/2008/6/24/How-I-Use-Transfer--Part-II--Model-Architecture&quot;&gt;previous post in the series&lt;/a&gt; I discussed the four types of objects that comprise my model.  As I was creating instances of those object types I realized that they did a lot of the same things.  For example, my UserService needed methods like getUser(), updateUser(), deleteUser() and listUsers(), while my ProductService needed getProduct(), updateProduct(), deleteProduct() and listProducts().  Not only do they need to do similar things, but they pretty much do them the same way.  Now that&apos;s a lot of code duplication.&lt;/p&gt;
&lt;p&gt;So I created an AbstractService, which each of my concrete Service Objects extend.  My AbstractService has methods like Get(), Update(), Delete() and GetList().  For the most part, the code required for getUser() is identical to the code required for getProduct(), with the only difference being the business objects with which they interact (User and Product, respectively), so I was able to write a single, parameterized method, which will work for most of my Service Objects.&lt;/p&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Mon, 30 Jun 2008 10:39:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/6/30/How-I-Do-Transfer--Part-III--Abstract-Objects</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part II - Model Architecture</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/6/24/How-I-Use-Transfer--Part-II--Model-Architecture</link>
				<description>
				
				I think that the best place to start is with the high level architecture of my model.  I have four types of objects in my model:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Service Objects&lt;/li&gt;
	&lt;li&gt;Gateway Objects&lt;/li&gt;
	&lt;li&gt;Business Objects&lt;/li&gt;
	&lt;li&gt;Utility Objects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that these names are not necessarily the generally accepted or &quot;proper&quot; names for these types of objects in the Object Oriented community. These are terms that I have chosen to use, and I will define what I mean by them.&lt;/p&gt;  [More]
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Tue, 24 Jun 2008 06:36:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/6/24/How-I-Use-Transfer--Part-II--Model-Architecture</guid>
				
			</item>
			
			<item>
				<title>How I Use Transfer - Part I - Introduction</title>
				<link>http://www.silverwareconsulting.com/index.cfm/2008/6/23/How-I-Use-Transfer--Part-I--Introduction</link>
				<description>
				
				I&apos;ve now been using &lt;a href=&quot;http://www.transfer-orm.com/&quot;&gt;Transfer&lt;/a&gt; for about a year, and I&apos;ve built up a bit of a standard way that I use it in my apps.  I&apos;m not suggesting that this is the best way (by any means), but I thought it would be worth posting about it to share my experiences and learn from others.  So I&apos;m starting a new series, simply called &quot;How I Use Transfer&quot;.&lt;/p&gt;
&lt;p&gt;I&apos;m not sure how to best go about describing all that I do.  A lot of it is really architectural and isn&apos;t specific to Transfer.  To a certain extent Transfer could be switched out for another ORM without requiring a lot of code changes.  So I suppose this is also about my approach to OO design with ColdFusion.  Like others, I have found this to be a long and hard learning curve, and I still have a long way to go.  It may be that much of what I&apos;m about to document will change over the next several months, as I learn other ways of doing things, but hopefully it will still be of value, particularly to anyone just starting down this road.&lt;/p&gt;
&lt;p&gt;So again, I&apos;m not trying to document any kind of best practices.  I already know that there are ideas I&apos;ve read on other people&apos;s blogs that I&apos;d like to implement but haven&apos;t yet.  This is a snapshot, a point in time, something I&apos;ll probably revisit months or years from now and laugh about.  But if others are going through the same thing as me, then maybe we can all learn together.&lt;/p&gt;
&lt;p&gt;In my next post I intend to describe a high level overview of the architecture of my model.&lt;/p&gt; 
				</description>
				
				<category>Transfer</category>				
				
				<category>ColdFusion</category>				
				
				<category>OO Design</category>				
				
				<category>How I Use Transfer</category>				
				
				<pubDate>Mon, 23 Jun 2008 08:24:00 -0400</pubDate>
				<guid>http://www.silverwareconsulting.com/index.cfm/2008/6/23/How-I-Use-Transfer--Part-I--Introduction</guid>
				
			</item>
			</channel></rss>