質問: Ruby on Railsにおいて、ActiveRecord::Baseを拡張したクラスをモデルとしています。 MVCとして正しく実装しようとした場合、このモデルにビジネスロジックを含めることになります。 ActiveRecord::Baseは、あくまでO/Rマッピングを行うという責任がありますが、 ここにビジネスロジックを含めた場合、 「O/Rマッピングを行う」という責任と、MVCでのモデルとしての「ビジネスロジックを含める」という2つの責任が伴い、 オブジェクト指向の「単一責任の原則」に反したクラスとなりますでしょうか。
回答: 理論的にどうなのかははっきり答えを知らないのですが、これまでの経験で現場の人と話し合ったりしながらやってきた感じでは、以下の2つの考え方が多かったように思います。 1. あくまでもActive Record を DAO(Data Access Object) として使うのであれば、あるいはそのように捉えるのであれば、たしかにそれ以上のロジックを入れるべきではないと考えることはできる。(=別のビジネスロジックサービスクラスを作るべき) 2. いわゆる「ビジネスロジックモデル/オブジェクト」をActiveRecord で表現しようと考えると、ORマッピングの機能をActiveRecordが持っていたとしても実質的に何も悪さをしない(ように思える)ので、問題視しない、という考え方。 ORマッパーを HasAの関係で内包していれば割り切りやすいのでしょうが、実際にはActiveRecord::Base を継承している(= isA ) ので、そのあたりが設計的にどうなんだろう、という話もしたことがあります。 ご参考までに。。