> For the complete documentation index, see [llms.txt](https://kashiwara.gitbook.io/rubydesurufurusukuratchibe/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kashiwara.gitbook.io/rubydesurufurusukuratchibe/rifakutaringu/tictactoevalidatorclassno.md).

# TicTacToeValidatorClassの実装

TicTacToeValidatorClassを実装します。

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

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

### バリデーションって何

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

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

### tic\_tac\_toe\_validator.rbの作成

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

```ruby
# 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で利用するエラークラスを実装します。

```ruby
# frozen_string_literal: true

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

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

早速、tic\_tac\_toe\_validatorにバリデーションを実装していきます。

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

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

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

{% hint style="info" %}
**課題コーナー**

TicTacToeInputErrorクラスをraiseするvalidate\_input\_value!を作成する
{% endhint %}

### 実装例

```ruby
# 概要: ユーザからの入力値が適切かどうか
#       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
```

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

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

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

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

{% hint style="info" %}
**課題コーナー**

TicTacToeInputErrorクラスをraiseするvalidate\_place!を作成する
{% endhint %}

### 実装例

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

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

### テスト実装

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

{% hint style="info" %}
**課題コーナー**

tic\_tac\_toe\_validator\_test.rbを作成する
{% endhint %}

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

{% embed url="<https://github.com/Kashiwara0205/ruby-tic-tac-toe/blob/master/ch4/code/test/tic_tac_toe_validator_test.rb>" %}
