ぺんぎんメモ

プログラミングのメモです。たまに私生活のことや鬱っぽいことを書きます。

2021年8月31日の日記

今日は890円だった。

今日で今の会社に入社してから1年が経つ。
この1年は孤独だった。そしてこれからも孤独は続いていくと思う。
悲しい。

昨日からKotlinを勉強している。
最近の言語にふさわしく、様々なことができる。

代数的データ型は Sealed classes で実現可能。
パターンマッチは when で実現できる。
Nothing という面白い型もあって、この型をうまく使うことで型ガードを実現できる。
他にも、既存のクラスに外からメソッドを追加できたり、Java に現れる典型的な getXXX と setXXX とフィールド宣言をわずか1行で実装できたり、変数の値を出力するときに a.apply(::println) と書けたり、中置記法の関数を自作できたり、色々できる。

明日以降は実際にAndroidアプリを開発していこうと思う。
色々と疑問や不安な点がある。

  • Activity 同士のデータのやり取りは Intent を使うけれど、Intent でデータのやり取りを行うのは面倒ではないか
  • TextView のテキストなどを設定するとき、わざわざ .properties のようなファイルにテキストの内容を記載する必要があるか。たぶんテキストの内容をハードコーディングする方法があるはず。そうでないと動的に変化するテキストを定義できない
  • Android StudioGUI ツールを使って要素を弄るよりも、XML ファイルを直接弄るほうがフロントエンド開発に似ていて自分に合っている気がする。このような開発スタイルはバッドプラクティスではないか
  • スワイプ操作で要素を動かしたいときにどうするか
  • そもそも画面上の要素のことを「要素」と呼ぶことは合っているか
  • JavaScript では addEventListener の第一引数に文字列でイベント名を指定するが、Kotlin の場合は各イベントに対してメソッドが用意されているという認識で合っているか
  • android:id 属性はすべての要素にあるか?あると嬉しいのだけど…
  • スコープ関数 runBlocking のラムダ内にしか launchasync は書けない。「ボタンを押したときにローディングアニメーションを表示しながら非同期処理を行い、終了すればアニメーションを停止する」のようなよくある処理は、次のように書くのが正しいか
val btn = Button(this)
btn.setOnClickListener {
  runBlocking {
    ajax = true
    launch {
      delay(1000L) // ここに非同期処理を書く
    }
    ajax = false
  }
}
  • 上記のようなコードを書いたとき、短い間隔で同じボタンを2回クリックしたときに、2回目は1秒後に実行されるか、それとも即時実行されるか。おそらく即時実行され、ajax も全く同じ領域を指すと思うので、そうなると、ajaxfalse になるタイミングがおかしくなる気がする。「非同期処理中の処理の個数」を所持するメンバーを作成すると良さそう
  • というか、React に慣れすぎたのでこのあたりの実装が辛そう。UI の状態を変更するコードを書かなければならない。React のような優れたフレームワークはそう簡単に生まれるものではないから、Kotlin にはまだない気がする
  • そもそもHTTP通信のときに使用する非同期な関数はどのようなオブジェクトを返すか。つまり Promise や Future に相当するオブジェクトは何か

寝転びながらもう少し考えようと思う。

【22:57追記】

Code Runner素晴らしい。
VSCode 上での Kotlin の実行環境を簡単に整えられた。

第一級関数なので次のように書ける。けっこう盲点。

val f = fun () {}

次のようなコードが好き。

val sum = run {
  var sum = 0
  for (v in 1..100) sum += v
  sum
}