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

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

このコミットは、Go言語の標準ライブラリであるimageパッケージのドキュメンテーションの改善と、エラー名の変更、および特定の構造体のドキュメントコメントの明確化を目的としています。具体的には、パッケージ全体の概要説明の追加、エラー変数UnknownFormatErrErrFormatにリネーム、そして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パッケージに対して以下の変更を加えています。

  1. パッケージドキュメントの追加: imageパッケージの全体的な説明と利用方法に関するドキュメントが追加されました。
  2. エラー名の変更: UnknownFormatErrorというエラー変数がErrFormatにリネームされました。
  3. 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/pngimage/jpegなどのフォーマット固有のパッケージをブランクインポートすることで、そのパッケージのinit関数が実行され、対応する画像デコーダがimageパッケージに自動的に登録される仕組みになっています。これにより、image.Decode関数がそのフォーマットの画像を認識できるようになります。
  • Go言語のエラーハンドリング:
    • Goでは、エラーはerrorインターフェースを実装した値として返されます。
    • 慣習として、パッケージが公開する特定のエラー値にはErrというプレフィックスを付けます(例: errors.New("some error")で作成されるエラー変数)。
  • imageパッケージの基本概念:
    • image.Imageインターフェース: Goのimageパッケージにおける最も基本的なインターフェースで、2次元画像を抽象化します。ColorModel(), Bounds(), At(x, y)などのメソッドを持ちます。
    • image/colorパッケージ: 色の表現(color.Colorインターフェース、color.RGBA, color.Grayなど)を定義します。image.ImageAtメソッドはcolor.Colorを返します。
    • image.Decode関数: io.Readerから画像データを読み込み、image.Imageインターフェース、画像フォーマット名、およびエラーを返します。この関数が画像を正しくデコードするためには、事前に適切なデコーダが登録されている必要があります。
    • image.Config構造体: 画像の幅と高さなどの設定情報を保持します。image.DecodeConfig関数で取得できます。
    • image.Rectangle構造体: 画像の境界(長方形の領域)を定義します。MinMaximage.Pointを持ちます。
    • image.Point構造体: 2次元空間の点を表し、XYの座標を持ちます。

技術的詳細

このコミットで行われた技術的な変更は、主に以下の3つのファイルにわたります。

src/pkg/image/format.go

このファイルでは、画像フォーマットの検出とデコードに関連するロジックが定義されています。主な変更点は、エラー変数名の変更です。

  • UnknownFormatErrからErrFormatへのリネーム:
    • 変更前: var UnknownFormatErr = errors.New("image: unknown format")
    • 変更後: var ErrFormat = errors.New("image: unknown format")
    • この変更は、Go言語のエラー命名規則に準拠するためのものです。DecodeDecodeConfig関数が未知のフォーマットに遭遇した場合に返すエラーが、よりGoらしい命名になりました。これにより、利用者はこのエラーがimageパッケージによって定義された標準的なエラーであることを直感的に理解できます。

src/pkg/image/image.go

このファイルはimageパッケージの主要な定義(Imageインターフェース、基本的な画像型など)を含んでいます。ここでは、パッケージレベルのドキュメントの追加と、既存の型に関するドキュメントコメントの修正が行われました。

  • パッケージドキュメントの追加:
    • ファイルの先頭に、imageパッケージの目的、Imageインターフェースの役割、画像の生成方法(NewRGBADecode)、そしてデコーダの登録メカニズム(ブランクインポートの重要性)に関する詳細な説明が追加されました。
    • 特に、import _ "image/png"のようにブランクインポートを行うことで、そのパッケージのinit関数が実行され、デコーダが自動的に登録されるというGoのイディオムが明記されました。これは、imageパッケージを初めて利用する開発者にとって非常に重要な情報です。
    • Go公式ブログの「The Go image package」へのリンクも追加され、さらなる詳細情報へのアクセスが容易になりました。
  • 各画像型のドキュメントコメントの修正:
    • Image, RGBA, RGBA64, NRGBA, NRGBA64, Alpha, Alpha16, Gray, Gray16といった主要な画像型について、そのAtメソッドが返すcolorパッケージ内の具体的な型(例: color.RGBA valuescolor.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の振る舞いがより予測可能になります。例えば、RGBAcolor.RGBAを返すことが明確になることで、開発者は型アサーションや型変換の際に、より正確なコードを書くことができます。これは、型の安全性とコードの正確性を向上させるための細かながら重要な改善です。

src/pkg/image/names.goの変更

  • Repeated構造体ドキュメントの改善: Repeated構造体は、画像を無限に繰り返すという抽象的な概念を扱います。元のドキュメントは簡潔でしたが、新しいドキュメントは、その動作原理を数学的な関係性(src.At(x+off.X, y+off.Y))を用いて具体的に説明しています。また、IOffsetというフィールドがそれぞれ何を意味するのかを明確にすることで、この構造体の利用方法がより直感的になります。特にOffsetが「結果ピクセルからソースピクセルへの平行移動ベクトル」であるという説明は、Repeatedの動作を理解する上で不可欠な情報です。これにより、開発者はRepeatedをより正確に、かつ意図した通りに利用できるようになります。

これらの変更は全体として、Goのimageパッケージの使いやすさ、理解度、そしてコードベースの一貫性を向上させることを目的としています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のIssueトラッカー
  • Go言語の公式ブログ
  • Go言語のエラーハンドリングに関する一般的な慣習に関する情報