DHHとのピンポン

http://www.dhh-ping-pong.com/

1 comment | 0 points | by WazanovaNews 3年以上前 edited


Jshiike 3年以上前 edited | ▲upvoteする | link

RailsでInteractorをうまく利用する」において、Grouperがブログで紹介したサンプルコードをDHHが批判して、「今回はサンプルコードが悪いだけだと言うなら、良いと思うサンプルコードを送ってほしい。」という発言をしていましたが、実際に原文では、

"Anyway, the invitation stands. Present any piece of real code and we can ping pong on it."

「ピンポンのようにやり取りする。」と表現しています。このコメントに呼応して、

http://www.dhh-ping-pong.com/

というサイトが立ち上がってます。3/23 (米国時間のあさって)までにサンプルコードを投げると、上位5つが選ばれて、実際にDHHからレスがもらえます。アーキテクチャ議論をしたい方は是非。

さて、前回取り上げたGrouperは今度は、Policiesについてブログで取り上げています。サンプルコードもあるので原文をご確認ください。主要なポイントとしては、

  • コードベースが複雑になってきて、ユーザのチケットで参加を希望するグループに入れるかどうかをチェックするロジックが複数のcontrollerに置かれるようになった。テストの際には、スタブすることになる。
  • mixinに移すか、ApplicationControllerでメソッドを定義しても、viewでは利用できない。ボタンやリンクをだす前にチケットを予約できるかどうかはチェックしたい。
  • ソリューションとしては、疎環境でテストでき、controllerやviewから安全に呼び出せるオブジェクトのメソッドにロジックを移す。ActiveRecordモデルにロジックをもっていく人が多いと思うが、この場合は、その手のパーミッション的メソッドではたくさんのモデルにアクセスしなくてはいけない結果となり、テストスイートのスピードが落ちる。
  • そこで共通の機能をPolicyという名称のgemにまとめた。

それに対してDHHは、

チケットが有効かどうか確認するのは、あきらかにdomain model concern。Policyオブジェクトは、取り替えることができて、複数のpolicyを扱うならばありだが、この場合は違う。… modelが肥大化するのもdomain modelを使ってないから。...

として、サンプルコードをつけて反論し、Martin FowlerによるActive Recordパターンの定義を引用しています。

"An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data"


ワザノバのGittipアカウントつくりました。ご協力お願いします! --> こちら


#rails

Back