F# スタイル ガイド
次の記事では、F# コードを書式設定するためのガイドラインと、言語の機能の時事的なガイドとその使用方法について説明します。
このガイドは、さまざまなプログラマのグループで使用されている F# の大規模なコードベースでの使用に基づいて作成されています。 このガイドにより、一般的に F# を正しく使用できるようになり、時間の経過に伴ってプログラムに対する要件が変化した場合の不満を最小限に抑えることができます。
F# コードを記述する場合、特に時間の経過と共に変化するシステムでは、常に次の原則に留意する必要があります。 以降の記事に記載されているそれぞれの全説明は、次の 5 つの点を基にしています。
優れた F# コードは、簡潔で、わかりやすく、組み立てることが容易である
F# には、少ないコード行でアクションを表現したり、一般的な機能を再利用したりするための機能が多数あります。 F# のコア ライブラリには、一般的なデータ コレクションを操作するのに便利な型および関数も多数含まれています。 F# でプログラミングする場合の決まりきった慣用的な手順の 1 つには、自分独自の関数と、F# コア ライブラリ (またはその他のライブラリ) の関数の構成があります。 一般に、ある問題に対する解決策を少ないコード行で表現した場合、他の開発者 (または将来の自分) にとってメリットになります。 重要なタスクを実行する場合、FSharp.Core などのライブラリ、F# が実行される膨大な量の .NET のライブラリ、または NuGet のサードパーティ製のパッケージを使用することも強く推奨されます。
優れた F# コードは相互運用できる
さまざまな言語でコードを使用できるようにするなど、相互運用にはさまざまな形態があります。 他の呼び出し元によって相互運用されるあなたのコードの境界は、その呼び出し元でも F# が使用されている場合でも、必ず正確である必要がある重要な部分です。 F# でコードを記述する場合、C# コードなどの別の言語で行う場合も含め、あなたが記述するコードが他のコードからどのように呼び出されるかを常に考える必要があります。 相互運用性の詳細については、「F# コンポーネント デザインのガイドライン」で説明しています。
優れた F# コードはオブジェクト指向ではなく、オブジェクト プログラミングを活用している
F# でのプログラミングでは、クラス、インターフェイス、アクセス修飾子、抽象クラスなど、.NET のすべてのオブジェクトがサポートされています。 コンテキスト対応にする必要がある関数など、より複雑な関数型のコードの場合、オブジェクトでは、関数ではできない方法で簡単にコンテキスト情報をカプセル化できます。 省略可能なパラメーターなどの機能およびオーバーロードを慎重に使用することにより、この機能を呼び出し元で簡単に利用できます。
優れた F# コードは変更を公開しないでうまく動作する
パフォーマンスの高いコードの記述に変更の使用が不可欠であるということは、周知の事実です。 結局のところ、それがコンピューターが動作するしくみです。 このようなコードは多くの場合、エラーを起こしやすく、正すのは困難です。 呼び出し元には変更は公開しないようにしてください。 パフォーマンスが重要な場合には、代わりに変更ベースの実装を表示しない機能インターフェイスを構築してください。
優れた F# コードはツールで使用できる
ツールは、大規模なコードベースで作業するうえで計り知れない価値があるため、F# コードは、F# 言語のツールでより効果的に使用できるよう記述します。 一例として、デバッガーで中間値を調べることができるように、ポイントフリー スタイルを使用してプログラミングし過ぎないようにすることがあります。 別の例には、コンストラクトを説明する XML ドキュメントのコメントを使用して、呼び出しサイトのエディターのツールヒントでそれらのコメントを表示できるようにすることがあります。 他のプログラマが使用するツールで、自分のコードがどのように読み取られ、ナビゲーションされ、デバッグされ、操作されるかを常に考慮してください。
「F# コードのフォーマットに関するガイドライン」では、コードを読みやすく書式設定する方法について説明しています。
「F# のコーディング規則」では、F# の大規模なコードベースを長期保守する場合に助けとなる F# でのプログラミングのイディオムについて説明しています。
「F# コンポーネント デザインのガイドライン」では、ライブラリなどの F# コンポーネントの作成について説明しています。