はじめに
Rubyでオブジェクト指向の練習アウトプットとしてコンソール上で遊べるブラックジャックゲームを作成しました。
そのコードに対して現役ソフトウェアエンジニアの方からフィードバックを頂く機会があり、その内容を記事にしました。
概要
以下の点についてフィードバックを受けました。
- 紛らわしい命名は避ける
- 継承する場合は抽象クラスを用意する
- 実行ファイルの名前と内容について
紛らわしい命名は避ける
以下2点の指摘がありました。
- クラス名に
controller
という単語を入れるとMVCモデルを連想するので避ける -
loop
という単語は非エンジニアには一般的ではないので避ける
controllerについて
ゲームの進行を管理するクラスの名前をBlackjackController
にしたのですが、このController
がMVCモデルのコントローラーを連想してしまうという指摘を受けました。
今回MVCモデルを採用した訳ではないので紛らわしい命名となってしまいました。
変更例
Game
クラスとする。
loopについて
今回、ゲームの進行を管理するクラスに以下のメソッドを用意しました。
def loop_player_turn
# プレイヤーターン時の処理
end
def loop_dealer_turn
# ディーラーターン時の処理
end
こちらのメソッド名に含まれるloop
について指摘を受けました。
業務上コードを読む人間はエンジニアに限らず、非エンジニアの方もいる。
それなのでエンジニア目線で読みやすい命名ではなく、できるだけ非エンジニアの方にも読みやすい命名を心掛けた方が良いとのことでした。
※loop
が非エンジニアの方にとって一般的ではなく直感的に理解しにくいのでは?とのことでした。
変更例
player_turn
dealer_turn
とする
継承する場合は抽象クラスを用意する
今回作成したブラックジャックはディーラー(CPU)とプレイヤー(自分)の2人対戦の形式を取りました。
そこで
-
Player
クラス -
Dealer
クラス
の2つを用意し、Dealer
クラスにPlayer
クラスを継承させました。
この点について指摘を受けました。
- "is-a"の関係が成り立たないにも関わらず継承させた。
- 具象クラス間で継承させた。
これらの点がよくありませんでした。
変更例
Player
Dealer
の両クラスに共通する要素を抜き出して新たに抽象クラスを用意し、Player
Dealer
それぞれに継承する。
抽象クラスの名前候補として、Participant
Actor
GameMember
などが考えられる。
実行ファイルの名前と内容について
以下2点の指摘がありました。
- 実行ファイルは一般的には
main.rb
- 処理の流れを制約する(縛る)記述をする
実行ファイルの名前について
今回実行ファイルの名前をblackjack.rb
としていました。
この名前は問題があるわけではないが、一般的には main.rb
とした方がベターとのことでした。
処理の流れを制約する記述にする
実行ファイルのコードです。(修正前)
require_relative 'blackjack_controller'
game = BlackjackController.new
game.start
game.loop_player_turn
game.loop_dealer_turn
game.show_final_scores
game.show_result
game.finish
この記述だとメソッドの呼び出し順を簡単に入れ替えることができてしまい、それによってゲームが破綻してしまうとの指摘を受けました。
言い換えれば、処理の順番を制約できていないとのことでした。
変更例
実行ファイルでは、例えばplay
メソッドのみを呼び出し、ゲームの進行(順)については、game
クラスのplay
メソッド内に記述する。
require_relative 'game'
game = Game.new
game.play
まとめ
継承についての言及もありましたが、全体的に
「直感的に読みやすいかどうか」 という一言にまとめられるようなフィードバックでした。
- 非エンジニアにもわかりやすい命名を心掛ける
- 実行ファイル名など通例が存在するものは踏襲する
- 既成の概念と被る名前を別の意味合いで使うと混同してしまうので避ける
おわりに
最後まで読んでいただきありがとうございます。
私と同じ様な学習段階の方々にとって少しでも参考になれば幸いです。
内容に不備がありましたら遠慮なくご指摘いただけると嬉しいです。