A Handful of Code
In my last post about page controllers, Jason Holden asked on which pages I use page controllers. This is a great question and speaks to a larger issue of code organization that applies to CSS and JavaScript as well.
When I have JavaScript or CSS that is used on only one page, it doesn't make sense to put it in the .js or .css files that are called on every page of that site. Over time, that behavior would make those files unnecessarily large as well as making the code more difficult to find from the page.
If I have a sample-page.cfm, then I can either put the CSS into a <style> element on the page or in a sample-page.cfc. The same goes for JavaScript (or even controller logic).
I don't want to create an external file every time I need a single line of CSS or JavaScript, but neither do I want to have lines upon lines of non-content code in my file.
The balance that I have chosen to strike is 5 lines of code in my file. I will allow myself five lines of code that could otherwise be in an external file before I actually create one. This is an arbitrary guideline, but it helps me to have a built in rule to decide when to move code to an external file.
This applies to controller logic as well. I don't ever have queries in my .cfm files, but I do sometimes interact with model components. This is really controller behavior, but so long as I have fewer than five lines of it, I leave it in the file. If I have more than that, then I create a page controller.
I think this sort of guideline leads to code that is much easier to manage than a guideline that always insists on an external file (or one that never uses one).
This does not, however, justify breaking encapsulation for any number of lines.
I have been using this rule for about a year now and I have been really happy with it.
I think most of the things that you could put in a view but might go in a page controller rightly belong in the controller rather than the view (as JavaScript belongs in a .js file and CSS belongs in a .css file).
I don't think I would exactly call that an encapsulation issue though, perhaps more of an issue of separation of concerns.
The only reason I mentioned encapsulation is that I don't think the "Handful of code" rule should be used to justify breaking encapsulation. For example, I don't think it should be used to justify using shared-scope variables in a model component.