放課後

id:hakobe932 とこんな話をした.

   view     |      |         |
     ^    <===========       |
-----|------|      |         |
     v      |      |         |
 controller | popo | mapper <=> strage
     ^      |      |         |
-----|------|      |         |
     v    <==========>       |
   model    |      |         |

その後, 浅野さん宅に行って NHK の某番組を見て, アニメ見て, ゲームしてるの見て帰った. 浅野さんがテレビ見ながら悶えてるの動画にしたので欲しい人がいたら適当にシェアします. 怒られたらやめます. 怒られそうなのでやめます.

最近の傾向

覚えること最小限にするか依存性を最小限にするかってのは相反するのか, というのが目下の悩みであります. 嘘です. 可読性と抽象度とか.

  • namespace を汚さないこと第一
    • 物事はきれいに
  • 責任を明確に
    • モジュールごとに仕事を分け, それぞれ多くの仕事を担当しないよう
    • 越権行為はしない
  • 明示的に
    • 暗黙的に行なわれることでよいことは殆どない
  • 80桁
    • 基本的には守りたい
    • リテラル長いとか揃えたいものがあるとか周辺状況によっては破る
    • 横1920のモニタで縦3分割できれいに入る
  • 安全のうちに省略可能なことは省略する
    • 危険なものを除く
    • 意味論変わるなら適宜つけたりつけなかったり
    • return とか () とか
  • プロジェクト単位でイニシエーションする
    • -include みたいなの
    • 言語デフォルトでは足りないこと, みたいのはあるものなので全体でやりたいことは毎回やるのを忘れないようにする, ではなく最初からデフォルト設定でそうなるように
      • 怠惰であれ

私の Web MVC 観

よくある Web Application Framework における MVC っていうのずっと違和感あったんだけど, 私なりの落とし所見つけた感あるのでさらっと書いておく. とくに意味はない.

よくある WAF の MVC

Model
データのやり取りやロジック部分を担当する。オブジェクト層やサービス層に分類することも出来る。
Controller
ユーザからのリクエストを受け取り、リクエストをハンドリングしたり、Modelをいくつか利用して処理を行う。またその時作成したデータをViewに受け渡す。
View
Controllerから受け取ったデータから、実際の表示の生成を行う。
http://d.hatena.ne.jp/shiba_yu36/20110303/1299123350

WAF における MVC というのは上記のような説明をされてきたわけです. 引用元ではさらに A ってのを導入してわけわからなさを増しているのですがここでは放置します.

MVC 再考

というわけで, 違和感あるので考え直しましょう.

Model は, まぁいいでしょう. データだったりそのデータの永続化を考えたり, そのデータのふるまいなんかを記述したりするところ. だいたいそんなところで問題ないと思います. どこまでをふるまいとするかはいろいろありそうで宗教戦争感あるのであまり触れたくないですね. Active Record パタン嫌いです.

Controller, こいつ何なんでしょうね. よくわからん存在です. よくわからないけれど, 上のと下のをつなぐものらしいです.

View, 目に触れるもの感あります. Web の世界でいうなら HTML だとか JS だとか CSS だとか HTTP だとかその辺ですよね(←). あっここでいう WAF はサーバサイドですよ!

はい. つまり, View とは 実際の表示の生成を行う ものなんかではなく, ユーザとのインタラクションを行なうもの, なんじゃないのってことです. Web でいうなら HTTP から先は全部 View なんじゃないのってことです. Controller でルーティングとかするのおかしくないですか?ってことです.

Web じゃないところでの MVC では View は入力を受け取ったらほぼそのまま Controller にデリゲートしてたりするので Controller がいきなり ユーザからのリクエストを受け取 っているように見えます. ですが, Web では HTTP とその周辺いろいろによって Controller にとって使いやすいとは言い難い形で入力がきます. そんな複雑なものを Controller が面倒みてたらそりゃ破綻しますよね. そこまで View でやっていただいておいしいところを Controller が行なう, そういうのが MVC だと思います.

こういった考え方をコードに落とそうとすると, リンクとかフォームとかごとに HTML, JS, CSS と HTTP の扱いをひとまとめにしたコンポーネントをくっつけて遊べるような framework というかたちになるんだろうなぁ, と適当なことを考えたりしてます. 実際のところ デザインとかは別枠で必要みたいになると思うので, どうやって切り分けるのか想像もつかない感じだけれど考えるのはおもしろそう.

蛇足

なんか上のほうで放置するっていった MVAC とかいうのですが結局のところ, ここでいう Controller が A で, View が行き帰り別になって V と C になっている, というだけのものだと思います. View の行き帰りを分ける必要があるのかどうかはよく知りません.

以上, 開発の仕方どうするかみたいな話合い をそのうちするかも的な話があったような気がするので, 今 WAF とかそのへんについて考えてることを適当にダンプしてみた.

テンプレートのインデント

ref: http://r7kamura.hatenablog.com/entry/2011/12/13/201655

C: 別途インデントする

<ul>
<% @entries.each do |entry| %>
  <li><%= entry.body %></li>
<% end %>
</ul>

別のものが同一のインデントルールに従っていると頭おかしくなるので普通に別々にインデントすればよいと思っている. Text::Xslate の例になるけどこんな感じ.

: if $entries.size > 0 {
<ul>
:   for $entries -> $entry {
  <li><: $entry.body :></li>
:   }
</ul>
: }