When I set out to create my presentation for RubyConf, I wanted to provide the audience with something they could easily try. By doing that, one could walk away and put themselves in a position to think about their code differently. While, James Ladd, the creator of East-oriented Code made some basic rules, I decide to take them and frame it in the specific context of Ruby:
- Always return self
- Objects may query themselves
- Factories are exempt
- Break the rules sparingly
After writing about Rule 1 and Rule 2 I'm very eager to get to Rule 3. It's an easy way to break the intent of this style without breaking the rules.
Factories are Exempt
They must be. If you returned self
from Object.new
you'd just get Object
back, not an instance of an object. So factories are exempt from returning self
.
The best way to get around any of these rules is to just make something into a factory. But here lies the danger. It's important to first think about what these objects are doing. For what are they responsible?
We could create a class to sweep our messy code under the rug.
user = User.new
signup = UserSignupProcess.new
signup.create_with(user)
The code above, we could say, is East-oriented. The factories create instances, and the signup
object is told to create_with
and given the user
object.
Beyond this (inside create_with
), it could easily be an enormous mess. While we can and probably should use different programming techniques for different situations, taking a load of if
statements and sweeping it into a class could still be problematic.
Now, the sample code above is completely made up to show how you can take part of your program and say "this part is East-oriented, but over here I used this other technique. I call it If-oriented."
Examining your domain and creating a program to support it requires that you carefully evaluate what objects should exist, what their responsibilities are, and what you will name them.
East-orientation is all about designating responsibilities.
This leads us to breaking the rules...
We'll be getting to that later. There's likely very good reasons to break any particular programming rule, but it probably depends on the context.
I wrote Clean Ruby and the chapter on East-oriented Code before I set up the 4 rules for my presentation, but the same lessons are there. I'll be adding more to it, particularly as discussion and ideas around DCI evolve, but I'm putting effort toward wrapping up the Ruby DSL Handbook. It will soon be complete and the $12 price will go up to $24, so pick it up now if you're interested.
Ruby DSL Handbook is about how to create a DSL without headaches from metaprogramming and I just released an update with a chapter about creating a DSL without metaprogramming at all. Much like this discussion today, it's all about managing responsibilities.