私はf#とHaskellを使用して、しばらくの間関数プログラミングを学んでいます。私は私の会社で承認されたf#を得るまで、私はまだC#を使わなければなりません。私はまだいくつかの利点に気づいたように機能的なスタイルにとどまるように努めています。OOから10,000フィートの関数プログラミングへ
これは一般的な問題です。
- 3つのキー(650万 行)
- 媒体サイズに小の4つの他の支持 テーブルがあると データベース内のキーセットテーブルがあります。
- いくつかの入力に基づく複雑な数式があります。
上記のすべてのデータを使用して値を計算し、それを各キーセット行に関連付けてデータベースに戻す必要があります。他の4つのテーブルには多くのルックアップがあります。パフォーマンスのために、すべてがメモリ内で行われます。
私は静的な辞書、オブジェクトモデル、戦略パターンなどでオブジェクト指向で行う方法を正確に知っていますが、機能的な方法ではこれらの構文のいくつかを使用する悪い匂いを取り除くことはできません。
私は現在、機能的な解決策について以下の前提を定めています。
スタティック辞書が不良です。それは機能が副作用を持つことができるようだ。
私はCalculate関数が必要です。不変なオブジェクトをとり、3つのキーと計算された値を持つ不変なオブジェクトを返します。この関数の中には同じスタイルの別の関数があるかもしれません。
伝統的なOOパターンは、おそらく動作しません。
これをどのように高レベルで設計しますか?
私は間違っていますか?私は何かを見逃しましたか?
問題のOO言語に依存します。 C#は機能的なテクニックではかなり良い仕事をしています。そして、Javaのようなもっと難解な柔軟なオブジェクト指向言語では、かなり機能的な方法でいくつかのことを行うことができますが、その場合にはかなりの量の認知的摩擦があります。 – JasonTrue
何か機能的なことをしようとすると、Java環境にある場合は、Clojureで行うのが最善でしょう。技術的にはLispでMLベースの言語ではありませんが、Javaアプリケーション(JVMバイトコードの生成)を扱い、機能スタイルの開発をサポートすることができます。 –
C#は多くの機能テクニックでフラットになります。非常に限定された型推論は単なるデングブレイカーです。関数のディクショナリなど、いくつかの汎用パラメータを使用する関数の型を書き出してみてください。ああ。 – MichaelGG