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から参照してください。