When did Ruby’s “beautiful, readable code” mantra take such a shitty turn? Or has it always been this bad and I just never noticed back in my “OMFG I LOVE RUBY” days?
It’s apparently poor practice (at least in many circles) to use “@” in front of instance variables.
This is supposedly bad:
class GoodbyeWorld def initialize(n) @name = n end def helpme # Using the instance var "@name", sir puts format("kill me now, %s!", @name) end end
You should expose methods instead of accessing vars directly. So this is better:
class GoodbyeWorld attr_reader :name def initialize(n) @name = n end def helpme # Oh, sorry, I'll stop using @name - using a function call instead, sir puts format("kill me now, %s!", self.name()) end end
Okay, I can see an argument for that. If we want name
to return something less static, we’re now certain all calls will go through whatever logic we have if we decide to define name
as some kind of custom method.
But then it’s also poor practice to prefix instance methods with “self”. And … it’s poor practice to call a method with parens unless they’re absolutely necessary. So this is the best way to do it:
class GoodbyeWorld attr_reader :name def initialize(n) @name = n end def helpme # Oh, sorry, too many parens and explicit use of "self". Fixed, sir. puts format "kill me now, %s!", name end end
In a 10-line example, no big deal (though I’d still call it garbage). But when you have a ton of code with modules being mixed, global scope being polluted by various includes, and an app written by multiple people who generally suck at programming (i.e., any given group of software developers), you end up with methods filled with identifiers you can’t easily track down. Are they variables or function calls? Are they part of this class? Something mixed in? Something from a parent class? Some global thing defined somewhere else? No fucking idea.
If you ever wonder why I would rather write 3x as much code in Go, this right here is one of the biggest reasons. I can look at Go code I haven’t seen in months or even a couple years, and tell at a glance all these little details. Scope is very well-defined. The program’s logic may be garbage, and following functions and types around can be a massive pain in the ass, but there is no time spent trying to figure out the origins of every fucking identifier.