パスワードを忘れた? アカウント作成
152809 story

Ruby on RailsのMVCは「えせMVC」? 37

ストーリー by hylom
結局は個々のスキルに依存するのよ、 部門より

pidgin 曰く、

ブログ「Life is beautiful」の記事「Ruby on Railsの「えせMVC」の弊害」が話題になっている。

記事では、「RailsのMVCは厳密にはMVCではなく、Controllerにビジネスロジックを書いてしまうため、データの整合性を損なう可能性がある」との主張がなされている。これは、O/RマッパーであるActiveRecordをModelと認識してしまい、Controllerにロジックを書いてしまうからではないかと推測されている。RailsではMVCをきちんと理解していないとこういった作り方になってしまうので、フレームワークとしては不完全なのではないか? とも書かれている。

追記やコメントでは、「RailsではActiveRecord::Baseを継承してモデルを作り、ここにビジネスロジックを書くので、きちんとMVCになっている。Railsの問題ではなく、使い方の問題では?」という話も出ており、ブログの次のエントリ 「O/Rマッピング技術の進化が皮肉にも助長している『えせMVC症候群』」では、Railsだけでなく他のフレームワークでも同じような問題があるとし、Railsだけの問題ではないということを警告している。

この件については、Seasar2の開発でも知られるひがやすを氏が反論を行っているので、興味を持たれた方はこちらもご一読を。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • どっちもどっち (スコア:3, 参考になる)

    by ttm (8278) on 2009年10月14日 19時59分 (#1653863)

    制約などを全部Modelに押し込むのも間違っているし、
    かといって全部Controllerに押し込むのはもっと間違っているでしょう。
    invariantな制約はModelに書いたほうがいいだろうし、
    入力時にチェックすべき項目はControllerに記述するべきだと思います。

    判で押したように、どっちか一方だけが正しいとすると、不幸な結果になると思います。
    よくあるオブジェクト指向論争と同じで、一方の極端で他方の極端を攻撃するのは無益です。

    • by Anonymous Coward

      そうそう。
      「いろいろ」ある処理をMとCどちらに属させるかは、処理ごとに「それぞれ」決めるべき事柄。
      つまり全部Mに集めたり全部Cに集めたりするのは愚か。

      >入力時にチェックすべき項目はControllerに記述

      いや、それすら状況によって色々振ったほうがいいと思う。
      「入力時にチェックすべきinvariantな制約」とか、色々な組み合わせが有り得るわけだから。

      そもそもMかCかという二者択一を迫ることが間違っている。
      きっぱり分けることが常に良い結果をもたらす保証すら、無い。
      分けたほうがハマリが良い場合、そうでない場合、色々あるというだけのこと。

      パイプ

      • by Anonymous Coward

        > どんな問題もMVCというハンマーで叩きたがるお子様たちだ。

        きっと、ハンマーで叩きたがる勇者の影響なんですよ。

    • by Anonymous Coward
      そうかなぁ?

      議論のポイントは似非MVCだからMVCでは無い、
      勘違いするなという指摘に対して

      やりようが有るってのは何の答えにもなってないと思う。


      パンがなければケーキを食べれば良いじゃない
      と指摘するのは技術者じゃねーなって思う。

      うんMVCじゃないけど使えるよ、ケーキなら有るよ
      と言って始めて成り立つ反論なのに
      そこを言わないのは誠実さに欠けてると思う
  • by nionio (37211) on 2009年10月14日 23時09分 (#1653994)

    と未だに思っているおっさんが通りますよ。まだ20代ですが。

    ちなみに原典っぽいものを調べたいときは、(SmalltalkのMVCは資料探すのが一手間なので(苦笑)) ブッシュマンの「ソフトウェアアーキテクチャ—ソフトウェア開発のためのパターン体系」をお奨めします。いわゆるPoSA本というやつです。著名な汎用アーキテクチャパターンは大体載ってますので、ソフトウェアの大規模構造をざっくりとさらいたい場合は買ってもあまり損は無いかなぁと。

    あとは、J2EEパターンとかPofEAAとかセキュリティパターンとか、ドメイン特化型のを業務に応じて見ていくとスムースに引き出しを増やせるのではないかと。まぁパターン全般として濫用に注意ってのは常に心しておいた方がいいですがw

    • by Anonymous Coward

      >WebのMVCをMVCと呼ぶの自体嫌だなあ
      それわかる気がする。
      Web系のスクリプト系言語でのMVCってなんちゃってMVCな気がする。

      •  dodongaです。

          MVCもHttpもCGIも理解していない設計者で状態遷移図も画面遷移図も区別付かない人は
         Webの感覚でまとめて設計してくれます;;。

         しかも、そのCGIをC++で書けとくる("素"の。移植性とか言われたw)。

          営業でC++で工数稼げるのはわかるのですけどねw画面遷移をどうするのよ;;
         自宅残業でPerlで書いたら2日でできました;

        #確か、これの工数は2人月でしたw
        --
        閑話休題
        親コメント
      • by Anonymous Coward

        >スクリプト系言語

        スクリプト系でも、出来の良い言語なら、問題なくフルセットのMVCがやれるよ。
        本家のSmalltalkなんて(良い意味で)スクリプト言語だろ。

        「Web」でMVCは、出来ないでもないんだが、
        今流行っているRailsとかStrutsのようなCGIの延長線のシクミを剥き出しで使う奴では、
        MVCは遠いね。

  • by 21 (23614) on 2009年10月14日 19時59分 (#1653864)

    MVCすらモジュール扱いなZend Frameworkを使ってますが、
    データのCRUDを実行するロジックは、
    気が付けば自然と XxxModel.php に集まってます。
    データを引っ張り出したり、更新したりする際は、
    XxxModelに処理を頼み、エラー制御するだけ。
    コントローラーというかアクションからは触らない。

    でも新人さんに頼むと、アクションでトランザクション書いたりします。
    ほとんどの処理がアクションやそのコントローラーのメソッドにあり、
    結局単一のファイルで書いているのと大差ありません。

    うちは今のところ、MVCを掴ませたい時は、
    MとVとCと、それぞれ別の人間に割り当てて、デモのシステムを組ませてます。
    喧嘩したり、似た処理がMVCのどれにもあって悩んだりしますが、
    次第に分業の楽しさが分かってくるようです。

  • by Anonymous Coward on 2009年10月14日 17時42分 (#1653758)

    「オブジェクト指向言語もオブジェクト指向を理解してない人が使うと・・・」
    と同じ話でしょう。

    • by Anonymous Coward

      汎用的な話だからこそ、fool-proofのためにガチガチに自由度の少ないフレームワークがもてはやされているのでは?
      だから、「あれ?Railsはそうじゃなかったの?foolには弱いの?」って話だよね。

      • by Anonymous Coward
        むしろいままでのFWがガッチガチすぎて覚えることが多すぎてやってられんから 簡単な操作でサクっと作れるRailsが流行ったと認識してるんだが ちがうのかな?
        • by Anonymous Coward

          たぶん読み間違えてる

        • by Anonymous Coward

          むしろRailsの方がガッチガチだし覚える事多いよ、触った事ないでしょ
          その規約に従う事でメリットが生まれるものだもの

      • by Anonymous Coward
        違うぞ、fool-proofだからこそバカを発見しやすくなるんじゃないか<違うか…
    • by Anonymous Coward
      ただオブジェクト指向設計なりプログラミングなりは名著があるけど、MVCにはそれを解説した決定版みたいな本が無いのよね
      当然オブジェクト指向なんとかよりオレオレMVCが蔓延りやすくなってしまう
      • by Anonymous Coward
        おいら的には、平成元年に読んで感動したよ。
        http://www.jac-net.com/~tarzan/smalltalkers/mvc/mvc.html
        このリンク先がオリジナルかどうかは知らんけど、オリジナルの著者は青木淳さんです。
        • by ikotom (20155) on 2009年10月15日 2時44分 (#1654090)

          かつて、リンク先以外のどこかで、リンク先とたぶん同じ文章を読んだ者です。
          # 遠い昔のことなのでうろ覚え
          当時、確かに感動もしたけど、余計混乱した覚えがあります。

          MVCがSmalltalkの世界で「育ってきた」もので、
          それ故Model, View, Controlerそれぞれの役割や定義は時代によって変遷している、
          というのはよく理解できたんですが、
          それからさらに時代も移り、Smalltalk以外の言語にも盛んに輸出され、
          開発論も日々進化し続けている「現時点」においての、
          これが真のMVCと言える「厳密」な定義ってのは結局なんなんだろう、と。

          何がエセかっていうのも、まずはそっちを先に決めてからじゃないと意味ないと思う。
          もちろん、SmalltalkのMVCを原典として、それ以外認めない原理主義でもいいんだけど、
          その場合どうしても時代遅れな部分を内包せざるをえなくなってしまうよね。

          ・・・誰か決めてくれないものかな?

          親コメント
          • by Anonymous Coward
            SmalltalkのMVCが内包する時代遅れな部分って例えばどんなことがあるんでしょうか?
          • by Anonymous Coward
            決めなきゃいけないものなのかね?DBの正規化の話と一緒で、原理原則にばかりこだわってると、現実世界の課題を(スマートに)解決する、という本題を見失ってしまう気がする。
            • by Anonymous Coward

              ん?でも「RDBの正規化とは何をすることか」は厳密に決められるし決まっているでしょ。

              MVCは(数学的論拠が無いので)そこまで厳密にする必要はないにせよ、多少は厳密なコトバの定義があってもいいんじゃない?

              定義したうえで、それを使うかどうかは各自の自由だ。
              RDBだって「正規化しない自由」が有るだけのことで、「正規化じゃないものを正規化と呼ぶ」のはただの半可通だ。

          • by Anonymous Coward

            >開発論も日々進化し続けている「現時点」においての、

            進化なんかしてねえよ。
            あきらめの境地に入っただけさ。退化だな。

            だからこそMVCもエセな廉価版になったし、
            その他もろもろ、いずれもとてもじゃないが硬派と呼べないような「開発論」が横行する。

            結局これは「クラッカーをハッカーと呼んでいいのかどうか」って問題と同じだ。
            いきがったクラッカーはハッカーを自称する。
            周囲の連中は面白おかしいほうに迎合して呼称を選ぶ。
            結果として悪貨は良貨を駆逐する。
            そういうことだ。

            #スラドでOOP談義が盛り上がらない、という時点で既にITアレゲサイトとしてはヤバイんだがね。
            #かといって「こ

            • by Anonymous Coward
              > 結局これは「クラッカーをハッカーと呼んでいいのかどうか」って問題と同じだ。
              > いきがったクラッカーはハッカーを自称する。
              > 周囲の連中は面白おかしいほうに迎合して呼称を選ぶ。
              > 結果として悪貨は良貨を駆逐する。

              「クラッカーはハッカーじゃない!」と騒いでいたのは半可通やワナビーだけですね。(遠藤淑子のマンガにすら出てきた!)
              本物のハッカーは黙々とハックしていたよ。多分どっちでもいいやと思っていたんだろう。
              • by Anonymous Coward

                フリーソフトウェアはオープンソースソフトウェアではない、とかいってた人は…(wwww

  • by Anonymous Coward on 2009年10月14日 17時43分 (#1653761)
    Railsなんてしょせんデッチアゲ用ツールだし
  • by Anonymous Coward on 2009年10月14日 18時14分 (#1653785)

    Grails

  • by Anonymous Coward on 2009年10月14日 21時13分 (#1653907)

    MVCなんて所詮素人にプログラム書かせるための方便でしかないので
    どこに何があるか説明できりゃ、どこに何書いてもいいと思いますよ。

    保守性?保守性に金だしてくれるならちゃんとやるけどね?

    • by Anonymous Coward
      >保守性?保守性に金だしてくれるならちゃんとやるけどね?
      "保守"にお金を出してくれないから、"保守性"を上げておくんじゃないの?
  • by Anonymous Coward on 2009年10月14日 23時23分 (#1654007)

    テストがどうとかモデルのFatさがどうとか、という話は、元来「それがMVCかどうか」とは直交な問題です。

    にも関わらず、まるでこの議論が「ほんとのMVCは何か」について語ってるかのように書いてる。

    非常にきもちわるい。両者とも。

    ちなみに本物のMVCについては別の人がコメントしてるね。
    それは、Smalltalkとか、とにかく全然違う方角に存在しているわけで。

  • by Anonymous Coward on 2009年10月14日 23時35分 (#1654014)

    (もちろん片方の意見でしかないが)これを参照しなかったら負けでしょう。

    Martin Fowler's Bliki in Japanese - ドメインモデル貧血症 [capsctrl.que.jp]

  • by Anonymous Coward on 2009年10月15日 1時31分 (#1654072)
    RDBMSにやらせたほうがいいことはそっちにやらせるって前提を無視して
    なんでもO/Rマッパーやアプリケーションフレームワークの世界で
    解決しようと思ってる…もしくはそう取られかねない話題だから
    無駄に話がややこしくなってるんじゃね
    • by Anonymous Coward

      違うと思います。別に永続化の手段としてRDBMSは使わなくても全然問題ないです。
      まー、手軽だから大抵の実装ではRDMSを使っていますけど。

      そうではなくてもう一段抽象レベルが上のO/Rマッパーをモデルと呼んでいいのかどうかという話です。
      O/Rマッパーそれ自体はモデルではなく、もう一段抽象レベルを上げたものにしようよ派と、
      別にO/Rマッパーレベルでもモデルでいいじゃん派の争いです。
      他にも派閥がいますが、大別するとそんな感じになります。

      • by Anonymous Coward

        手軽だからっつーか、それなりの規模なら性能的にも他の選択肢ないと思うけど。

        テーブル=モデルって単位だと色々やりにくそうに見えるなぁ。
        RDBMS的な都合とプログラムの都合は微妙に一致しないし、DB側に概念単位を
        あわせてやる必要なないと思うが。

        • by Anonymous Coward

          >他の選択肢ない

          その性能上の問題と、それを「MVCのMと呼ぶべき」かどうかって問題とは、全然別。

          >テーブル=モデルって単位だと色々やりにくそう

          そりゃそうだ。

          DBのほうが得てして「データの再利用性」をより深刻に考える必要が有るので、
          より安全側、つまりより厳格に細かく分割するほうが、似合っている。
          いっぽうアプリ側はアプリにとってちょうどいい粒度に落とすのが幸せ。

          結局、RDBの「いくつかの」テーブルをJOINしたようなものを、1つのOOP側のオブジェクト(モデル)にするのが一番収まりがいい。

          なに?JOINが(検索も更新も)面倒?
          それこそそういうのをラップしてください>ORM

  • by Anonymous Coward on 2009年10月15日 18時27分 (#1654550)
    「MVC」とか言って議論してるのが悪い。
    言いたければ「MVCパターン」と言え。
    「MVCパターン」なら、定義があるし共通理解もある。

    MVCパターンはGoFのパターンの前からある、あるいは「デザインパターン」という概念を発想するヒントとなった、デザインパターンの大御所。誤解も無くあいまいさも無い。それ以外の意味は無い。

    WebアプリケーションアーキテクチャのMVC2というのは、ModelとViewとControllerが出てくるけど、デザインパターンとしてのMVCとは明らかに違う。

    Vistorという名前のついたクラスが出てくるからといってVisitorパターンと呼べないのと同様に、クラス間の役割と関係性、相互作用のステップ、目的を含めて「MVCパターン」と呼ぶのだ。

    これは本来、それだけの話であって、ロジックのおき場所とか整合性保証とか、本来は別件で、議論になる必要すらもない。

    時代の流れとして、あるいは慣用として、MVCといってしまうことはしょうがない、のかもしれない。言葉は生き物だから。特許も商標もあるわけではないし。ただ、それでたまに新参者の誤解を招いてフレームになったりする。

    Webアプリとかのアレはとりたてて「MVC」とかとは呼ばずに(あえて呼ぶときは「MVC2」と言う)、「モデルとビューとコントローラがある」と認知するだけで良いのじゃないかね。
  • by Anonymous Coward on 2009年11月23日 17時06分 (#1676956)

    Taligentに組み込まれた、MVP(or passive view,supervising controller)というのもありますよ。
    event駆動と相性がよいので、WebだとGWTとかASPとかで使われているようです。
    http://en.wikipedia.org/wiki/Model-view-presenter [wikipedia.org]

    あまり話題になってませんが、T.ReenskaugとJ.O.Coplienさんで
    DCI Architectureという、MVCの後継というか柔軟な構成法を考案されてるようですよ。
    http://www.artima.com/articles/dci_vision.html [artima.com]
    書籍の草稿もあるようです。実際使わない場合でも、最近の開発手法を
    いろいろ組み合わせているので、なにを知らないかをチェックするためにも役立ちます。

typodupeerror

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

読み込み中...