My Secret Life as a Spaghetti Coder
home | about | contact | privacy statement
I can't remember the last time I used anything resembling a stack or queue (other than what I'm about to blog about). Of course, I've used lists and arrays, but not with the same intent you often see in the use of a typical LIFO or FIFO mechanism. I did have occasion to use the concept in the last couple of updates to cfrails, however, so I thought I'd bring it up in case anyone else came across the same use as I have. Let me explain how I arrived at the need (which also doubles as a little documentation):

Using cfrails, to make a model you simply go into your project and create a CFC that extends cfrails.model in the model folder. Assuming that file has the same name as a table in your database, you've now got an object (after it is instantiated, of course) with all the basic CRUD methods. The case is similar for the view or controller, where you'd be in the appropriate directory, but name it modelname_view.cfc or modelname_controller.cfc. There is a way to change the name of the table if you don't want the model name to match the table for some reason, but I'll not go over it here, as it's an "undocumented feature" at the moment.

So, now we have a table, let's call it drink. It has columns id (int, pk, identity), brandname (nvarchar 50), label (nvarchar 50), bottle_date (datetime), and description (ntext). The code currently looks like:

<cfcomponent extends="cfrails.model">
</cfcomponent>

In this case, assuming you have the corresponding controller and view set up, cfrails will show label as "Label" and bottle_date as "Bottle Date" to the user. description will be capitalized as well. Label will be shown as an <input type="text"/> and description as a <textarea>.

But while brandname would show up as an input text field too, it will be displayed as "Brandname." Now, if you had called the column brand_name or brandName, the space would be put in automatically. That's easy enough to do with new tables, but if you're working on an old one where you had used the convention numBottles, for instance, it would show up as "Num Bottles," which is not something you want displayed to the user.

Another issue shows up with bottle_date. Since it is a datetime column, cfrails will display it with a select for each of year, month, day, hour, minute (when I get around to implementing that). But in this case, you might only care about the month and the year.

How do you solve those two problems? That's where some of the configurations / extended metadata comes in.

One of the goals I have in cfrails is to keep related data together. I'm not fond of the thought that I might need to have to open an extra file to configure my class. So, if I want the view to show the name of brandname as "Brand Name," I should be able to do that within drink_view.cfc (actually, you can hand-code your views in templates if the customization options don't fit the bill, but I'm not getting into that here either).

What I wanted to be able to do was have my files look like this:

<cfcomponent extends="cfrails.view">
   <!--- configuration --->
   <cfset setHumanName("brandname", "Brand Name")>
   <cfset setFieldType("bottle_date","month/YearDate")>

   <!--- some extra functions I need --->
     ...
</cfcomponent>

(As a side note, you could use the underscore version of those functions as well. Also, the month/YearDate has not yet been implemented as of Feb. 20, 2007, and is subject to change, but you get the idea.)

That certainly seems easy enough. But, since the controller has to pass the model into the view through the view's init() method, that configuration code at the top will be executed before the view has any knowledge of a field called "brandname."

It was a long time coming, but we've finally reached the point where I needed a stack (well, the order didn't really matter, so what I implemented wasn't really a stack, but it served the same purpose).

Instead of running the actual function when it is called, I checked if the component was fully instantiated. If not, I "stack" each function that needs to be run, along with the supplied parameters. Then, in the init() method, the stacks are "popped" (it's actually done in a queue fashion, but it feels odd saying that).

Thoughts?

Hey! Why don't you make your life easier and subscribe to the full post or short blurb RSS feed? I'm so confident you'll love my smelly pasta plate wisdom that I'm offering a no-strings-attached, lifetime money back guarantee!


Comments
Leave a comment

There are no comments for this entry yet.

Leave a comment

Leave this field empty
Your Name
Email (not displayed, more info?)
Website

Comment:

Subcribe to this comment thread
Remember my details
Google
Web CodeOdor.com

Me
Picture of me

Topics
.NET (19)
AI/Machine Learning (14)
Answers To 100 Interview Questions (10)
Bioinformatics (2)
Business (1)
C and C++ (6)
cfrails (22)
ColdFusion (78)
Customer Relations (15)
Databases (3)
DRY (18)
DSLs (11)
Future Tech (5)
Games (5)
Groovy/Grails (8)
Hardware (1)
IDEs (9)
Java (38)
JavaScript (4)
Linux (2)
Lisp (1)
Mac OS (4)
Management (15)
MediaServerX (1)
Miscellany (76)
OOAD (37)
Productivity (11)
Programming (168)
Programming Quotables (9)
Rails (31)
Ruby (67)
Save Your Job (58)
scriptaGulous (4)
Software Development Process (23)
TDD (41)
TDDing xorblog (6)
Tools (5)
Web Development (8)
Windows (1)
With (1)
YAGNI (10)

Resources
Agile Manifesto & Principles
Principles Of OOD
ColdFusion
CFUnit
Ruby
Ruby on Rails
JUnit



RSS 2.0: Full Post | Short Blurb
Subscribe by email:

Delivered by FeedBurner