Oh, man, Isaac...you just set my head spinning...(I think
I like my simple, single programmer, 4.5.2 world...)

I think I'll just become an athiest when it comes to anything
beyond 4.5.2...(it doesn't exist except on the list...it doesn't
exist except on the list...)  ;o)

I purposefully quoted everything you just said....  aaaayyyyy!

Rick

> -----Original Message-----
> From: S. Isaac Dealey [mailto:[EMAIL PROTECTED]
> Sent: Monday, March 06, 2006 7:27 PM
> To: CF-Talk
> Subject: Re: OOP, why me?
> 
> 
> > I'm the sort of person who likes to understand why I'm
> > doing something rather than just do it. If I download
> > a UDF I analyse it and try to learn rather than just
> > stick it into my app and smile because it's worked.
> > With that in mind, I wonder if someone could explain
> > to me in super simple, beginer speak, layman terms
> > what Object Oriented Programming means in terms
> > of CF and why I should use it?
> 
> OO Programming in terms of CF means what it does in every other
> language: that you have Classes ("static" methods of which can be
> executed in CF using <cfinvoke component="my.component.path"
> method="mymethod"> although I don't recommend this because the CF
> server creates an object anyway) and Objects (which are created when
> you use CreateObject() or <cfobject> to "instantiate" a CFC). There's
> no magical connection between OO or OO-ness and frameworks like
> Model-Glue or Mach-II -- they are no more or less OO frameworks than
> any other framework except possibly with respect to the framework's
> underlying guts (the part that most framework implementers never
> touch) may be written as CFC's instead of procedural templates. In the
> final analysis, however, this distinction of the guts of the framework
> being written with Objects/OO or being written with procedural code
> makes not one iota of difference to you, unless you yourself are
> modifying the framework (i.e. creating a derivative framework) which
> is not something most people do.
> 
> > My very basic understanding is that you have different
> > 'layers' to perform different tasks, so when someone
> > visits mygroovyform.cfm the processing behind the form
> > is not done on the form page itself but passed to another
> > page which then passes back the results. The back end
> > processing is then done using components (cfc's).
> 
> Asside from the mention of CFCs at the end, this paragraph really
> doesn't describe OO, it describes Model-View-Controller (MVC) or
> something like it. I say asside from the mention of CFC's because it's
> not necessary to use them (or OO/Objects) to implement an MVC
> application. MVC is more like a "best practice" -- it's not a
> framework because it doesn't include any specific, pre-written code,
> it's merely a loose description of a good idea about how to abstract
> an application so that it will be easier to expand upon that
> application later. (Easier expansion is a benefit of having minimized
> any interdependancies between the Model (business logic) and the View
> (html, text, pdf, mobile devices, etc). The Controller is just a
> concept for an intermediary between these two layers which helps in
> the reduction of dependancies between them... I.e. it's sometimes
> easier to eliminate dependancies between the view and the model if
> they both assume that a 3rd entity (the controller) will ensure that
> communication between them is accurate. This way the view can simply
> assume that query-a exists, without needing to reference the model to
> retrieve it, and the model can simply assume that whatever data it's
> asked to provide will be appropriately used later on. Thus the
> controller then becomes primarily responsible for creating the end
> result by knowing that when the user requests the "orderDetail" page,
> it must fetch the query from the model and include the appropriate
> view.
> 
> > I know that's a very simplified explanation but hopefully
> > it's true in principle. I've written a few very simple
> > CFC's more for the sake of it than because I understood
> > the need. The main arguments I've heard for using this
> > approach is that it's good for code re-use and promotes
> > clean coding. But what I can't get my head around is why?
> > I mean, code isn't necessarily unclean because it's not
> > built using this approach and can't code just as easily
> > be reused using a cfmodule or even a cfinclude?
> 
> In some cases, yes, good clean code can be equally created using other
> techniques like cfmodule, cfinclude or by loading function libraries.
> In other cases, having "instance data" can really help to create more
> legible (i.e. cleaner) syntax and/or more modular/flexible tools.
> 
> Here's a good example:
> 
> I had a sql-abstraction layer in my framework. Had it for a while,
> originally written on CF5 (or at least written to support CF5).
> Started out with a series of custom tags (cfmodule):
> 
> <cfmodule template="#request.tapi.db.select()#"
> table="mytable" return="rs">
>    <cfmodule template="#request.tapi.db.filter()#"
>       column="x" content="#attributes.x#" />
>    <cfmodule template="#request.tapi.db.filter()#"
>       column="y" content="#attributes.y#" />
> </cfmodule>
> 
> Now this block of code would replace this query:
> 
> <cfquery name="rs" datasource="primary" username="..." password="...">
>    select * from mytable
>    where x = <cfqueryparam value="#attributes.x#"
> cfsqltype="cf_sql_integer">
>    and y = <cfqueryparam value="#attributes.y#"
> cfsqltype="cf_sql_integer">
> </cfquery>
> 
> Sorry for the line-wrap... anyway it's fairly obvious that there's no
> keystroke savings here, and in all honesty, the cfmodule tags make it
> a bit more complicated (harder to read), but I was willing to put up
> with that because where SQL is inconsistent across databases, these
> tags were consistent. Later I created some MX only functions to wrap
> around these tags and they looked like this:
> 
> <cfset rs = request.tapi.sql.select("mytable","*","",
>    request.tapi.sql.filter("x",attributes.x,
>       request.tapi.sql.filter("y",attributes.y,"","="),"="))>
> 
> And while this syntax saved me some keystrokes it wasn't any more
> legible. In fact it might have even been harder to read, since now you
> had to nest your filters in this quirky way (and filter and join
> statements had to be intermingled, and they were intermingled with the
> other arguments of the select function, etc.)
> 
> Finally when I decided to stop supporting CF5 I reinvented the SQL
> abstraction with objects. The addition of instance data makes the
> syntax _MUCH_ more legible and therefore much more maintainable:
> 
> <cfset statement = datasource.getStatement("select")>
> <cfset statement.filter("x",attributes.x).filter("y",attributes.y)>
> <cfset rs = statement.execute()>
> 
> Plus, this syntax does indeed make the SQL abstraction API more
> flexible. A couple of exmaples: I'm now able to reference
> statement.getSyntax() to return a string representation of the query
> without any duplicated code. Statements can have listeners which are
> notified when the statement is executed. In the case of select
> statements, these listeners can act as filters on the returned query,
> which as a result allows me to use a factory object to return a query
> that can be sorted on data which is _not_ stored in the database.
> 
> <cfset search = request.tap.memberFactory.getSearchStatement()>
> <cfset rsMember = search.sort("language").execute()>
> 
> Now, the names of languages is not stored in the database -- why?
> Because the names of languages vary -- French when written in French
> is Francais, German is Deutsch (yeah, I know, I'm butchering them, but
> you get the idea). So the names of languages are provided by Java
> instead of from the database. This means the database can't perform
> any sorting on the language column. But ColdFusion can! Now, within
> the page containing the code above that fetches the searchStatement
> from my factory it isn't necessary to know that the language names
> come from Java or that they won't be sorted by the databse -- it's
> only necessary to know that when you search.sort("language").execute()
> that the query result will be sorted by the content of that column
> just like it would for any other column. This eliminates any need on
> my part to provide extra sorting features which would be applied in
> the page, since I know the factory will provide this feature
> automatically. If I were still using custom tags or functions I would
> need to either write an extra sorting routine in the page, or I would
> need to write a separate wrapper tag / function for searching the
> member database. You might say that getSearchStatement() is a wrapper
> -- in a way it is, but it's much more flexible than wrappers written
> with cfmodule or functions (without instance data), since instead of
> wrapping the run-time feature (fetching the query) it only wraps the
> creation of an instance of a predefined class (a select object) and
> sets its parameters prior to execution.
> 
> > I've also heard it's good in a multi-developer
> > environment, but I'm only me so perhaps there
> > isn't a practical reason for me to learn it at all?
> 
> See above. :) I'm not saying you _will_ find a use for it, but once
> you have a deeper understanding of the fundamentals of OO/CFCs and
> "instance data" there's a good chance you might start to see new doors
> opened. I'm a strong believer in the "right tool for the job"
> philosophy.
> 
> > I've read a lot on the subject and I'd like to read more
> > but it's difficult to enthuse myself without understanding
> > what the real end benefit is.
> 
> > <scratches_head>Model glue, mach ii, fusebox, etc. I'm
> > sure there's a bloody good reason for 'em but what
> > is it?</scratches_head>
> 
> The reasons for these is very different from the reasons for OO
> actually... As I said, they're not really related. Mach-II and
> Model-Glue are referred to as "OO Frameworks" more because people have
> come to expect the term "OO" to be used to describe anything of value,
> whether it's related to OO or not. Mach-II (and possibly Model-Glue,
> I'm not sure) attempt to force the users to use CFCs for business
> logic. I don't personally find this to be especially helpful, not
> because I feel CFCs are a bad choice for model components / business
> logic, but because it's not more than organizing those components (via
> XML config) and in theory preventing bonehead noobs from making the
> "mistake" of not using CFCs for a particular task. Personally I find
> it much more valuable to focus on increasing the productivity of
> people who know what their doing (rather than focusing on trying to
> protect the code from inexperienced people) and I don't need XML to
> organize my CFCs.
> 
> I use CFCs a lot actually, I just don't like using XML to configure my
> applications, and generally find that even if I did want to use XML
> for configuration, the syntax for doing so with Fusebox, Mach-II and
> Model-Glue are all more verbose than I prefer. I'd much rather the
> framework make some basic assumptions (default values) the same way
> that the ColdFusion server saves me headaches by providing common
> default values with its tags. If the ColdFusion server were written
> the way that these frameworks have been written, there would probably
> not be a port default in the cfpop, cfmail, cfhttp or cfftp tags, and
> they'd describe it as a "feature" that makes the application easier to
> understand. :P
> 
> I won't say that the onTap framework is the easiest thing in the world
> to understand. It certainly reduces the amount of code I write (by
> orders of magnitude actually). But then I also don't market it as an
> "OO Framework" -- I market it as being OO agnostic (with gads and gads
> of code-reuse and general "make life easier" tools in its various
> API's). Use OO techniques if you want, skip them if you don't. Though
> some of its most impressive features/API's happen to be OO driven
> (SQL-Abstraction and the RuleManager facade, both of which I'll be
> speaking about at the cf.Objective conference this weekend).
> 
> 
> I'm not sure about books -- I'm sure others will recommend several.
> And I'm sure the phrase "gang of four" will be bandied about.  Whether
> that's a good thing or not I couldn't say. :) May not need anything
> that serious to start with... Wikipedia's got some good information
> about tech terms like MVC.
> 
> 
> s. isaac dealey     434.293.6201
> new epoch : isn't it time for a change?
> 
> add features without fixtures with
> the onTap open source framework
> 
> http://www.fusiontap.com
> http://coldfusion.sys-con.com/author/4806Dealey.htm
> 
> 
> 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:234355
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: 
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54

Reply via email to