2024/01/25
TypeScriptでは、Pythonのような関数呼び出し時に引数名を使って「名前=値」の形式で引数を指定することができません。 でも、 Options Objectパターンを使って、似たような実装をすることができます。
https://typescriptbook.jp/reference/functions/keyword-arguments-and-options-object-pattern
そして、 js.langchain のコードを見ていたら、これが、たくさん、使われてました。 例えば、以下のようなコードです。
export interface BaseLangChainParams {
verbose?: boolean;
callbacks?: Callbacks;
tags?: string[];
metadata?: Record<string, unknown>;
}
export abstract class BaseLangChain<...> extends Runnable<...>
implements BaseLangChainParams
{
verbose: boolean;
callbacks?: Callbacks;
tags?: string[];
metadata?: Record<string, unknown>;
constructor(params: BaseLangChainParams) {
super(params);
this.verbose = params.verbose ?? getVerbosity();
this.callbacks = params.callbacks;
this.tags = params.tags ?? [];
this.metadata = params.metadata ?? {};
}
...
引数の型が同じものが連続していると、引数を指定する順番を間違って、バグになることがあります。 でも、上記の実装方法だと、それを防げます。
const chain = new BaseLangChain({
verbose: false,
tags: ['hoge'],
metadata: { fuga: false, piyo: 'PIYO' },
});
Options Objectパターンというのを知らなかったので、最初見たときに、なんのために、Xxxx クラスと XxxxParams という interface を 実装するのか疑問だったのだけど、Options Objectパターンというプログラミングのベストプラクティスに則っているのだと、わかりました。 TypeScript や Java のように名前付き引数がない言語で、引数が多いときに、このパターンが、役に立ちそうです。 interfaceの実装が必要で、少し冗長になるので、引数が多いときに限定して使うと良いように思います。
ご参考まで。
関連記事
- 2023/10/17 コードの品質を測定する方法 コードの品質を測定する方法が紹介されていました。計測の自動化に向けて、少しまとめてみました。
- 2023/01/26 デメテルの法則 「直接の友達とだけ話すこと」というプログラミングのお約束です
- 2020/06/15 PySparkの分散される処理単位であるクロージャと共有変数の仕組み Spark では、処理が分散されて、複数のノードやスレッドで実行されますが、分散される処理の塊を、どう配信しているのか?加えて、複数のタスク間でのデータの共有とか、集約するための仕組みがどうなっているのか?少しだけ説明します。
- 2019/09/24 「オブジェクト指向エクササイズ」でクセの強いコードを矯正しよう よくできたコードは、パッと見で、”なんか違う”と感じさせるところがあり、あぁ、このコードを書いた人はデキるって思わせるものですが、そんなコードを書くためには、どうしたらよいんでしょうか?そのヒントが「オブジェクト指向エクササイズ」にあります。
- 2018/07/18 全文検索を自社サイト・社内サーバーに構築したいクライアントのための留意点 システム開発における「全文検索」の実装方式・コスト・性能に関して、クライアント企業の方にも腹落ち頂けるようまとめました。grep型と索引型の違いに関する平易な解説を記載しているので、これらをクライアントに解説されたい開発者にもオススメです。