検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptを深く理解するシリーズ(22):S.O.L.I.Dの5原則の依存関係反転原理DIPを詳しく解説_基礎知識

はしがき

この章で説明するのは、S.O.L.I.D JavaScript 言語実装の 5 つの原則のうちの 5 つ目である依存関係反転原則 LSP (依存関係反転原則) です。

英語原文:http://freshbrewedcode.com/derekgreer/2012/01/22/solid-javascript-the-dependency-inversion-principle/
依存関係逆転の原則

依存関係逆転の原理の説明は次のとおりです:

A. 高レベルのモジュールは低レベルのモジュールに依存すべきではありません。
高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方とも抽象化に依存する必要があります

B. 抽象化は詳細に依存すべきではありません。
抽象化は詳細に依存すべきではなく、詳細は抽象化に依存する必要があります
依存性反転原則の最も重要な問題は、アプリケーションまたはフレームワークの主要コンポーネントが、重要ではない低レベル コンポーネント実装の詳細から確実に切り離されることです。これにより、プログラムの最も重要な部分が変更の影響を受けないようになります。低レベルのコンポーネントで。

この原則の最初の部分は、高レベル モジュールと低レベル モジュール間の結合方法についてです。従来の分割アーキテクチャでは、高レベル モジュール (プログラムのコア ビジネス ロジックをカプセル化する) は常に何らかの低レベル モジュールに依存します。 -レベルのモジュール (いくつかの基本的なポイント)。依存関係逆転の原則を適用すると、関係が逆転します。低レベル モジュールに依存する高レベル モジュールとは異なり、依存関係の反転により、低レベル モジュールは高レベル モジュールで定義されたインターフェイスに依存します。たとえば、プログラムのデータを永続化する場合、従来の設計では、コア モジュールが永続化モジュールの API に依存し、依存関係逆転の原則に従って再構築した後、コア モジュールで永続化 API インターフェイスを定義する必要があります。永続化実装インスタンスは、コア モジュールによって定義されたこの API インターフェイスを実装する必要があります。

原則の 2 番目の部分では、抽象化と詳細の間の正しい関係について説明します。この部分を理解するには、C 言語を理解しておくと、その適用性がより明らかになるため、より役立ちます。

一部の静的型付け言語とは異なり、C にはインターフェイスを定義するための言語レベルの概念がありません。C では、クラスはヘッダー ファイルの形式で定義されます。ソースファイルが実装する必要があるクラスメンバーのメソッドと変数。すべての変数とプライベート メソッドはヘッダー ファイルで定義されるため、実装の詳細を抽象化するために使用できます。クラスの実装には、インターフェイスの概念を使用して、抽象メソッド (C の抽象基本クラス) のみを定義することで実装されます。

DIP と JavaScript

JavaScript は動的言語であるため、分離するために抽象化する必要はありません。したがって、抽象化が詳細に依存すべきではないという変更は JavaScript には大きな影響を与えませんが、高レベルのモジュールが低レベルのモジュールに依存すべきではないという大きな影響はあります。

静的型付け言語のコンテキストで依存関係逆転の原理を議論する場合、結合の概念には意味論的および物理的結合が含まれます。つまり、上位モジュールが下位モジュールに依存する場合、意味インターフェイスを結合するだけでなく、下位モジュールで定義された物理インターフェイスも結合します。言い換えれば、高レベルのモジュールはサードパーティのライブラリから分離するだけでなく、ネイティブの低レベル モジュールからも分離する必要があります。

これを説明するには、.NET プログラムに、低レベルの永続化モジュールに依存する非常に便利な高レベルのモジュールが含まれていると想像してください。作成者が同様のインターフェイスを永続性 API に追加する必要がある場合、依存関係逆転の原則が使用されているかどうかに関係なく、低レベル モジュールの新しいインターフェイスを再実装しない限り、高レベル モジュールを他のプログラムで再利用することはできません。

JavaScript では、依存関係逆転の原則の適用は、高レベルのモジュールと低レベルのモジュール間のセマンティックな結合に限定されます。たとえば、DIP は、低レベルで定義された暗黙的なインターフェイスを結合する代わりに、必要に応じてインターフェイスを追加できます。モジュール。

これを理解するために、次の例を見てみましょう:

コードをコピー コードは次のとおりです:

$.fn.trackMap = 関数(オプション) {
    var のデフォルト = {
        /* デフォルト */
    };
    options = $.extend({}, デフォルト, オプション);

var mapOptions = {
        中央: 新しい google.maps.LatLng(options.latitude,options.longitude),
        ズーム: 12、
        MapTypeId: google.maps.MapTypeId.ROADMAP
    }、
        map = new google.maps.Map(this[0], mapOptions),
        pos = new google.maps.LatLng(options.latitude,options.longitude);

var marker = new google.maps.Marker({
        位置: pos、
        タイトル: options.title,
        アイコン: options.icon
    });

marker.setMap(map);

options.feed.update(function(緯度, 経度) {
        マーカー.setMap(null);
        var newLatLng = new google.maps.LatLng(緯度, 経度);
        marker.position = newLatLng;
        マーカー.setMap(マップ);
        map.setCenter(newLatLng);
    });

これを返します;
};

var updater = (function() {
    // プライベート プロパティ

return {
        更新: 関数(コールバック) {
            updateMap = コールバック;
        }
    };
})();

$("#map_canvas").trackMap({
    緯度: 35.044640193770725、
    経度: -89.98193264007568、
    アイコン: 'http://bit.ly/zjnGDe',
    タイトル: '追跡番号: 12345'、
    フィード: アップデータ
});

上記のコードでは、現在追跡されている位置情報を表示するために、1 つの DIV を Map に変換する小型の JS クラスがあります。trackMap 関数は、3 番目の Google Maps API と Location feed の 2 つの依存関係があります。これは、アイコンの位置が更新されるときにコールバックを使用して(初期化時に提供される)、緯度および精度経度を転送します。Google Maps API は、インターフェイスを汚染するために使用されます。

フィード オブジェクトのインターフェイスは、装備されている可能性もありますが、装備されていない trackMap 関数の要求を解除する設定も可能です。実際、他の角の色は非常に個別であり、単一の異なる実装では不要であり、Google マップに依存しています。このメッセージには Google Maps API が組み込まれており、異なる地表プロバイダーを切り替える必要がある場合に、異なるプロバイダーに適合できるように trackMap 関数を書き換えることができます。

Google マップのクラスの会話を翻訳するには、トラックマップ関数を再書き込みして、1 つのインターフェイス (抽象化された地形図提供プロバイダのインターフェイス) に会話を合わせる必要があります。 Google Maps API の 1 つのオブジェクト、次のように再構築後の trackMap 関数:


复制代码代码如下:

$.fn.trackMap = 関数(オプション) {
var のデフォルト = {
/* デフォルト */
};

オプション = $.extend({}, デフォルト, オプション);

options.provider.showMap(
これ[0]、
オプション.緯度、
オプション.経度、
オプション.アイコン、
options.title);

options.feed.update(function(緯度, 経度) {
options.provider.updateMap(緯度, 経度);
});

これを返します;
};

$("#map_canvas").trackMap({
緯度: 35.044640193770725、
経度: -89.98193264007568、
アイコン: 'http://bit.ly/zjnGDe',
タイトル: '追跡番号: 12345'、
フィード: アップデーター、
プロバイダ: trackMap.googleMapsProvider
});


このバージョンでは、trackMap 関数と必要なマップ プロバイダー インターフェイスを再設計し、実装の詳細を別の googleMapsProvider コンポーネントに移動しました。このコンポーネントは、別の JavaScript モジュールに個別にパッケージ化できます。以下は私の googleMapsProvider 実装です:
コードをコピー コードは次のとおりです:

trackMap.googleMapsProvider = (function() {
var マーカー、マップ;

リターン {
showMap: function(要素, 緯度, 経度, アイコン, タイトル) {
var mapOptions = {
中央: 新しい google.maps.LatLng(緯度、経度)、
ズーム: 12、
mapTypeId: google.maps.MapTypeId.ROADMAP
},
pos = new google.maps.LatLng(緯度, 経度);

マップ = new google.maps.Map(element, mapOptions);

マーカー = new google.maps.Marker({
位置: pos、
title: タイトル,
アイコン: アイコン
});

マーカー.setMap(map);
}、
updateMap: function(緯度, 経度) {
marker.setMap(null);
var newLatLng = new google.maps.LatLng(緯度,経度);
marker.position = newLatLng;
marker.setMap(map);
map.setCenter(newLatLng);
}
};
})();


上記の変更を加えた後、trackMap 関数は非常に柔軟になり、Google Maps API に依存する必要がなくなります。逆に、他の地図プロバ​​イダーを自由に置き換えることができるため、状況に応じてどのような地図プロバ​​イダーにも適応できるようになります。プログラムのニーズ。

依存性注入はいつ行われますか?

少し無関係です。実際、依存性注入の概念は依存性反転の原理と混同されることがよくありますが、この違いを明確にするために次のように説明する必要があります。

依存関係の注入は、制御反転の特殊な形式であり、コンポーネントが依存関係を取得する方法を意味します。依存関係の挿入とは、コンポーネントが依存関係を取得するのではなく、依存関係がコンポーネントに提供されることを意味します。これは、依存関係のインスタンスを作成し、ファクトリを通じて依存関係を要求し、サービス ロケーターまたはコンポーネント自体の初期化を通じて依存関係を要求することを意味します。依存関係反転の原則と依存関係の注入はどちらも依存関係に焦点を当てており、反転に使用されます。ただし、依存関係逆転の原則は、コンポーネントが依存関係を取得する方法には焦点を当てておらず、高レベルのモジュールが低レベルのモジュールからどのように分離されるかにのみ焦点を当てています。ある意味、依存性反転の原則は、制御反転の別の形式です。ここで反転されるのは、どのモジュールがインターフェイスを定義するかということです (低レベルの定義から高レベルの定義へ)。

概要

これは 5 つの原則の最後の記事です。この 5 つの記事では、JavaScript でのさまざまな原則をさまざまな観点から説明しました。 (おじさん注:実は、ちょっと地味ではあるものの、別のレベルから見ると、一般原則は実はどの言語でも同じなんじゃないかと感じています。)

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン