【ChatGPT】外部のAPIをラップする関数で、API側がたくさんのオプションを持っていると、引数がどうしても多くなってしまいます。これをわかりやすい関数にするには?

当サイトではアフィリエイト広告を利用して商品を紹介しています。

自分用のメモとしてChatGPTに質問してなるほどなとおもったときの記録を残しておきます。

質問

外部のAPIをラップしたような関数で、API側がたくさんのオプションを持っているので、引数がどうしても多くなってしまいます。これをわかりやすい関数にしたいです

A.この場合、引数が多い関数を小さな関数に分割することで、それぞれの関数が特定のオプションに対応していることを明確にします。
また、それぞれの引数にデフォルト値を設定することで、必要な引数だけを指定するようにすることでも、呼び出し側がわかりやすくなります。

他にも、オブジェクト指向のアプローチを取ることでも解決できます。APIに対応するクラスを作成し、それぞれのオプションをクラスのプロパティとして定義します。こうすることで、APIを呼び出す際に、インスタンスを生成し、プロパティを設定することで、オプションを指定することができます。

それでも、引数が多い場合は、ドキュメントやコメントなどで、それぞれの引数の意味や使い方を明確に記述することでも、呼び出し側がわかりやすくなります。

オブジェクト指向で実装した場合例えばJSのコードだとどのようになりますか

JavaScriptでオブジェクト指向でAPIをラップする場合、以下のようになります。

class APIClient {
    constructor(options) {
        this.apiKey = options.apiKey;
        this.baseUrl = options.baseUrl;
    }

    getData(options) {
        const url = `${this.baseUrl}/data?apiKey=${this.apiKey}`;
        // optionsに対して、URLのクエリパラメータを生成する処理を行う
        // ...
        // APIを呼び出す処理を行う
        // ...
    }
}

const client = new APIClient({
    apiKey: 'your-api-key',
    baseUrl: 'https://example.com'
});

client.getData({
    // APIに渡すオプションを指定する
    // ...
});

このように、APIに対応するクラスを作成し、それぞれのオプションをクラスのプロパティとして定義することで、APIを呼び出す際に、インスタンスを生成し、プロパティを設定することで、オプションを指定することができます。
また、APIを呼び出すメソッドをクラスに定義することで、呼び出し側がわかりやすくなります。

インスタンスを生成するときにたくさんのプロパティを設定しないといけなくなるのは読みづらくないですか?

インスタンスを生成する際に、たくさんのプロパティを設定することは、読みづらくなる可能性があります。 そこで、利用するプロパティが多い場合は、configオブジェクトを使用し、それを使って初期化することで、インスタンス生成時に渡す引数の数を減らすことができます。

class APIClient {
    constructor(config) {
        this.apiKey = config.apiKey;
        this.baseUrl = config.baseUrl;
        this.otherOption = config.otherOption;
    }

    getData(options) {
        const url = `${this.baseUrl}/data?apiKey=${this.apiKey}`;
        // optionsに対して、URLのクエリパラメータを生成する処理を行う
        // ...
        // APIを呼び出す処理を行う
        // ...
    }
}

const client = new APIClient({
    apiKey: 'your-api-key',
    baseUrl: 'https://example.com',
    otherOption: 'value'
});

また、必要なプロパティだけを指定したい場合は、デフォルト値を設定することで、インスタンス生成時に渡す引数を減らすことができます。

class APIClient {
    constructor(config) {
        this.apiKey = config.apiKey || "default_api_key";
        this.baseUrl = config.baseUrl || "default_base_url";
        this.otherOption = config.otherOption || "default_value";
    }

    getData(options) {
        const url = `${this.baseUrl}/data?apiKey=${this.apiKey}`;
        // optionsに対して、URLのクエリパラメータを生成する処理を行う
        // ...
        // APIを呼び出す処理を行う
        // ...
    }
}
const client = new APIClient({
    apiKey: 'your-api-key',
    baseUrl: 'https://example.com'
});

これにより、必要なプロパティだけを指定することで、インスタンス生成時に渡す引数を減らすことができます。

this.apiKey = config.apiKey || "default_api_key"; このコードの解説をお願いします

このコードは、APIClientクラスのインスタンス生成時に渡されたconfigオブジェクトから、apiKeyプロパティを取得し、それをインスタンスのプロパティとして設定しています。もしconfigオブジェクトにapiKeyプロパティが存在しない場合、その場合は、"default_api_key"という文字列が代わりに設定されます。

これは、JavaScriptの論理演算子||を使用したものです。||は左辺がtruthyならば左辺の値を、そうでなければ右辺の値を返します。 つまり、config.apiKey || "default_api_key"とすることで、configオブジェクトにapiKeyプロパティが存在すればそれを、存在しなければ"default_api_key"を返すことができます。

これにより、configオブジェクトがapiKeyプロパティを持っている場合はそれを使用し、持っていない場合はデフォルト値を使用することができるため、インスタンス生成時に渡す引数を減らすことができます。

ChatGPT

Posted by sochan