我已经使用Rails超过4年了,所以很明显我喜欢Rails并喜欢Rails Way的做法,有时我会在不知不觉中陷入黑暗的一面.
我最近选择了鲍勃叔叔的清洁代码.我在第6章,有点困惑我们是否作为铁轨开发人员打破了OO设计的基本规则,即Demeter法则或封装?Demeter法则指出一个对象不应该知道另一个对象的内部,它不应该调用方法返回的对象上的方法,因为当你这样做时,它会建议一个对象对另一个对象有太多的了解.
但是我们经常从模型中调用另一个对象的方法.例如,当我们有一个像'一个订单属于一个用户'的关系时.然后我们经常最后做order.user.name或者为了防止它看起来像火车残骸,我们设置了一个委托来做order.name.
这还不像打破得墨忒耳法或封装法吗?
另一个问题是:ActiveRecord只是一个与数据库接口的数据结构或数据传输对象吗?
如果是,那么我们不是通过将我们的业务规则放在ActiveRecord模型中来创建混合结构,即半对象和半数据结构吗?
有没有更优雅的方式在ruby中执行此逻辑
a = nil #=> obviously 'a' can have value but I am just setting it nil to make the eg more clear
b = a
unless b
b = "value"
end
Run Code Online (Sandbox Code Playgroud)
这样我们最终得到b的值.我们可以像上面那样使用上述代码的另一种变体
a = nil
b = a
b ||= "value"
Run Code Online (Sandbox Code Playgroud)
我也可以使用三元语句来编写上面的代码
b = a ? a : "value"
Run Code Online (Sandbox Code Playgroud)
但如果你用一长串代码替换变量a和"value",那么这个三元语句也将开始看起来很难看.
上述逻辑可以以某种方式变得更优雅/更具表现力,还是仅限于上述解决方案?