Elmの内部実装は忘れてCounterサンプルに機能追加した

nekoroll.hatenablog.com

勢いで書いたこちらの続きとなっております

凄い人から回答もらえた

びっくりしました。ありがとうございます。
Elm界隈温かいなぁ…

何がよくなかったか

  • 深堀りしようとしすぎた
    PHPとかJavaとか触っていたせいでElmはどうなってるんだろう、なんでupdateが動くんだろう…
    と今覚える必要のない部分まで理解しようとしていた
  • The Elm Architectureを理解してない

という感じ。変なところに拘る自分の良くない癖が見つかった。
ABAB↑↓BAさん本当にありがとうございます。

f:id:nekorollykk:20200820005832j:plain

細部の事は忘れて実装を進めてみた

ellie-app.com

じゃじゃん!
+2するボタンと-2するボタンを追加してみた

内部は何も知らないけど(意図的に考えていない)以下の手順で実装できた

手順

  1. Msgに新たな動作(アクション?)を追加
    1. count+2するIncrementDouble
    2. count-2するDecrementDouble
  2. viewにボタンと動作を追加
    1. button onClick IncrementDouble+2するボタン
    2. button onClick DecrementDouble-2するボタン
  3. updateのパターンマッチに新たな動作を追加
    1. IncrementDoubleの時にcount+2する
    2. DecrementDoubleの時にcount-2する

なんということでしょう
内部実装を意識しないだけでこんな簡単に機能追加ができました

よかったところ

  1. 動作の名前間違えたら怒られた
    実は最初Increment_doubleって書いていて、PascalCaseが正しいことに後から気づいた 適当に直していたら修正漏れがあって、コンパイルの時点で怒ってくれた
  2. 脳みそ何も使わなかった
    Msgに追加して、viewに追加して、updateに追加して… で終わった
    AngularJS双方向バインディングで何もせずmodelviewbindされた時以上の楽さだった
    内部でよしなにやってくれていてありがたい。すごい。えらい プログラミング初心者に勧められる理由がわかった気がする
  3. やりたいことを直感的に書ける
    1. Msgに動作定義して
    2. updateに処理内容書いて
    3. viewに呼び出す箇所追加する

スコープが~とかファイル分割が~とか一切悩まなくていい
1ファイルに全部書けるのはホントに楽だしわかりやすい

まだわからないところ(これから学ぼう)

Msgにモリモリ追加していいのか

ものすごいファットなMsgが生まれる気がする
しかしMsgを分けたりするのは良くない!ってのも見た
関数型よく知らない人のelm入門 番外編 - 失敗した設計たち - プログラマ英語学習日記
オープンソースElmアプリケーション見てみて、どうしているのか学ぶのがよさそう

これホントに1ファイルに全部書いていいのか

開発する上でGitで管理すると思うけど、コンフリクト起きないのかな
1画面1ファイルだからそこまで問題ないのかな?
という気もするけどまだ未知の世界

1画面といっても色々機能があると思うけど全部1ファイルでいいのか

ヘッダー/フッターとか、トーストやらフローティングアイコンやら…
実際にやってから悩む予定だけど、今わからないので書き出しておく
(ちゃんと学習した 今知らなくていいことは知ろうとしない)

外部との通信

外部との通信はportというものを使うらしい
1個空けてやり取りするのか、はたまた1機能ごとに1個開けるのか
TODOアプリ作る場合CRUD4port使ったりするんだろうか

CSS

CSSはそのままviewHtmlの要素に書けそうだけど、
デザイン苦手なのでbootstrapとかbulmaとか組み込みたい
簡単に組み込めるのかな

まとめ

すごいシンプルに機能追加できて実装が楽で楽しい
何より型が厳密なので全部定義して、パズルみたいに組めるのが楽しい
jsあるあるな「実はundefinedでしたーwwwンゴゴゴwww」が無くなりそうで嬉しい

内部実装を気にしないだけでこんなに楽しく進められるとは思わなかった
本当に感謝 感謝感激雨あられ ゴイゴイスー