我有两个课程,Class A
和Class B
。
我最近注意到他们共享了很多相同的代码。例如:
def viewable_by?(user)
super || clinic.has_staff_member?(user) || user.system_admin? || self.person == user.person
end
我想最小化类之间重复的代码。但是在重构中,我发现其中大部分内容并不完全适合于单一责任原则中完全属于一个类的一个类。我想把它全部放在一个模块中,但这些方法将与时间格式化,查看权限和其他一些事情有关。
在我看来,我有几个选择。 (我打赌你可以推荐其他人。)从面向对象的角度来看,我应该选择哪种方法?为什么?
修改
此问题之前曾提到Clinic::Appointment
和Clinic::Visit
类,而不是A和B.答案可能指的是约会和访问。
答案 0 :(得分:3)
这是一个很好的问题,因为它可以很好地处理项目的整体结构。我了解Appointment
和Visit
是分开的内容,Visit
不需要与Appointment
相关联。
对于授权方法,例如viewable_by?
,我建议将所有授权移到其他地方 - 您可能想要检查cancan结构,这对许多Rails项目都有效,并且很可能会工作适用于任何应用程序,甚至可以自行编写授权系统。部分地,我的答案是使用(3)
。
但是,由于并非所有由两个类共享的代码都是出于授权目的,我会尝试对一组方法进行分类,并为您能想到的每一类方法提供答案。对于具有类似行为的方法类,我会尝试封装在模块中并包含它(所以就像(1)
一样,但是在较小的部分)。例如,一个模块HasVisitors
使用got_on_time?
和was_conclusive?
等方法(好吧,也许不是最好的例子,但你得到它)。如果您的模型具有更广泛的范围,例如大多数课程中都存在Authorization
,那么现在是时候转到(3)
。
我建议你停下来再思考一下除了Visit
之外你应该有一个Appointment
课程和它的关系,但不是现在。到家后,玩得开心,从头上取下,然后第二天再思考。
答案 1 :(得分:0)
如果你转移职责,设计会更清楚吗?例如user.can_view?(资源)