需要の背景
前回の記事「Flutterのダウンロード - 1 | flutter_download_manager のソースコード解析」に続き、flutter_download_managerの使い方と原理を詳しく紹介します。利点と欠点で述べたように、このライブラリは純粋に Dart で実装されており、ダウンロード管理、一時停止、再開、キャンセル、ブレークポイントの再開をサポートしています。1 つの欠点は、ネットワーク ライブラリが dio と強く結合されており、カスタム ネットワーク ライブラリ拡張をサポートしていないことです。
「dio はとても素晴らしいのに、なぜそれを直接使用しないのですか? なぜ他のネットワーク ライブラリをサポートする必要があるのですか? 何もすることがないならいじる必要はありません。」と言う人もいます。
私は言いたい:
- 世界には複数の声があり、そうでなければ退屈になってしまいます。
- サードパーティのライブラリはアプリケーション自体にとってブラックボックスであり、開発者はよほどのことがない限り機能変更がアプリケーションに与える影響に注意を払わないことが多く、この制御不能な状況には注意が必要です。
- 設計は DIP 原則に従っています。抽象化は特定の実装の詳細に依存すべきではありません。特定の詳細は抽象化に依存します。dio に直接依存するのではなく、プロジェクトに依存する抽象ネットワーク層が必要です。
- 他のネットワーク ライブラリにすばやく切り替えます。
この記事では現在の状況から始めて、flutter_download_manager のネットワーク ライブラリを分離する方法を段階的に説明します。
現状報告
flutter_download_manager クラスの設計プロセスをクラス図から全体的に理解し、dio の強結合をまとめ、コードを通して詳しく説明します。
クラス図の実施形態
コードの反映
結合点 1: dio.CancelToken
dio:CancelToken は、各ダウンロード タスク リクエストで使用され、dio ネットワーク ライブラリを通じてタスクキャンセル機能を間接的に実装します。
結合点 2: dio.download
cancelToken.cancel() は CancelToken に依存します
上記の短縮コードに示すように、呼び出しチェーンの関係、最終的な呼び出しチェーン、および dio への依存関係の概要は次のとおりです。
ダウンロード ライブラリの dio への依存関係は次のとおりです: CancelToken とダウンロード メソッド。
ネットワークライブラリをカスタマイズする方法
上記の現状の分析と要約を、設計の基本原則と組み合わせることで、パッケージングの変更により、変更されていないものと変更されたものを分離することができます。変更点はネットワークライブラリのダウンロード、CancelToken、キャンセル機能です。変更のこの部分のみがカプセル化され、ネットワーク ライブラリのダウンロードとトークンは抽象化されてカプセル化されます。
1. ネットワーク層の設計
目的: flutter_download_manager を dio.download から分離します。
アイデア: ネットワーク関連の操作をインターフェイスに抽象化し、依存関係を downloadManager オブジェクトに注入します。
実装手順:
- 抽象的なネットワーク層インターフェイス
ダウンロードが Future でオブジェクトを返すことを考慮すると、response.statusCode が使用されるため、ここでは Dynamic が直接使用され、具体的には、これを改良して、statusCode 属性を含む DownloadResponse にカプセル化できます。
- Customhttpclient は依存関係注入によって DownloadManager に渡されるため、特定の実装に依存せず抽象化に依存し、依存関係注入によってオブジェクト間の結合関係が実現され、スケーラビリティが向上します。
2. CancelTokenの設計
目的: flutter_download_manager を dio.CancelToken から切り離します。
アイデア: CancelToken はメッセージの取得と密接に関連しているため、downloadmanager での一時停止などのメソッドで使用するために cancel メソッドを提供する必要があります。各 Custom_http_client の CancelToken 構造が異なることと、キャンセル メソッドの命名規則の多様性を考慮して、統合された DownloadCancelToken インターフェイスがここで設計されており、キャンセル メソッドを提供し、特定のネットワーク ライブラリの CancelToken オブジェクトへの実装をプロキシします。
実装手順:
- Token オブジェクトを抽象化し、cancel メソッドを提供し、デフォルトで他のネットワーク ライブラリをプロキシする Proxy クラスを実装します。
ヒント: Function.apply は、位置パラメーターとオプションのパラメーターの受け渡しをサポートしているため、これを使用します。
- Custom_http_client は、外部使用のために DownloadCancelToken 抽象インターフェイスを抽象化します。
3. ダウンローダーの設計
目的: downloadmanager の特定の実装からダウンローダーを分離する
アイデア: downloadmanager は、addDownload やダウンロード管理ロジックの抽象化などの一般的なダウンロード メソッドを提供します。この存在の変化はさまざまな方法で実装でき、また抽象化されます。
実装手順:
- ダウンローダーはインターフェースに抽象化されています
- downloadManager は IDownloader に依存します
この時点で、カスタマイズ可能なネットワーク ライブラリの変換が完了し、DIO ネットワークの分離を実装できるようになります。
ネットワークライブラリ分離効果
依存関係注入を通じて DownloadManager に注入するだけです。
これで、flutter_download_manager のネットワーク ライブラリの拡張と変換が完了し、カスタマイズ可能なネットワーク フレームワークのダウンロード ライブラリが実装されました。
要約する
オープニングとクロージングの原則を実装する前に、最も重要なことは、最小限の実装モデルに基づいてコード内の変更と不変性を明確にすることです。
❤️この記事は元々 Programming Blackboardによって書かれたものです。同じ名前の公開アカウントのフォローを歓迎します。オリジナルの技術記事はできるだけ早く公開されます❤️