第16章. 関数へのインタフェース
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
Javaでは、ある機能を定義するコードとそれを必要とするコードとの間の契約を指定するためにインタフェースを使用する。 これらのインタフェースは両者を結合させるため、ソフトウェアを保守しにくくする可能性がある。 関数型はこの問題をどのように解決するのだろうか?
もし 、あなたが書いているコードからメールを送信する必要があると想像してみてほしい。 メールを受信したり、送信されたメッセージをリストアップしたりするのではなく、とりあえずメールを送信し、忘れるだけだ。
電子メールを記述するコードは簡単だ:
dataclass(valto:EmailAddress,valfrom:EmailAddress,valsubject:String,valbody:String)
Email が与えられたら、クライアントコードはそれを送信するために最も単純な関数を呼び出したい:
funsend(:){...}
もちろん、この関数を実装しようとすると、実際にメールを送信するためには、他にもいろいろな情報が必要であることがわかる。 メールそのものに関する情報ではなく、メールの送信方法に関する設定である。 送信サーバのホスト名やセキュリティ資格情報など、技術者ではない親戚は知らないが、彼らの新しいコンピュータをセットアップするために必要なものすべてである。 このようなすべての設定のために、sendEmail に3つのパラメータを追加することにする:
funsendEmail(:,serverAddress:InetAddress,username:String,password:String){...}
クライアントとしては、利便性が大幅に低下してしまった。 メールを送りたいところはすべて、この設定を知っていなければならない。 コードベースの上から下まで、この設定を受け渡すことになるのだ。 グローバル変数に詳細を隠すことでこの問題を解決するのは、単体テストスイートを実行するたびに50通のメールが送信されることに気づくまではうまくいく! このような些細な詳細を隠す、もっと良い方法があるはずだ。
オブジェクト指向カプセル化
オブジェクト指向言語 には、この問題に対する解決策が用意されている。オブジェクトがデータをカプセル化できるのだ:
classEmailSender(privatevalserverAddress:InetAddress,privatevalusername:String,privatevalpassword:String){funsend(:){sendEmail(,serverAddress,username,password)}}
Eメールを送りたいときは、(静的関数ではなく)EmailSender 。EmailSender 、関数を呼び出す代わりにメソッドを呼び出す。メソッドに細かいことを伝える必要はない:
// Where we know the configurationvalsender:EmailSender=EmailSender(inetAddress("smtp.travelator.com" ...