第11章. 関数フレンドリーのOOP
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
最近のプログラムは非同期プログラミングを必要とする。最近のサーバはこれまで以上にスケーラブルでなければならないし、エンドユーザのアプリケーションはこれまで以上にレスポンスが良くなければならない。開発者は非同期プログラミングを学ばなければならないことを発見しているが、この世界を探求するうちに、慣れ親しんだ伝統的なオブジェクト指向プログラミングと衝突することが多いことに気づく。
その理由の核心は、非同期プログラミングが機能的だからである。関数型」というのは「関数として機能する」という意味ではなく、手続き型プログラミングではなく関数型プログラミングスタイルであるという意味だ。多くの開発者は大学で関数型プログラミングの基礎を学んだが、それ以来ほとんど触れていない。もし、(car (cdr '(3 5 7))) のようなコードを見て、抑圧された記憶がよみがえって寒気がするのなら、あなたはその部類に入るかもしれない。しかし恐れることはない。現代の非同期プログラミングは、慣れればそれほど難しくはない。
async 、大きなブレークスルーは、非同期プログラミングをしながらも手続き的に考えることができるということだ。これにより、非同期メソッドが書きやすく、理解しやすくなった。しかし、その裏側では、非同期コードは依然として機能的な性質を持っており、async メソッドを古典的なオブジェクト指向設計に無理やり組み込もうとすると、いくつかの問題が発生する。この章のレシピは、非同期コードがオブジェクト指向プログラミングと衝突する摩擦点に対処するものである。
これらの摩擦点は、既存のOOPコードベースをasync-フレンドリーなコードベースに変換するときに特に顕著になる。
11.1 非同期インタフェースと継承
問題
、非同期にしたいメソッドがインタフェースや基底クラスにある。
解決策
この問題とその解決策を理解する鍵は、async が実装の詳細であることを理解することである。async キーワードは実装を持つメソッドにしか適用できない。抽象メソッドやインタフェース・メソッドに適用することはできない(デフォルトの実装がある場合を除く)。しかし、async キーワードがないだけで、async メソッドと同じシグネチャを持つメソッドを定義することはできる。
型は メソッドではなく、待ち受け可能であることを忘れてはならない。メソッドが返すTask は、そのメソッドがasync を使って実装されているかどうかにかかわらず、await することができる。つまり、インタフェースや抽象化メソッドはTask (またはTask<T> )を返すことができ、そのメソッドの戻り値は待ち受け可能である。
次のコードは、非同期メソッドを持つインターフェイス(async キーワードなし)、そのインターフェイスの実装(async )、インターフェイスのメソッドを消費する独立したメソッド(await )を定義している:
interfaceIMyAsyncInterface{Task<int>CountBytesAsync(HttpClientclient,stringurl);}classMyAsyncClass:IMyAsyncInterface{publicasyncTask<int>CountBytesAsync ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access