TicTacToeValidatorClassの実装

TicTacToeValidatorClassを実装します。

第一章の最後に不具合があることをお伝えしました。

その不具合に対して対応を入れていきます。

バリデーションって何

入力値が不適切でないかどうかを検証する"バリデーション"という処理があります

今回は、3目並べの入力値に対してバリデーションを組んでいきます。

tic_tac_toe_validator.rbの作成

3目並べ中に発生するバリデーションに関しては、tic_tac_toe_validator.rbに実装していきます。

# frozen_string_literal: true

require_relative "tic_tac_toe_input_error"
require_relative "const"

# 3目並べの入力地に対するバリデーションを実装するクラス
class TicTacToeValidator
  class << self
  end
end

tic_tac_toe_input_error.rbの作成

tic_tac_toe_validatorで利用するエラークラスを実装します。

# frozen_string_literal: true

# 3目並べの入力値に関するエラークラス
class TicTacToeInputError < StandardError; end

ユーザからの入力値に対するバリデーション

早速、tic_tac_toe_validatorにバリデーションを実装していきます。

現状、「a」とか「999」とか適当な数字や文字を入れられるので

それらを弾くためのバリデーションを実装してみましょう!

# 概要: ユーザからの入力値が適切かどうか
#       0~2以外の数字や文字の場合TicTacToeInputErrorをraiseする
# 引数: user_input_row: 行番号, user_input_col: 列番号
# 戻り値: なし
def validate_input_value!(user_input_row, user_input_col)
end

課題コーナー

TicTacToeInputErrorクラスをraiseするvalidate_input_value!を作成する

実装例

# 概要: ユーザからの入力値が適切かどうか
#       0~2以外の数字や文字の場合TicTacToeInputErrorをraiseする
# 引数: user_input_row: 行番号, user_input_col: 列番号
# 戻り値: なし
def validate_input_value!(user_input_row, user_input_col)
  raise TicTacToeInputError, "行番号の入力に誤りがあります" if user_input_row !~ /^[0-2]$/
  raise TicTacToeInputError, "列番号の入力に誤りがあります" if user_input_col !~ /^[0-2]$/
end

コマを上書きさせないためのバリデーション

現状、相手が置いたコマを自分で上書きできてしまいます。

それを防ぐバリデーションを実装しましょう!

# 概要: そのマスが既に埋まってないかどうかを検証する
#       埋まっていた場合TicTacToeInputErrorをraiseする
# 引数: board: 現在進行中のゲーム板, row: 行番号, col: 列番号
# 戻り値: なし
def validate_place!(board, row, col)
end

課題コーナー

TicTacToeInputErrorクラスをraiseするvalidate_place!を作成する

実装例

# 概要: そのマスが既に埋まってないかどうかを検証する
#       埋まっていた場合TicTacToeInputErrorをraiseする
# 引数: board: 現在進行中のゲーム板, row: 行番号, col: 列番号
# 戻り値: なし
def validate_place!(board, row, col)
  raise TicTacToeInputError, "このマスは既に埋まっています" if OPEN_SLOT != board[row][col]
end

以上でバリデーションの実装は完了です!

テスト実装

最後にバリデーションが適切に稼働するかテストを実装していきましょう!

課題コーナー

tic_tac_toe_validator_test.rbを作成する

参考コードは以下のURLから参照してください。

最終更新