On Sep 27, 2008, at 9:17 am, Matt Wynne wrote:
I wouldn't call this the 'rails way' particularly - I think it's
more of a general OO design philosophy that says the database is
just an implementation detail. I have gradually moved, over the
years, from feeling like the database needed to be the foundation of
my whole domain (and therefore have tight integrity rules etc) to
wishing it would just go away and stop bothering me. I like the way
ORMs let me work in code most of my day rather than having to drop
into the database to find out what the rules are.
Matt,
I agree with you - to am extent. The thing is, with a full suite of
stories (that work through the public interface) your *entire app* is
an implementation detail.
<aside type="anecdote">
The other day I was going over some example code with a client. I
prepared it for a user stories + Cucumber + Celerity talk/workshop,
although I don't think I'll need it now. It was a crude one-
controller CRUD (well CR, anyway) app written in Ramaze, for
simplicity. The plan was to build a fuller Merb app to build on
later. The only reason I was going to switch to Merb was because this
client is considering it, and was more than happy when I suggested
doing some research on it on my time. But I knew this could raise the
issue "the first one was a prototype, and Ramaze is a prototyping
framework". Even more so because the data store was this:
class EventsController < Ramaze::Controller
EVENTS = [ ]
# ...
def create
EVENTS << request[:event_name]
end
end
Which led us on to a discussion about what exactly *is* a prototype,
and what is a primitive production app. (I've had to pull the slides
for this, I think it'd be a talk on itself.) So I said, "Hmmmmmmm,
how long *would* it take to port to Merb?" Not wanting to let our
coffee go cold, I set to it... and 10 mins later, five of which was
faffing around working out the differences between Ramaze and Merb
controllers, it was running. Indeed, Cucumber told us so before I
loaded the page in a browser, as it implemented this:
Feature: Event creation
So that Potential Delegates know an Event is happening
As an Organiser
I want to create Events
# ...
Scenario: Multiple event creation
GivenScenario Successful Event creation
Given I am on the Event creation page
When I submit valid Event details for event 'My Second Event'
Then the Events index page should show 'List of events'
And it should show 'My Second Event'
And it should show 'My First Event'
And it should not show 'No events, please come back later'
Eventually my client decided that, on the basis that I evolved the
code rather than throwing it away and re-writing it, that it was
actually a primitive production app. And it stores the data in an
array in the controller. More surprisingly, he decided that - on the
basis it has no runnable specs - his own 2-year-old app serving
several clients is a prototype!
</aside>
So anyway, my point is, if you disparage the database on the premise
it's an implementation detail, you should apply equally little concern
to every other part of the app.
The reality I've found is that you find uses and insight in data long
after you initially decided how to model it - possibly long after you
stopped maintaining your app. And I've been in the situation of
having to unravel garbage and data corruption because someone didn't
enforce DB integrity.
I think every component of an app should receive the same attention to
quality. It's impossible to know where an edge case will sneak past
and bite you, so you have to cover as much as possible.
(Sorry if that was even rantier than usual - but I have a thing for
data quality!!!)
Ashley
--
http://www.patchspace.co.uk/
http://aviewfromafar.net/
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users