Menu
Coddy logo textTech

シンプルな数値バリデーター

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 67/68。

challenge icon

チャレンジ

簡単

インターフェースがどのように動作の契約を定義し、カスタムエラーがバリデーション失敗時にどのように意味のあるフィードバックを提供するかを示す、数値バリデーションシステムを作成してください。このチャレンジでは、インターフェースの作成、カスタム型による実装、およびバリデーションエラーの適切な処理能力が試されます。

2つの入力を受け取ります:

  • カンマで区切られたバリデーション対象の数値を含む文字列(例:"45,150,25,200,75"
  • "min:max" 形式のバリデーション範囲を含む文字列(例:"1:100"

あなたのタスクは以下の通りです:

  1. 単一のメソッド Validate() error を持つ Validator インターフェースを定義する
  2. Value (int) と Message (string) の2つのフィールドを持つ ValidationError 構造体というカスタムエラー型を作成する
  3. ValidationError に対して Error() string メソッドを実装し、"Validation failed: [message] (value: [value])" という形式でメッセージを返すようにする
  4. Number (int)、Min (int)、Max (int) の3つのフィールドを持つ NumberValidator 構造体を作成する
  5. NumberValidator に対して Validate() error メソッドを実装し、以下の動作をさせる:
    • 数値が有効な範囲内(境界値を含む)であれば nil を返す
    • 数値が最小値より小さい場合は、メッセージ "number below minimum range" を持つ ValidationError を返す
    • 数値が最大値より大きい場合は、メッセージ "number above maximum range" を持つ ValidationError を返す
  6. 最初の入力をカンマで分割して、個々の数値文字列を取得する
  7. 2番目の入力をコロンで分割して、最小値と最大値を抽出する
  8. strconv パッケージを使用して、すべての文字列値を整数に変換する
  9. バリデーションヘッダーを表示する:"=== NUMBER VALIDATION SYSTEM ==="
  10. バリデーションパラメータを表示する:"Validating numbers in range [min] to [max]"
  11. 各数値について:
    • 数値と範囲の値を使用して NumberValidator インスタンスを作成する
    • バリデータに対して Validate() メソッドを呼び出す
    • バリデーションに合格した場合(エラーが nil の場合)、"✓ [number] is valid" と表示する
    • バリデーションに失敗した場合(エラーが nil でない場合)、"✗ [error_message]" と表示する
  12. バリデーションサマリーを表示する:
    • "=== VALIDATION SUMMARY ==="
    • "Total numbers checked: [total_count]"
    • "Valid numbers: [valid_count]"
    • "Invalid numbers: [invalid_count]"
  13. 完了メッセージを表示する:"Number validation completed successfully"

入力文字列の分割には strings パッケージを、文字列から整数への変換には strconv パッケージを、フォーマットされた出力には fmt パッケージを使用してください。このチャレンジは、カスタムエラー型を通じて詳細なエラー情報を提供しながら、インターフェースを使用して柔軟なバリデーションシステムを作成する方法を示しています。

自分で試してみよう

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// 入力を読み込む
	var numbersInput string
	var rangeInput string
	fmt.Scanln(&numbersInput)
	fmt.Scanln(&rangeInput)
	
	// 入力を解析する
	numberStrings := strings.Split(numbersInput, ",")
	rangeParts := strings.Split(rangeInput, ":")
	
	// 範囲の値を整数に変換する
	min, _ := strconv.Atoi(rangeParts[0])
	max, _ := strconv.Atoi(rangeParts[1])
	
	// TODO: 以下にコードを記述してください
	// 1. Validator インターフェースを定義する
	// 2. ValidationError 構造体を作成し、Error() メソッドを実装する
	// 3. NumberValidator 構造体を作成し、Validate() メソッドを実装する
	// 4. 各数値を処理し、バリデーションを行う
	// 5. 結果とサマリーを表示する
	
	// バリデーションのヘッダーを表示
	fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
	fmt.Printf("Validating numbers in range %d to %d\n", min, max)
	
	// ここで各数値を処理する
	
	// バリデーションのサマリーを表示
	fmt.Println("=== VALIDATION SUMMARY ===")
	// ここにサマリー出力を追加
	
	fmt.Println("Number validation completed successfully")
}

論理とフローのすべてのレッスン