# 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>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kashiwara.gitbook.io/rubydesurufurusukuratchibe/rifakutaringu/tictactoevalidatorclassno.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
