[インデックス 11630] ファイルの概要
このコミットは、Go言語の標準ライブラリであるimage
パッケージのドキュメンテーションの改善と、エラー名の変更、および特定の構造体のドキュメントコメントの明確化を目的としています。具体的には、パッケージ全体の概要説明の追加、エラー変数UnknownFormatErr
をErrFormat
にリネーム、そしてRepeated
構造体の動作説明をより正確にするためのコメント修正が行われています。
コミット
commit 8fc87c957c6bc9d6dbd9c74171803cd4e7384c80
Author: Nigel Tao <nigeltao@golang.org>
Date: Mon Feb 6 11:04:12 2012 +1100
image: add package docs, rename s/UnknownFormatError/ErrFormat/ and
rewrite the doc comment for Repeated.
Fixes #2858.
R=r, rsc
CC=golang-dev
https://golang.org/cl/5626050
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8fc87c957c6bc9d6dbd9c74171803cd4e7384c80
元コミット内容
このコミットは、Go言語のimage
パッケージに対して以下の変更を加えています。
- パッケージドキュメントの追加:
image
パッケージの全体的な説明と利用方法に関するドキュメントが追加されました。 - エラー名の変更:
UnknownFormatError
というエラー変数がErrFormat
にリネームされました。 Repeated
構造体のドキュメントコメントの書き換え:Repeated
構造体の動作に関する説明がより明確に、かつ正確に修正されました。
これらの変更は、Issue #2858の修正に関連しています。
変更の背景
このコミットの背景には、Go言語の標準ライブラリの品質向上と、開発者体験の改善という目的があります。
- ドキュメンテーションの充実:
image
パッケージはGo言語における画像処理の基盤となる重要なパッケージですが、初期の段階ではパッケージレベルの詳細なドキュメントが不足していました。特に、外部の画像フォーマット(PNG, JPEGなど)のデコーダを登録するためにimport _ "image/png"
のようなブランクインポートが必要であるというGo特有の慣習は、初心者には理解しにくい点でした。このコミットでは、その点を明確にするための説明が追加されています。 - エラー命名規則の統一: Go言語では、エラー変数には
Err
というプレフィックスを付けるのが一般的な慣習です(例:io.EOF
,os.ErrNotExist
)。既存のUnknownFormatError
は、この慣習から逸脱していました。ErrFormat
へのリネームは、Goのエラーハンドリングのイディオムに合わせ、コードベース全体の一貫性を高めることを目的としています。 Repeated
構造体の説明の明確化:Repeated
構造体は、画像を無限に繰り返すという特殊な機能を提供しますが、その動作原理、特にOffset
フィールドの役割が既存のドキュメントでは十分に説明されていませんでした。この修正により、Repeated
の挙動がより直感的に理解できるようになりました。- Issue #2858の修正: このコミットは、GoのIssueトラッカーで報告されていた#2858を修正するものです。Issue #2858は「image: add package docs」というタイトルで、
image
パッケージのドキュメントが不足していることを指摘していました。このコミットは、その要望に応える形でドキュメントの追加と改善を行っています。
前提知識の解説
このコミットの変更内容を理解するためには、以下のGo言語および画像処理に関する基本的な知識が役立ちます。
- Go言語のパッケージとインポート:
- Go言語では、コードはパッケージにまとめられます。他のパッケージの機能を利用するには
import
文を使用します。 - ブランクインポート (
import _ "package_name"
): これは、パッケージをインポートするものの、そのパッケージ内の識別子を直接使用しない場合に用いられます。Goでは、パッケージがインポートされると、そのパッケージのinit
関数が実行されます。image
パッケージの場合、image/png
やimage/jpeg
などのフォーマット固有のパッケージをブランクインポートすることで、そのパッケージのinit
関数が実行され、対応する画像デコーダがimage
パッケージに自動的に登録される仕組みになっています。これにより、image.Decode
関数がそのフォーマットの画像を認識できるようになります。
- Go言語では、コードはパッケージにまとめられます。他のパッケージの機能を利用するには
- Go言語のエラーハンドリング:
- Goでは、エラーは
error
インターフェースを実装した値として返されます。 - 慣習として、パッケージが公開する特定のエラー値には
Err
というプレフィックスを付けます(例:errors.New("some error")
で作成されるエラー変数)。
- Goでは、エラーは
image
パッケージの基本概念:image.Image
インターフェース: Goのimage
パッケージにおける最も基本的なインターフェースで、2次元画像を抽象化します。ColorModel()
,Bounds()
,At(x, y)
などのメソッドを持ちます。image/color
パッケージ: 色の表現(color.Color
インターフェース、color.RGBA
,color.Gray
など)を定義します。image.Image
のAt
メソッドはcolor.Color
を返します。image.Decode
関数:io.Reader
から画像データを読み込み、image.Image
インターフェース、画像フォーマット名、およびエラーを返します。この関数が画像を正しくデコードするためには、事前に適切なデコーダが登録されている必要があります。image.Config
構造体: 画像の幅と高さなどの設定情報を保持します。image.DecodeConfig
関数で取得できます。image.Rectangle
構造体: 画像の境界(長方形の領域)を定義します。Min
とMax
のimage.Point
を持ちます。image.Point
構造体: 2次元空間の点を表し、X
とY
の座標を持ちます。
技術的詳細
このコミットで行われた技術的な変更は、主に以下の3つのファイルにわたります。
src/pkg/image/format.go
このファイルでは、画像フォーマットの検出とデコードに関連するロジックが定義されています。主な変更点は、エラー変数名の変更です。
UnknownFormatErr
からErrFormat
へのリネーム:- 変更前:
var UnknownFormatErr = errors.New("image: unknown format")
- 変更後:
var ErrFormat = errors.New("image: unknown format")
- この変更は、Go言語のエラー命名規則に準拠するためのものです。
Decode
やDecodeConfig
関数が未知のフォーマットに遭遇した場合に返すエラーが、よりGoらしい命名になりました。これにより、利用者はこのエラーがimage
パッケージによって定義された標準的なエラーであることを直感的に理解できます。
- 変更前:
src/pkg/image/image.go
このファイルはimage
パッケージの主要な定義(Image
インターフェース、基本的な画像型など)を含んでいます。ここでは、パッケージレベルのドキュメントの追加と、既存の型に関するドキュメントコメントの修正が行われました。
- パッケージドキュメントの追加:
- ファイルの先頭に、
image
パッケージの目的、Image
インターフェースの役割、画像の生成方法(NewRGBA
やDecode
)、そしてデコーダの登録メカニズム(ブランクインポートの重要性)に関する詳細な説明が追加されました。 - 特に、
import _ "image/png"
のようにブランクインポートを行うことで、そのパッケージのinit
関数が実行され、デコーダが自動的に登録されるというGoのイディオムが明記されました。これは、image
パッケージを初めて利用する開発者にとって非常に重要な情報です。 - Go公式ブログの「The Go image package」へのリンクも追加され、さらなる詳細情報へのアクセスが容易になりました。
- ファイルの先頭に、
- 各画像型のドキュメントコメントの修正:
Image
,RGBA
,RGBA64
,NRGBA
,NRGBA64
,Alpha
,Alpha16
,Gray
,Gray16
といった主要な画像型について、そのAt
メソッドが返すcolor
パッケージ内の具体的な型(例:color.RGBA values
、color.NRGBA values
)が明記されました。- これにより、各画像型がどのような色表現を使用しているのかがより明確になり、APIの理解が深まります。例えば、
RGBA
型はcolor.RGBA
値を返し、RGBA64
型はcolor.RGBA64
値を返すといった具体的な情報が提供されます。
src/pkg/image/names.go
このファイルには、特定の名前付き画像型やユーティリティ関数が含まれています。ここでは、Repeated
構造体のドキュメントコメントが修正されました。
Repeated
構造体のドキュメントコメントの書き換え:- 変更前は
Repeated
が「無限に繰り返されるImage」であるという説明が簡潔に書かれていましたが、変更後はその動作原理がより詳細に説明されました。 - 新しいコメントでは、
Repeated
が「ソース画像を-Offset
だけ平行移動し、その後四方に無限に繰り返す」Image
であると定義されています。 Repeated{src, off}.At(x, y)
がsrc.At(x+off.X, y+off.Y)
と等しくなるという関係性が明確に示されました。- さらに、
I
フィールドとOffset
フィールドそれぞれに、その役割を説明するコメントが追加されました。I
はソース画像、Offset
は結果ピクセルからソースピクセルへの平行移動ベクトルであると明記されています。 - これにより、
Repeated
構造体を利用する開発者は、その挙動をより正確に予測し、意図した通りに利用できるようになります。
- 変更前は
これらの変更は、Goの標準ライブラリのドキュメンテーションの質を高め、APIの使いやすさと理解度を向上させるための重要なステップです。
コアとなるコードの変更箇所
src/pkg/image/format.go
--- a/src/pkg/image/format.go
+++ b/src/pkg/image/format.go
@@ -10,8 +10,8 @@ import (
"io"
)
-// An UnknownFormatErr indicates that decoding encountered an unknown format.
-var UnknownFormatErr = errors.New("image: unknown format")
+// ErrFormat indicates that decoding encountered an unknown format.
+var ErrFormat = errors.New("image: unknown format")
// A format holds an image format's name, magic header and how to decode it.
type format struct {
@@ -79,7 +79,7 @@ func Decode(r io.Reader) (Image, string, error) {
rr := asReader(r)
f := sniff(rr)
if f.decode == nil {
- return nil, "", UnknownFormatErr
+ return nil, "", ErrFormat
}
m, err := f.decode(rr)
return m, f.name, err
@@ -93,7 +93,7 @@ func DecodeConfig(r io.Reader) (Config, string, error) {
rr := asReader(r)
f := sniff(rr)
if f.decodeConfig == nil {
- return Config{}, "", UnknownFormatErr
+ return Config{}, "", ErrFormat
}
c, err := f.decodeConfig(rr)
return c, f.name, err
src/pkg/image/image.go
--- a/src/pkg/image/image.go
+++ b/src/pkg/image/image.go
@@ -4,7 +4,20 @@
// Package image implements a basic 2-D image library.
//
-// See "The Go image package" for an introduction to this package:
+// The fundamental interface is called Image. An Image contains colors, which
+// are described in the image/color package.
+//
+// Values of the Image interface are created either by calling functions such
+// as NewRGBA and NewPaletted, or by calling Decode on an io.Reader containing
+// image data in a format such as GIF, JPEG or PNG. Decoding any particular
+// image format requires the prior registration of a decoder function.
+// Registration is typically automatic as a side effect of initializing that
+// format's package so that, to decode a PNG image, it suffices to have
+// import _ "image/png"
+// in a program's main package. The _ means to import a package purely for its
+// initialization side effects.
+//
+// See "The Go image package" for more details:
// http://blog.golang.org/2011/09/go-image-package.html
package image
@@ -18,7 +31,8 @@ type Config struct {
Width, Height int
}
-// Image is a finite rectangular grid of Colors drawn from a color model.
+// Image is a finite rectangular grid of color.Color values taken from a color
+// model.
type Image interface {
// ColorModel returns the Image's color model.
ColorModel() color.Model
@@ -42,7 +56,7 @@ type PalettedImage interface {
Image
}
-// RGBA is an in-memory image of RGBAColor values.
+// RGBA is an in-memory image whose At method returns color.RGBA values.
type RGBA struct {
// Pix holds the image's pixels, in R, G, B, A order. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
@@ -137,7 +151,7 @@ func NewRGBA(r Rectangle) *RGBA {
return &RGBA{buf, 4 * w, r}
}
-// RGBA64 is an in-memory image of RGBA64Color values.
+// RGBA64 is an in-memory image whose At method returns color.RGBA64 values.
type RGBA64 struct {
// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
@@ -245,7 +259,7 @@ func NewRGBA64(r Rectangle) *RGBA64 {
return &RGBA64{pix, 8 * w, r}
}
-// NRGBA is an in-memory image of NRGBAColor values.
+// NRGBA is an in-memory image whose At method returns color.NRGBA values.
type NRGBA struct {
// Pix holds the image's pixels, in R, G, B, A order. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
@@ -340,7 +354,7 @@ func NewNRGBA(r Rectangle) *NRGBA {
return &NRGBA{pix, 4 * w, r}
}
-// NRGBA64 is an in-memory image of NRGBA64Color values.
+// NRGBA64 is an in-memory image whose At method returns color.NRGBA64 values.
type NRGBA64 struct {
// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
@@ -448,7 +462,7 @@ func NewNRGBA64(r Rectangle) *NRGBA64 {
return &NRGBA64{pix, 8 * w, r}
}
-// Alpha is an in-memory image of AlphaColor values.
+// Alpha is an in-memory image whose At method returns color.Alpha values.
type Alpha struct {
// Pix holds the image's pixels, as alpha values. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
@@ -536,7 +550,7 @@ func NewAlpha(r Rectangle) *Alpha {
return &Alpha{pix, 1 * w, r}
}
-// Alpha16 is an in-memory image of Alpha16Color values.
+// Alpha16 is an in-memory image whose At method returns color.Alpha64 values.
type Alpha16 struct {
// Pix holds the image's pixels, as alpha values in big-endian format. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2].
@@ -627,7 +641,7 @@ func NewAlpha16(r Rectangle) *Alpha16 {
return &Alpha16{pix, 2 * w, r}
}
-// Gray is an in-memory image of GrayColor values.
+// Gray is an in-memory image whose At method returns color.Gray values.
type Gray struct {
// Pix holds the image's pixels, as gray values. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
@@ -702,7 +716,7 @@ func NewGray(r Rectangle) *Gray {
return &Gray{pix, 1 * w, r}
}
-// Gray16 is an in-memory image of Gray16Color values.
+// Gray16 is an in-memory image whose At method returns color.Gray16 values.
type Gray16 struct {
// Pix holds the image's pixels, as gray values in big-endian format. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2].
src/pkg/image/names.go
--- a/src/pkg/image/names.go
+++ b/src/pkg/image/names.go
@@ -51,11 +51,15 @@ func NewUniform(c color.Color) *Uniform {
return &Uniform{c}
}
-// Repeated is an infinite-sized Image that repeats another Image in both
-// directions. Repeated{i, p}.At(x, y) will equal i.At(x+p.X, y+p.Y) for all
-// points {x+p.X, y+p.Y} within i's Bounds.
+// Repeated is an Image that is a source Image translated by -Offset and then
+// repeated in all four directions to infinity.
+//
+// Repeated{src, off}.At(x, y) will equal src.At(x+off.X, y+off.Y) for all
+// points {x+off.X, y+off.Y} within src's Bounds.
type Repeated struct {
-\tI Image
+\t// I is the source image.
+\tI Image
+\t// Offset is the translation vector from result pixel to source pixel.
Offset Point
}
コアとなるコードの解説
src/pkg/image/format.go
の変更
- エラー変数名のリファクタリング:
UnknownFormatErr
からErrFormat
への変更は、Go言語の標準ライブラリにおけるエラー命名のベストプラクティスに沿ったものです。Goでは、エラーは通常、Err
プレフィックスを持つ変数として定義され、特定の条件で返されることが期待されます。この変更により、image
パッケージのエラーハンドリングがよりGoのイディオムに適合し、他の標準ライブラリとの一貫性が向上します。これは機能的な変更ではなく、コードの可読性と保守性を高めるためのものです。
src/pkg/image/image.go
の変更
- パッケージドキュメントの追加: これは、
image
パッケージの利用者が、その機能と使い方をより深く理解するための最も重要な変更点です。特に、画像デコーダの登録メカニズム(import _ "image/png"
)に関する説明は、Goのブランクインポートの特殊なユースケースを明確にし、多くの開発者が直面するであろう疑問を解消します。このドキュメントは、パッケージの全体像を把握し、正しい方法で利用するためのガイドラインとなります。 - 画像型ドキュメントの明確化:
RGBA
,NRGBA
などの画像型が、そのAt
メソッドで具体的にどのcolor
パッケージの型を返すのかを明記することで、APIの振る舞いがより予測可能になります。例えば、RGBA
がcolor.RGBA
を返すことが明確になることで、開発者は型アサーションや型変換の際に、より正確なコードを書くことができます。これは、型の安全性とコードの正確性を向上させるための細かながら重要な改善です。
src/pkg/image/names.go
の変更
Repeated
構造体ドキュメントの改善:Repeated
構造体は、画像を無限に繰り返すという抽象的な概念を扱います。元のドキュメントは簡潔でしたが、新しいドキュメントは、その動作原理を数学的な関係性(src.At(x+off.X, y+off.Y)
)を用いて具体的に説明しています。また、I
とOffset
というフィールドがそれぞれ何を意味するのかを明確にすることで、この構造体の利用方法がより直感的になります。特にOffset
が「結果ピクセルからソースピクセルへの平行移動ベクトル」であるという説明は、Repeated
の動作を理解する上で不可欠な情報です。これにより、開発者はRepeated
をより正確に、かつ意図した通りに利用できるようになります。
これらの変更は全体として、Goのimage
パッケージの使いやすさ、理解度、そしてコードベースの一貫性を向上させることを目的としています。
関連リンク
- Go言語のコミットページ: https://github.com/golang/go/commit/8fc87c957c6bc9d6dbd9c74171803cd4e7384c80
- Go Gerrit Change-ID: https://golang.org/cl/5626050
- Go Issue #2858: https://github.com/golang/go/issues/2858
- The Go image package (Go Blog): http://blog.golang.org/2011/09/go-image-package.html
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のIssueトラッカー
- Go言語の公式ブログ
- Go言語のエラーハンドリングに関する一般的な慣習に関する情報