低レベルの設計と SOLID 原則

Oct 02, 2024 am 06:18 AM

低レベル設計 (LLD) は、高レベル設計と実際の実装の間のギャップを埋める、ソフトウェア開発における重要なフェーズです。高レベルの設計はアーキテクチャの設計図に焦点を当てますが、LLD はシステム全体の要件を満たすために各コンポーネント、クラス、または機能がどのように実装されるかを扱います。

もっと簡単に言うと、LLD には、クラス、メソッド、インターフェイス、およびそれらの間の相互作用の設計が含まれ、コードが効率的で、保守可能で、スケーラブルであることを保証します。これは、ソフトウェア エンジニアにとって、特に堅牢で再利用可能であり、長期にわたって簡単に変更できる必要があるシステムを構築する場合に不可欠なスキルです。

このブログでは、低レベル設計に関連する重要な概念、原則、テクニックを紹介し、それらがより優れた、より保守しやすいコードを作成するのにどのように役立つかを示します。

私たちの頭に浮かぶ最初の質問は次のとおりです:

低レベル設計が重要なのはなぜですか?

  1. 保守性: よく考えられた設計により、コードの保守、拡張、デバッグが容易になります。不適切な設計は技術的負債につながり、将来の変更にコストがかかります。
  2. スケーラビリティ: 優れた LLD により、パフォーマンスの点でも、システムの進化に伴う新機能のサポートの点でも、コードがスケーラブルであることが保証されます。
  3. 再利用性: 適切に設計されたコンポーネントは、システムのさまざまな部分またはまったく異なるプロジェクトで再利用できます。
  4. 明確さ: 明確に定義された設計により、エンジニアはシステムのさまざまな部分がどのように組み合わされるかを理解でき、コラボレーションが容易になります。

LLD の概念と実際のコードの間のギャップを埋めるために、次の手順に従って低レベルの図を設計するプロセスを詳しく見てみましょう。

ステップ 1:オブジェクト指向の原則
ステップ 2:堅固な原則
ステップ 3: パターンをデザインする

オブジェクト指向の原則

Low level design and SOLID Principles
オブジェクト指向プログラミングの概念 4 つの柱は、低レベルの設計を学習し始めるために必須です。このコンセプトについては、簡単なチェックアウト ブログですでに説明しました

堅実な原則

Low level design and SOLID Principles

S: 単一責任原則 (SRP)

  • コードの各単位は 1 つの責任のみを持つ必要があります。
  • ユニットはクラス、モジュール、関数、またはコンポーネントです。
  • コードのモジュール化を維持し、密結合を軽減します。

例: ユーザー認証とログ記録の両方を処理するクラスを想像してください。ロギングの仕組みを変更する必要がある場合、最終的には認証クラスも変更することになります。これはSRPに違反します。代わりに、2 つの別個のクラスを用意する必要があります。1 つはユーザー認証用、もう 1 つはログ記録用であり、各クラスが 1 つの責任を負います。

O: オープン/クローズ原則 (OCP)

  • コードのユニットは拡張に対してオープンである必要がありますが、変更に対してはクローズされている必要があります。
  • 既存のコードを変更するのではなく、新しいコードを追加して機能を拡張します。
  • React フロントエンドなどのコンポーネントベースのシステムで役立ちます。

例: クレジット カードによる支払いを処理する支払い処理システムを考えてみましょう。 PayPal のサポートを追加する必要がある場合は、既存のコードを変更するのではなく、PayPal 支払い用の新しいクラスを追加してコードを拡張する必要があります。これにより、既存のシステムが安定した状態を維持しながら、新しい機能を追加できるようになります。

L: リスコフ置換原理 (LSP)

  • サブクラスは、基本クラスの代わりに使用できる必要があります。
  • 基本クラスの機能はすべてのサブクラスで使用できる必要があります。
  • サブクラスが基本クラスの機能を使用できない場合、そのサブクラスを基本クラスに含めるべきではありません。

例: fly() メソッドを持つ Bird クラスがあり、飛行できないサブクラス Penguin を作成すると、LSP に違反します。予想される動作が変更されるため、Penguin クラスは fly() を継承しないでください。代わりに、異なる方法で飛べる鳥と飛べない鳥を処理できるように、Bird クラスをリファクタリングする必要があります。

I: インターフェース分離原則 (ISP)

  • いくつかの汎用インターフェイスではなく、複数の特定のインターフェイスを提供します。
  • クライアントは、使用していないメソッドに依存すべきではありません。

例: メソッド fly()、swim()、walk() を持つインターフェース Animal があるとします。 Animal を実装するクラス Dog は、必要のない fly() を定義する必要があります。 ISP に準拠するには、Animal インターフェイスを Flyable、Swimmable、Walkable などの小さなインターフェイスに分割して、クラスに無関係なメソッドを強制しないようにする必要があります

D: 依存性反転原則 (DIP)

  • 具象クラスではなく抽象化に依存します。
  • 抽象化を使用して、システムの部分間の依存関係を分離します。
  • インターフェイスまたは抽象化を使用するコード単位間の直接呼び出しは避けてください。

例: 電子商取引アプリケーションで、チェックアウト プロセス (高レベル モジュール) が PayPal などの特定の支払いゲートウェイ (低レベル モジュール) に直接依存している場合、支払いゲートウェイを変更するには、チェックアウト プロセスを変更する必要があります。 PaymentProcessor インターフェースなどの抽象化を導入することで、PayPal やその他のサービスの詳細を知らなくても、チェックアウト プロセスはあらゆる支払い方法で機能します。

デザインパターン

設計パターンは、ソフトウェア設計で発生する一般的な問題に対する実証済みの解決策です。これらは、開発者が特定の設計上の問題を効率的かつ体系的に解決するために従うことができるベスト プラクティスです。車輪の再発明ではなく、デザイン パターンは、繰り返し発生する問題を解決するための標準的なアプローチを提供します。

デザインパターンは次の 3 つのタイプに分類できます。

  1. 作成パターン: オブジェクトの作成を処理します

    • 工場設計パターン
    • 抽象的な工場設計パターン
    • ビルダーデザインパターン
    • プロトタイプのデザインパターン
    • シングルトンデザインパターン
  2. 構造パターン: オブジェクトの構成と関係を扱う

    • アダプターパターン
    • ブリッジパターン
    • 複合パターン
    • デコレータパターン
    • ファサードパターン
    • フライウェイトパターン
    • プロキシ パターン
  3. 行動パターン: オブジェクトの相互作用と責任に対処する

    • 責任連鎖パターン
    • コマンドパターン
    • インタープリターパターン
    • 仲介者のパターン
    • 思い出のパターン
    • オブザーバーパターン
    • 状態パターン
    • 戦略パターン
    • テンプレートメソッドパターン
    • 訪問者のパターン

SOLID 原則を探求して基礎を築き、デザイン パターンの広大な状況を紹介したので、さらに深く掘り下げる準備が整いました。今後のシリーズでは、実用的な例と実際のシナリオを使用して、各設計パターンを詳しく説明します。設計の取り組みを始めたばかりの場合でも、スキルを磨きたいと考えている場合でも、これらのパターンは、よりクリーンでスケーラブルなコードを作成するのに役立ちます。最初のデザイン パターンを段階的に解明する次回のブログをお楽しみに!

ここまで読み進めたら、忘れずに「いいね!」を押して、質問や意見があれば下にコメントを残してください。あなたのフィードバックは私にとってとても大切なものです。ぜひお聞かせください!

以上が低レベルの設計と SOLID 原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Python vs. JavaScript:ユースケースとアプリケーションと比較されます Python vs. JavaScript:ユースケースとアプリケーションと比較されます Apr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

See all articles