Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 1896] ファイルの概要

このコミットは、Go言語の標準ライブラリの一部であるunicodeパッケージのテストファイルsrc/lib/unicode/decimaldigit_test.goに対する変更です。このファイルは、Unicodeの10進数字(decimal digits)を識別する機能が正しく動作するかを検証するためのテストコードを含んでいます。具体的には、unicodeパッケージが提供するIsDecimalDigit関数などの挙動をテストしています。

コミット

  • コミットハッシュ: 8e39472e3b0bc001caea29566dde9533d22517ee
  • 作者: Rob Pike r@golang.org
  • コミット日時: 2009年3月26日 木曜日 22:04:34 -0700
  • 変更ファイル: src/lib/unicode/decimaldigit_test.go

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/8e39472e3b0bc001caea29566dde9533d22517ee

元コミット内容

rename redefined symbols

R=iant
DELTA=4  (0 added, 0 deleted, 4 changed)
OCL=26802
CL=26811

変更の背景

このコミットの背景には、テストファイル内で定義されていた変数名が、Go言語のunicodeパッケージ内の他のシンボルと名前が衝突する可能性があった、あるいはそのテスト専用の性質をより明確にする必要があったという事情が考えられます。

Go言語では、パッケージ内で定義されたシンボル(変数、関数、型など)は、そのパッケージ内でのみ有効な「非公開(unexported)」なものと、他のパッケージから参照可能な「公開(exported)」なものがあります。非公開シンボルは小文字で始まり、公開シンボルは大文字で始まります。

decimaldigit_test.goファイル内でdecimalletterという名前の変数が定義されていましたが、これらはunicodeパッケージ自体が提供する可能性のある、あるいは将来的に提供する可能性のある公開シンボル(例: unicode.Decimalunicode.Letterのような定数や関数)と名前が重複し、混乱を招く可能性がありました。

このような名前の衝突や曖昧さを避けるため、テストファイル内で使用されるこれらの変数をtestDecimalおよびtestLetterという名前に変更することで、それらがテスト専用のデータであることを明確にし、コードの可読性と保守性を向上させる目的があったと推測されます。これは、特にGo言語の初期段階において、ライブラリの設計原則や命名規則が確立されていく過程で発生した調整の一つと考えられます。

前提知識の解説

Go言語のテストの慣習

Go言語では、テストコードは通常、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に_test.goを付けます(例: decimaldigit.goに対するdecimaldigit_test.go)。テスト関数はTestで始まり、*testing.T型の引数を取ります。これにより、go testコマンドを実行した際に自動的にテストが発見され、実行されます。

Go言語における変数スコープと名前解決

Go言語では、変数のスコープはブロック({}で囲まれた範囲)によって決まります。パッケージレベルで宣言された変数は、そのパッケージ全体でアクセス可能です。また、Goの命名規則では、小文字で始まる識別子はパッケージ内で非公開(private)であり、大文字で始まる識別子は公開(public)となります。

このコミットで変更されたdecimalletterは、テストファイル内で定義された非公開変数でした。しかし、たとえ非公開であっても、その名前が標準ライブラリの他の部分で使われている、あるいは使われる可能性のある一般的な用語と重複すると、開発者がコードを読んだ際に混乱を招くことがあります。

unicodeパッケージの役割

Go言語の標準ライブラリunicodeパッケージは、Unicodeの文字プロパティに関する機能を提供します。これには、特定の文字が数字であるか、文字であるか、句読点であるかなどを判定する関数(例: unicode.IsDigit, unicode.IsLetter)や、文字のカテゴリに関する定数などが含まれます。decimaldigit_test.goは、これらの機能がUnicode標準に準拠して正しく動作するかを検証するためのテストです。

技術的詳細

このコミットは、src/lib/unicode/decimaldigit_test.goファイル内の2つのグローバル変数(テストファイル内でのみ使用される)の名前を変更しています。

  1. decimalという名前の[]int型スライスがtestDecimalにリネームされました。このスライスは、Unicodeの10進数字のコードポイントのリストを保持しています。
  2. letterという名前の[]int型スライスがtestLetterにリネームされました。このスライスは、Unicodeの文字(letter)のコードポイントのリストを保持しています。

これらの変数は、TestIsDecimalDigit関数内でIsDecimalDigit関数のテストデータとして使用されていました。リネームにより、これらの変数がテスト目的でのみ使用されるデータセットであることを明確にしています。

この変更は、コードの機能には影響を与えません。テストのロジックや、unicodeパッケージ自体の動作は一切変更されていません。純粋に、テストコード内の変数名をより意図が明確になるように調整したものです。これは、大規模なプロジェクトや標準ライブラリにおいて、命名の一貫性と明確性が重要視される典型的な例です。

コアとなるコードの変更箇所

diff --git a/src/lib/unicode/decimaldigit_test.go b/src/lib/unicode/decimaldigit_test.go
index f7c09d7372..f7b470c676 100644
--- a/src/lib/unicode/decimaldigit_test.go
+++ b/src/lib/unicode/decimaldigit_test.go
@@ -13,7 +13,7 @@ import (
 //\tgrep '^....;[^;]*;Nd;' UnicodeData.txt
 // To generate this table:
 //  ,s/([^;]+).+/\t0x\\1,\t\\/\\/ &/g
-var decimal = []int{
+var testDecimal = []int{
  \t0x0030,\t// 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
  \t0x0031,\t// 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
  \t0x0032,\t// 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
@@ -326,7 +326,7 @@ var decimal = []int{
  \t0xFF19,\t// FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
  }\n 
-var letter = []int{
+var testLetter = []int{
  \t0x41,\n \t0x61,\n \t0xaa,\n
@@ -362,12 +362,12 @@ var letter = []int{
 }\n 
  func TestIsDecimalDigit(t *testing.T) {
-\tfor i, r := range(decimal) {
+\tfor i, r := range(testDecimal) {
  \t\tif !IsDecimalDigit(r) {
  \t\t\tt.Errorf(\"IsDecimalDigit(%#x) = false, want true\\n\", r);\n \t\t}\n \t}\n-\tfor i, r := range(letter) {
+\tfor i, r := range(testLetter) {
  \t\tif IsDecimalDigit(r) {
  \t\t\tt.Errorf(\"IsDecimalDigit(%#x) = true, want false\\n\", r);\n \t\t}\n

コアとなるコードの解説

上記のdiffは、以下の2つの主要な変更を示しています。

  1. decimal変数のリネーム:

    • 変更前: var decimal = []int{...}
    • 変更後: var testDecimal = []int{...}
    • この変更により、Unicodeの10進数字のコードポイントを格納するスライスがdecimalからtestDecimalに名前が変更されました。これにより、この変数がテスト目的で使われるデータセットであることが明確になります。
  2. letter変数のリネーム:

    • 変更前: var letter = []int{...}
    • 変更後: var testLetter = []int{...}
    • 同様に、Unicodeの文字(letter)のコードポイントを格納するスライスがletterからtestLetterに名前が変更されました。これもまた、テスト専用のデータであることを示唆しています。

これらの変数名のリネームに伴い、TestIsDecimalDigit関数内でこれらの変数が使用されている箇所も更新されています。

  • for i, r := range(decimal)for i, r := range(testDecimal) に変更。
  • for i, r := range(letter)for i, r := range(testLetter) に変更。

この変更は、Go言語のコードベース全体における命名規則の統一と、テストコードの意図の明確化を目的としています。特に、標準ライブラリのような共有されるコードベースでは、将来的な拡張や他の開発者による理解を容易にするために、このような細かな命名の調整が重要となります。

関連リンク

参考にした情報源リンク