Skip to content

ガイドライン

runMainの使用

Effectにおいて、runMainはNode上でEffectアプリケーションを実行するための主要なエントリポイントです。

import { Effect, Console, Schedule, pipe } from "effect"
import { NodeRuntime } from "@effect/platform-node"
const program = pipe(
Effect.addFinalizer(() => Console.log("アプリケーションが終了しようとしています!")),
Effect.andThen(Console.log("アプリケーションが開始されました!")),
Effect.andThen(
Effect.repeat(Console.log("まだ生きています..."), {
schedule: Schedule.spaced("1秒")
})
),
Effect.scoped
)
// Effect.runFork(program) // CTRL+Cでは優雅なクリーンアップなし
NodeRuntime.runMain(program) // CTRL+Cで優雅なクリーンアップ

runMain関数は、すべてのファイバーを見つけて中断する役割を担っています。内部では、sigintをリッスンすることでファイバーのためのオブザーバーが追加され、すべてのファイバーが中断されます。

クリーンアップはメインのエフェクトで行う必要があることに注意してください。アプリケーションやサーバーを実行しているファイバーを終了すると、すべてのクリーンアップが実行されます。これはまさに、platform-nodeパッケージのrunMainが行うことです。

暗黙の使用を避ける

map(f)などの暗黙の関数呼び出しやflowの使用を避ける

Effectでは、ポイントフリーで関数を使うこと、つまり暗黙の使用を避けることが推奨されています。

暗黙の関数を使用することが好ましい場合は自由ですが、それが問題を引き起こす可能性があることを知っておくことが重要です。(x) => fn(x)を使う方が安全です。

特にオプションのパラメータを持つ関数を暗黙的に使用すると、安全性が損なわれる可能性があります。関数にオーバーロードがある場合、暗黙的に使用するとすべてのジェネリックが消えてしまい、バグにつながることがあります。例えば、このXスレッドをチェックしてください: スレッドへのリンク

また、TypeScriptの推論も暗黙的な関数を使用する際には損なわれることがあり、予期しないエラーを引き起こす可能性があります。したがって、単なるスタイルの問題ではなく、ミスを避けるための保護措置でもあります。

さらに、暗黙の使用が関与する場合、スタックトレースが明確でないことがあります。大きな利点がないのにリスクが伴います。特にオプションの引数については、TypeScriptが適切にチェックしない可能性があり、潜在的な問題を引き起こすかもしれません。

特にオーバーロードを持つジェネリック関数に対処する際には、暗黙的に使用せずに試してみる価値があります。暗黙的に使用すると、ジェネリックを失う結果になることがあります。