0Pricing
Go Academy · レッスン

パラメータが多い場合の問題

コンストラクタが複雑になる理由を理解します

「パラメータが多い場合の問題」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

コンストラクターが複雑になる理由

Goにはデフォルト引数も名前付きパラメーターもありません。型のオプションが増えると、コンストラクターのシグネチャは扱いにくく、間違いやすいものになります。

コンストラクターの爆発

ホスト、ポート、タイムアウト、TLS、リトライを持つサーバーを考えてみましょう。1つのコンストラクターですべてを受け取る必要があります。

package main

import "fmt"

func NewServer(host string, port, timeout, retries int, tls bool) {
	fmt.Println(host, port, timeout, retries, tls)
}

func main() {
	NewServer("localhost", 8080, 30, 3, false)
}

可読性の問題

呼び出し側は、位置で指定された値が並ぶ壁のようなコードになります。NewServer("localhost", 8080, 30, 3, false)の場合、どの数値がタイムアウトで、どの数値がリトライでしょうか。

取り違えやすい引数

隣り合う2つのintパラメーターは簡単に入れ替えられてしまい、コンパイラーでも検出できません。

package main

import "fmt"

func connect(timeout, retries int) { fmt.Println("timeout", timeout, "retries", retries) }

func main() {
	connect(3, 30)
}

Config構造体による方法

別の方法として、Config構造体を渡せます。改善はしますが、すべてのフィールドがゼロ値になるため、適切でない場合があります(たとえばタイムアウトが0になる場合です)。

package main

import "fmt"

type Config struct {
	Host    string
	Port    int
	Timeout int
}

func NewServer(c Config) { fmt.Printf("%+v\n", c) }

func main() {
	NewServer(Config{Host: "localhost", Port: 8080})
}

ゼロ値の落とし穴

Config構造体を使うと、Timeoutを省略した場合に、暗黙的に0が設定されます。「デフォルトを使う」と「明示的に0を指定する」を区別できません。

複数のコンストラクター

別の方法は、多数のコンストラクターを用意することです。NewServer、NewServerWithTLS、NewServerWithTimeoutなどが必要になり、組み合わせが爆発的に増えます。

後方互換性

既存のコンストラクターにパラメーターを追加すると、すべての呼び出し側が壊れます。既存の呼び出し箇所を変更せずにオプションを追加したいはずです。

実現したいこと

  • 妥当なデフォルト値
  • 必要なものだけを上書きする
  • 呼び出し箇所から意図が分かる
  • 呼び出し側を壊さずに後からオプションを追加する

Functional Optionsの登場

functional optionsパターンは、これらすべてを解決します。設定を行う関数の可変長リストを渡す方法です。次のレッスンでは、このパターンを段階的に構築します。

プレビュー

目標は、NewServer("localhost", WithPort(9000), WithTLS())のような呼び出しです。明確で、オプションを省略でき、拡張も可能です。

クイックチェック

この問題についての理解を確認しましょう。

まとめ

パラメーターが多いコンストラクターが問題になる理由を確認しました。

  • 位置引数は読みにくく、入れ替えも起きやすい
  • Config構造体にはゼロ値の落とし穴がある
  • 多数のコンストラクターは組み合わせが爆発的に増える
  • パラメーターの追加は呼び出し側を壊す

Functional Optionsはこれらすべてを解決します。

よくある質問

「パラメータが多い場合の問題」レッスンは無料ですか?

はい。「パラメータが多い場合の問題」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「パラメータが多い場合の問題」で何を学びますか?

コンストラクタが複雑になる理由を理解します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「パラメータが多い場合の問題」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パラメータが多い場合の問題
  2. オプション関数
  3. 柔軟なAPIの構築
  4. デフォルト値とバリデーション
← Go Academyに戻る