Writing code to write code (metacode, love it)

I got detoured off my large project to do a quick financial report, something that pulls in tons of values from a few other reports, has some manually added data, and of course has to match some funky bank-format Excel spreadsheet (I just LOVE those). So, I have a nice list of about 50 fields that have to be populated with data, all according to varying formulas. Well, I hate creating getters / setters and form code, so I whipped something together to loop through the list of field names and generate em both for me. For anyone who has never done anything like this, check out some samples.



This code generates my get/set pairs for a simple form bean: <cfloop list=<span class='cc_value'><span class='cc_value'>"#list#"</span></span> index=<span class='cc_value'><span class='cc_value'>"i"</span></span>>
<br />
&amp;lt;cffunction name=<span class='cc_value'><span class='cc_value'>"set#trim(i)#"</span></span> access=<span class='cc_value'><span class='cc_value'>"public"</span></span> returntype=<span class='cc_value'><span class='cc_value'>"void"</span></span>&amp;gt;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;cfargument name=<span class='cc_value'><span class='cc_value'>"#trim(i)#"</span></span> type=<span class='cc_value'><span class='cc_value'>"numeric"</span></span> required=<span class='cc_value'><span class='cc_value'>"yes"</span></span> /&amp;gt;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;cfset variables.values.#trim(i)# = arguments.#trim(i)# /&amp;gt;<br />
&amp;lt;/cffunction&amp;gt;<br />
<br />
&amp;lt;cffunction name=<span class='cc_value'><span class='cc_value'>"get#trim(i)#"</span></span> access=<span class='cc_value'><span class='cc_value'>"public"</span></span> returntype=<span class='cc_value'><span class='cc_value'>"any"</span></span>&amp;gt;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;cfreturn variables.values.#trim(i)# /&amp;gt;<br />
&amp;lt;/cffunction&amp;gt;<br />
<br />
</cfloop></code>
</cfoutput>

and this code generates my simple form based on thise field names (tweaking will have to be done of course, but this gets it together very quickly):
<cfloop list=<span class='cc_value'><span class='cc_value'>"#list#"</span></span> index=<span class='cc_value'><span class='cc_value'>"i"</span></span>>
<br />
&amp;lt;label&amp;gt;#trim(i)#<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<span class='cc_html_basic'><span class='cc_html_basic'>&amp;lt;span class=<span class='cc_value'><span class='cc_value'>"small"</span></span>&amp;gt;</span></span>Set #trim(i)#<span class='cc_html_basic'><span class='cc_html_basic'>&amp;lt;/span&amp;gt;</span></span><br />
&amp;lt;/label&amp;gt;<br />
<span class='cc_html_form'><span class='cc_html_form'>&amp;lt;input type=<span class='cc_value'><span class='cc_value'>"text"</span></span> name=<span class='cc_value'><span class='cc_value'>"#trim(i)#"</span></span> id=<span class='cc_value'><span class='cc_value'>"#trim(i)#"</span></span> value=<span class='cc_value'><span class='cc_value'>"##formBean.get#trim(i)#()##"</span></span> 0&amp;gt;</span></span>disabled = <span class='cc_value'><span class='cc_value'>"disabled"</span></span>&amp;lt;/cfif&amp;gt;<br />
<br />

</cfloop></code></cfoutput>
Digg StumbleUpon Facebook Technorati Fav newsvine reddit FARK Google Bookmarks
  1. Dan Wilson

    #1 by Dan Wilson - July 21, 2008 at 9:17 AM

    Chris,

    Good points.

    I started on a project recently where the requirements were a little undefined and the object forms were sufficiently departed from my normal coding practices. So I customized some templates in Brian Rinaldi's code generator to match their architecture. All I have to do is either create/alter a table in a test database and bam! I get the templated code off the properties in seconds.

    This saves an immense amount of friction to the development process and has helped me volunteer for other assignments on the project. I'd rather be building the interesting functionality than writing boilerplate code...



    DW

Comments are closed.