Agent Skills by ALSEL
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 0品質スコア 50/100

go-functional-options

Goのコンストラクタやファクトリ関数でオプション設定を柔軟に扱いたい場合、特に3つ以上のオプションパラメータや拡張性が必要なAPIを設計する際に使用します。"functional options"という名前を明示しなくても、多くの設定を受け取る`New*`関数の実装時にも適用されます。一般的な関数設計は対象外です(go-functionsを参照)。

description の原文を見る

Use when designing a Go constructor or factory function with optional configuration — especially with 3+ optional parameters or extensible APIs. Also use when building a New* function that takes many settings, even if they don't mention "functional options" by name. Does not cover general function design (see go-functions).

SKILL.md 本文

Functional Options パターン

Functional options は、不透明な Option 型を宣言し、内部構造体に情報を記録するパターンです。コンストラクタは可変長個数のこれらのオプションを受け取り、結果を設定するために適用します。

使用する時機

以下の場合に functional options を使用してください:

  • 3 個以上のオプション引数 がコンストラクタまたは公開 API にある
  • 拡張可能な API が時間とともに新しいオプションを得る可能性がある
  • 呼び出し側のエクスペリエンス が重要 (デフォルト値を渡す必要がない)

パターン

コア コンポーネント

  1. エクスポートされていない options 構造体 - すべての設定を保持
  2. エクスポートされた Option インターフェース - エクスポートされていない apply メソッド付き
  3. Option 型 - インターフェースを実装
  4. With* コンストラクタ - オプションを作成

Option インターフェース

type Option interface {
    apply(*options)
}

エクスポートされていない apply メソッドは、このパッケージからのオプションのみが使用できることを保証します。

完全な実装

package db

import "go.uber.org/zap"

// options holds all configuration for opening a connection.
type options struct {
    cache  bool
    logger *zap.Logger
}

// Option configures how we open the connection.
type Option interface {
    apply(*options)
}

// cacheOption implements Option for cache setting (simple type alias).
type cacheOption bool

func (c cacheOption) apply(opts *options) {
    opts.cache = bool(c)
}

// WithCache enables or disables caching.
func WithCache(c bool) Option {
    return cacheOption(c)
}

// loggerOption implements Option for logger setting (struct for pointers).
type loggerOption struct {
    Log *zap.Logger
}

func (l loggerOption) apply(opts *options) {
    opts.logger = l.Log
}

// WithLogger sets the logger for the connection.
func WithLogger(log *zap.Logger) Option {
    return loggerOption{Log: log}
}

// Open creates a connection.
func Open(addr string, opts ...Option) (*Connection, error) {
    // Start with defaults
    options := options{
        cache:  defaultCache,
        logger: zap.NewNop(),
    }

    // Apply all provided options
    for _, o := range opts {
        o.apply(&options)
    }

    // Use options.cache and options.logger...
    return &Connection{}, nil
}

使用例

Functional Options なし (悪い例)

// 呼び出し側は常にすべてのパラメータを提供する必要があり、デフォルト値も含まれます
db.Open(addr, db.DefaultCache, zap.NewNop())
db.Open(addr, db.DefaultCache, log)
db.Open(addr, false /* cache */, zap.NewNop())
db.Open(addr, false /* cache */, log)

Functional Options 付き (良い例)

// 必要な場合のみオプションを指定
db.Open(addr)
db.Open(addr, db.WithLogger(log))
db.Open(addr, db.WithCache(false))
db.Open(
    addr,
    db.WithCache(false),
    db.WithLogger(log),
)

比較: Functional Options と設定構造体

側面Functional Options設定構造体
拡張性新しい With* 関数を追加新しいフィールドを追加 (破壊的変更の可能性)
デフォルト値コンストラクタに組み込みゼロ値または別のデフォルト値
呼び出し側のエクスペリエンス異なる部分のみを指定構造体全体を構築する必要がある
テスト可能性オプションは比較可能構造体の比較
複雑性より多くのボイラープレートより単純なセットアップ

設定構造体を使用する方が好ましい場合: オプションが 3 個未満、オプションがめったに変わらない、すべてのオプションが通常一緒に指定される、または内部 API のみの場合。

関数型オプションと設定構造体の選択、適切なデフォルト値を持つ設定構造体 API の設計、または複雑なコンストラクタのハイブリッドアプローチの評価を決定する際は、references/OPTIONS-VS-STRUCTS.md をお読みください。

クロージャを使わない理由

別の実装方法はクロージャを使用します:

// クロージャアプローチ (推奨されません)
type Option func(*options)

func WithCache(c bool) Option {
    return func(o *options) { o.cache = c }
}

インターフェースアプローチが推奨される理由:

  1. テスト可能性 - オプションはテストやモックで比較できます
  2. デバッグ可能性 - オプションは fmt.Stringer を実装できます
  3. 柔軟性 - オプションは追加のインターフェースを実装できます
  4. 可視性 - Option 型はドキュメンテーションで可視化されます

クイックリファレンス

// 1. デフォルト値を持つエクスポートされていない options 構造体
type options struct {
    field1 Type1
    field2 Type2
}

// 2. エクスポートされた Option インターフェース、エクスポートされていないメソッド
type Option interface {
    apply(*options)
}

// 3. Option 型 + apply + With* コンストラクタ
type field1Option Type1

func (o field1Option) apply(opts *options) { opts.field1 = Type1(o) }
func WithField1(v Type1) Option            { return field1Option(v) }

// 4. コンストラクタはデフォルト値の上にオプションを適用
func New(required string, opts ...Option) (*Thing, error) {
    o := options{field1: defaultField1, field2: defaultField2}
    for _, opt := range opts {
        opt.apply(&o)
    }
    // ...
}

チェックリスト

  • options 構造体はエクスポートされていない
  • Option インターフェースはエクスポートされていない apply メソッドを持つ
  • 各オプションは With* コンストラクタを持つ
  • デフォルト値はオプションを適用する前に設定される
  • 必須パラメータは ...Option から分離されている

関連スキル

  • インターフェース設計: Option インターフェースを設計する場合、またはインターフェースとクロージャアプローチの間で選択する場合は、go-interfaces を参照してください
  • 命名規則: With* コンストラクタ、オプション型、またはエクスポートされていない options 構造体に名前を付ける場合は、go-naming を参照してください
  • 関数設計: ファイル内でコンストラクタを整理したり、可変長シグネチャをフォーマットしたりする場合は、go-functions を参照してください
  • ドキュメンテーション: Option 型、With* 関数、またはコンストラクタの動作を文書化する場合は、go-documentation を参照してください

外部リソース

ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
cxuu
リポジトリ
cxuu/golang-skills
ライセンス
Apache-2.0
最終更新
不明

Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0

関連スキル

汎用デザイン・クリエイティブ⭐ リポ 1,739

nano-banana-2

inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」

by openakita
汎用デザイン・クリエイティブ⭐ リポ 815

octocode-slides

洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。

by bgauryy
汎用デザイン・クリエイティブ⭐ リポ 482

gpt-image2-ppt

OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。

by JuneYaooo
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

nano-banana

Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。

by majiayu000
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

oiloil-ui-ux-guide

モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。

by majiayu000
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

axiom-hig-ref

Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。

by majiayu000
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: cxuu · cxuu/golang-skills · ライセンス: Apache-2.0