クリトラのコツコツITログ

3Dの皮をかぶった庶民の技術ブログです

Playで簡単な画面表示とvalとdefの動きを比較

本日の配信


Scala-Play ハンズオン作成part9 ~ CRUD(dbなし)のサンプル作ろうの巻 ~

今日はPlayで1枚のページを表示するところまでの資料を作成しました
実装だけに集中すればCRUD全部はすぐにできると思うのですが、人に説明するためにコードを読んだり、markdownを書いているとすぐに時間がすぎてしまいますね!

次で配信も10回目になるみたいです。
早いような、遅いような。思ったよりも続けているなぁという印象です。

本日の進捗と残タスク

進捗

  • list表示の基本骨子作成
  • Controllerの簡単な説明記載

Commit Log

残タスク

  • モデルの作成
  • 一覧表示
  • Twirlのもう少し詳細な説明(悩み中)

Twirlは一旦メインコンテンツ部分だけで突き進んで、デザインを当てる時とかにlayoutを説明するのが良いかもしれないなと思っています。
その場合Twirlの説明はもうちょっと後になりそうですね。

本日の反省

  • 作業に集中する前の前半がグダグダしてしまう

IDEAの起動が遅かったり、何かとグダグダしちゃう前半。
ある程度仕方ないかなと思ってますが、改善できるならしたいですね。

おまけ

f:id:christina_triceps:20200221012056p:plain

あくまでScala側での動きだけになりますが、この動作が少しわかりづらくもありつつ、面白いです。
def a: Long に対してval a = 1L が置き換えできているんですねぇ。

置き換えという言葉が言語しようとして正しいかどうかは正直わからないのですが、利用している側としてはそのような感覚になります。

もうちょっと細かくみてみたいので、以下のscalaファイルをjavaに変換をかけてみました。

// scala
class A (){
  val a = 1L
  def b = 1L
}
// java
import scala.reflect.ScalaSignature;

public class A {
  private final long a = 1L;
  
  public long a() {
    return this.a;
  }
  
  public long b() {
    return 1L;
  }
}

valの方がprivate finalなフィールドを持っている以外は同じですね。 setterもなくfinalなのでgetterで値を取得できるだけの変数になっており、getterも変数名と一致しています。
これだと引数なしのでdefで定義したbと同じで、ただ1を返すだけのメソッドと機能的には同じです。

scalaコンパイルするにあたってどう判断しているかまではわかりませんが、val adef aはコード上では同様にA.a()と呼び出されるという使い方以外はされないので、置き換えができるのでしょうね。
だから何?と言われてしまうとそれまでなのですが、面白いですね。

ただこの辺り意図的に使い分けられているのか、無差別に書かれているのかまで判断できていません。
呼び出し時のオーバーヘッドやメモリの効率などに微妙に違いがあるのでしょうか?

まだまだ完全解決とまではいきそうになりません。
しかし一つお利口になった気持ちにはなれました。

まとめ

ハンズオンの方はやっぱり作るのが大変ですが、副産物として自分の勉強も行えているので良い傾向なのかなと思います。
引き続きコツコツがんばりたいです