0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyブラックジャック開発:ソフトウェアエンジニアからのフィードバックと変更例

Last updated at Posted at 2023-05-07

はじめに

Rubyでオブジェクト指向の練習アウトプットとしてコンソール上で遊べるブラックジャックゲームを作成しました。
そのコードに対して現役ソフトウェアエンジニアの方からフィードバックを頂く機会があり、その内容を記事にしました。

概要

以下の点についてフィードバックを受けました。

  1. 紛らわしい命名は避ける
  2. 継承する場合は抽象クラスを用意する
  3. 実行ファイルの名前と内容について

紛らわしい命名は避ける

以下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

まとめ

継承についての言及もありましたが、全体的に
「直感的に読みやすいかどうか」 という一言にまとめられるようなフィードバックでした。

  • 非エンジニアにもわかりやすい命名を心掛ける
  • 実行ファイル名など通例が存在するものは踏襲する
  • 既成の概念と被る名前を別の意味合いで使うと混同してしまうので避ける

おわりに

最後まで読んでいただきありがとうございます。
私と同じ様な学習段階の方々にとって少しでも参考になれば幸いです。

内容に不備がありましたら遠慮なくご指摘いただけると嬉しいです。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?