-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

11 / 30
Sat

Ziphil です。

プレイヤーをキー入力にしたがって移動させる処理なんですが、 こんな感じのコードになってます。

private fun movePlayer(): Unit {
  when (_pressedKeyCode) {
    VK_DOWN -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), DOWN)) {
        _player.moveInDirection(DOWN)
      }
    }
    VK_RIGHT -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), RIGHT)) {
        _player.moveInDirection(RIGHT)
      }
    }
    VK_LEFT -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), LEFT)) {
        _player.moveInDirection(LEFT)
      }
    }
    VK_UP -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), UP)) {
        _player.moveInDirection(UP)
      }
    }
    else -> {}
  }
}

関数それぞれの説明は省略するとして、 似たようなコードが 4 つ連なってますよね。 私個人の感想ですが、 こういうコードは好きじゃないです。

コードを書く際の注意事項の 1 つに DRY (Don't Repeat Yourself)、 つまり 「同じコードを 2 回書くな」 というものがあります。 同じコードが別々の位置に 2 つあると、 片方を修正するときにもう片方も修正しないといけないので、 非常に不便です。 というわけで、 私もこれに則って、 同じコードを 2 ヶ所に書かないようにしています。

さて、 最初のコードですが、 同じではないにしても似ているコードが 4 つあります。 できれば、 可読性を維持しつつ 1 つにまとめたいのです。 可読性を無視すれば、 こんなコードにすることもできます。

private fun movePlayer(): Unit {
  val keys: List<Int> = listOf(VK_DOWN, VK_RIGHT, VK_LEFT, VK_UP)
  val directions: List<Int> = listOf(DOWN, RIGHT, LEFT, UP)
  for (i: Int in keys.indices()) {
    if (_pressedKeyCode == keys[i] && _map.canMoveInDirection(_player.getX(), _player.getY(), directions[i])) {
      _player.moveInDirection(directions[i])
    }
  }
}

重複部分がなくなり、 短くなりましたね。 しかし、 パッと見で何の処理してるかよく分からず、 良いコードとは言えません。 ・・・難しいんです。

ちなみに、 せっかく Kotlin 使ってるのに、 そこら中に変数のクラスが明記されてるのは、 私の趣味です。 いや、 型が書いてないと落ち着かなくて・・・。 長いこと Ruby 使いだった人が何言ってんだって話ですが。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。