「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > SOLID をシンプルにする: クリーンなコード原則のための JavaScript ガイド

SOLID をシンプルにする: クリーンなコード原則のための JavaScript ガイド

2024 年 8 月 27 日に公開
ブラウズ:341

Making SOLID Simple: A JavaScript Guide to Clean Code Principles

私が初めてソフトウェア開発の世界に飛び込み始めたとき、飛び交うあらゆる流行語や概念に圧倒されることがよくありました。特に困難に思えた概念の 1 つは、SOLID 原則でした。それは「真剣な」開発者だけが心配する必要があることのように感じました。しかし、コーディングに慣れてくると、これらの原則は派手なことではなく、数カ月後に髪の毛を抜きたくなくなるようなコードを書くことであることがわかりました。

それでは、JavaScript の SOLID 原則についての私の見解をご紹介します。これは、JavaScript を始めるときにあればよかったと思っている、実用的で実用的なガイドです。

1. 単一責任原則 (SRP): 1 つの仕事をうまくやり遂げる

それは何ですか?

単一責任原則では、クラスが変更する理由は 1 つだけであるべきであり、つまり、クラスの仕事または責任は 1 つだけであるべきであると述べられています。

現実のアナロジー

お気に入りのコーヒーショップのバリスタを思い浮かべてください。彼らの仕事はコーヒーを作ることです。突然、エスプレッソマシンを修理したり、ペストリーを提供したり、ゴミを出したりしなければならなくなったら、事態は混乱するでしょう。バリスタがコーヒーを作ることに集中するのと同じように、クラスでも 1 つのことをうまくやることに集中する必要があります。

JavaScript の例:

ユーザー認証、データ検証、データベース ストレージを処理する User クラスがあると想像してください。やりすぎだよ!これらの責任を個別のクラスに分割することで、コードの管理と保守が容易になります。

class UserAuthenticator {
  login(user) {
    // handle login
  }
}

class UserDataValidator {
  validate(user) {
    // validate user data
  }
}

class UserDatabase {
  save(user) {
    // save user to the database
  }
}

2. オープン/クローズド原則 (OCP): 拡張し、変更しない

それは何ですか?

オープン/クローズド原則では、ソフトウェア エンティティは拡張に対してオープンであるが、変更に対してはクローズされるべきであると規定されています。言い換えれば、既存のコードを変更せずに新しい機能を追加できる必要があります。

現実のたとえ:

お気に入りのゲーム機を想像してみてください。新しいゲーム、コントローラー、アクセサリを追加できますが、そのために開いて再配線する必要はありません。同様に、コードのコア構造を変更することなく、コードに新しい機能を追加できる必要があります。

JavaScript の例:

面積を計算するメソッドを備えた Shape クラスがあるとします。三角形などの新しい形状を追加する必要がある場合、既存のクラスを変更する必要はありません。代わりに、それを拡張してください。

class Shape {
  area() {
    throw "Area method not implemented";
  }
}

class Rectangle extends Shape {
  constructor(width, height) {
    super();
    this.width = width;
    this.height = height;
  }

  area() {
    return this.width * this.height;
  }
}

class Circle extends Shape {
  constructor(radius) {
    super();
    this.radius = radius;
  }

  area() {
    return Math.PI * this.radius * this.radius;
  }
}

3. リスコフ置換原則 (LSP): 置換可能にしておく

それは何ですか?

リスコフ置換原則では、プログラムの正確さに影響を与えることなく、スーパークラスのオブジェクトをサブクラスのオブジェクトに置き換えることができる必要があると述べています。

現実のたとえ:

レンタカーを借りることを想像してみてください。セダンでも SUV でも、運転し、操縦し、停止するという車の基本的な機能を備えていることを期待します。レンタカーにまったく異なる制御セットが必要な場合は、大変なことになるでしょう。同様に、サブクラスは、親クラスによって設定された期待を裏切らない方法で動作する必要があります。

JavaScript の例:

Bird クラスとそれを拡張した Penguin クラスがある場合、ペンギンは飛べなくても Bird のように動作するはずです。まだ歩き、食事をし、おそらく泳ぐこともできるはずです。

class Bird {
  move() {
    console.log("Flies in the sky");
  }
}

class Penguin extends Bird {
  move() {
    console.log("Swims in the water");
  }
}

const myBird = new Bird();
const myPenguin = new Penguin();

myBird.move(); // Flies in the sky
myPenguin.move(); // Swims in the water

4. インターフェース分離原則 (ISP): オーダーメイドのインターフェース

それは何ですか?

インターフェイス分離原則は、クライアントが使用しないインターフェイスの実装を強制すべきではないことを示唆しています。 1 つの大きなインターフェイスを用意する代わりに、より小さく、より具体的なインターフェイスを作成する必要があります。

現実のたとえ:

シェフがウェイター、バーテンダー、食器洗い機を兼任するレストランを想像してみてください。それは圧倒的で非効率的です!代わりに、各役割に固有のタスクを持たせる必要があります。同様に、インターフェースも特化され、焦点が絞られたものである必要があります。

JavaScript の例:

buildHouse、paintHouse、designHouse などのメソッドを含む Worker インターフェイスがある場合、家をペイントするだけの Worker は他のすべてのメソッドを実装する必要はありません。それをより小さなインターフェースに分割します。

class Builder {
  build() {
    console.log("Building house...");
  }
}

class Painter {
  paint() {
    console.log("Painting house...");
  }
}

class Designer {
  design() {
    console.log("Designing house...");
  }
}

5. 依存性反転原則 (DIP): 抽象化に依存する

それは何ですか?

依存関係逆転の原則では、高レベルのモジュールが低レベルのモジュールに依存すべきではないと述べています。どちらも抽象化に依存する必要があります。

現実のたとえ:

携帯電話の充電器を壁のコンセントに差し込む方法を考えてみましょう。壁内の電気配線の詳細を知る必要はありません。必要なのは、デバイスに電力を供給するためのインターフェイス (ソケット) だけです。同様に、コードは具体的な実装ではなく、抽象化 (インターフェイス) に依存する必要があります。

JavaScript の例:

Switch クラスを直接制御する LightBulb クラスがある場合、密結合が作成されます。代わりに、両方とも PowerSource.
のようなインターフェイスに依存する必要があります。

class LightBulb {
  turnOn(powerSource) {
    powerSource.provideElectricity();
    console.log("Light is on");
  }
}

class Switch {
  constructor(powerSource) {
    this.powerSource = powerSource;
  }

  operate() {
    this.powerSource.togglePower();
  }
}

class PowerSource {
  provideElectricity() {
    console.log("Providing electricity");
  }

  togglePower() {
    console.log("Toggling power");
  }
}

結論

SOLID 原則をマスターすることは、一連の実証済みのレシピを使って料理を学ぶことに似ています。これらを理解すると、機能的であるだけでなく、エレガントで保守が容易なコードを作成できます。したがって、次回コーディングの難題に直面したときは、これには原則があることを思い出してください。

コーディングを楽しんでください! ?

リリースステートメント この記事は次の場所に転載されています: https://dev.to/suryanshsingh2001/making-solid-simple-a-javascript-guide-to-clean-code-principles-1n6j?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>
  • Webスクレイピング - 面白いですね!
    Webスクレイピング - 面白いですね!
    クールな用語: CRON = 指定された間隔でタスクを自動的にスケジュールするプログラミング技術 ウェブって何? プロジェクトなどを調査するとき、私たちは通常、日記、エクセル、ドキュメントなど、さまざまなサイトから情報を書き込みます。 私たちはウェブをスクレイピングし、手動でデータ...
    プログラミング 2024 年 11 月 6 日に公開
  • お客様の声グリッドセクション
    お客様の声グリッドセクション
    ? CSS グリッドを学習しながら、このお客様の声グリッド セクションの作成が完了しました。 ?グリッドは構造化されたレイアウトの作成に最適です。 ?ライブデモ: https://courageous-chebakia-b55f43.netlify.app/ ? GitHub: https://gi...
    プログラミング 2024 年 11 月 6 日に公開
  • REGISTER_GLOBALS が PHP の主要なセキュリティ リスクとみなされるのはなぜですか?
    REGISTER_GLOBALS が PHP の主要なセキュリティ リスクとみなされるのはなぜですか?
    REGISTER_GLOBALS の危険性REGISTER_GLOBALS は、すべての GET 変数と POST 変数を PHP スクリプト内でグローバル変数として使用できるようにする PHP 設定です。この機能は便利に見えるかもしれませんが、潜在的なセキュリティ脆弱性やコーディング方法のため、使...
    プログラミング 2024 年 11 月 6 日に公開
  • Nodemailer の概要: Node.js での簡単な電子メール送信
    Nodemailer の概要: Node.js での簡単な電子メール送信
    Nodemailer は、メールを送信するための Node.js モジュールです。簡単な概要は次のとおりです: トランスポーター: 電子メールの送信方法を定義します (Gmail、カスタム SMTP など経由)。 const transporter = nodemailer.createTra...
    プログラミング 2024 年 11 月 6 日に公開
  • JavaScript での簡単なエラー処理: 安全な代入演算子がコードを簡素化する方法
    JavaScript での簡単なエラー処理: 安全な代入演算子がコードを簡素化する方法
    JavaScript でのエラー処理は面倒になる場合があります。 try/catch ステートメントで大きなコード ブロックをラップすることは機能しますが、プロジェクトが成長するにつれて、デバッグは悪夢のようになります。幸いなことに、もっと良い方法があります。 安全な代入演算子 (?=) を入力しま...
    プログラミング 2024 年 11 月 6 日に公開
  • Javascript は難しい (ESadness あり)
    Javascript は難しい (ESadness あり)
    長文になりますが、もう一度言わせてください。 JAVASCRIPTは難しいです。最後に会ったとき、私は Javascript の世界に足を踏み入れていました。目を輝かせ、希望に満ちたプログラマーが野生のジャングルに足を踏み入れ、「これはどれほど難しいことでしょう?」と言いました。私はどれほど間違っ...
    プログラミング 2024 年 11 月 6 日に公開
  • ## JavaScript を使用せずに CSS で円グラフのセグメントを作成できますか?
    ## JavaScript を使用せずに CSS で円グラフのセグメントを作成できますか?
    CSS を使用した円のセグメントborder-radius を使用して CSS で円を作成するのが一般的です。しかし、円グラフに似たセグメントを使用しても同様の効果を達成できるでしょうか?この記事では、JavaScript の使用を除き、HTML と CSS だけでこれを実現する方法について詳しく説...
    プログラミング 2024 年 11 月 6 日に公開
  • 小さなベクター ストアをゼロから構築する
    小さなベクター ストアをゼロから構築する
    With the evolving landscape of generative AI, vector databases are playing crucial role in powering generative AI applications. There are so many vect...
    プログラミング 2024 年 11 月 6 日に公開
  • Chrome で AI 実験 API を使用する方法
    Chrome で AI 実験 API を使用する方法
    Chrome で試験運用版 AI API を使用するには、次の手順に従ってください: ハードウェア要件 4GB RAM GPU が利用可能 最低 22GB のスペース Windows 10.11 または macOS Ventura 以降のバージョン (Linux 仕様なし) 次はまだ...
    プログラミング 2024 年 11 月 6 日に公開
  • レビュー: Django DX をブーストする (Adam Johnson 著)
    レビュー: Django DX をブーストする (Adam Johnson 著)
    本のレビューはデリケートです。ネタバレするつもりはありませんが、潜在的な読者に何が期待されるのかを感じてもらいたいと考えています。これは、コンテキストの提供と興味を維持することの間の巧みなバランスです。このレビューでは、あまり多くを明らかにせずに、あなたを誘惑するのに十分なだけの情報を提供することで...
    プログラミング 2024 年 11 月 6 日に公開
  • 配列要素をグループ化し、多次元配列の別の列の値を結合する方法
    配列要素をグループ化し、多次元配列の別の列の値を結合する方法
    配列要素を列ごとにグループ化し、別の列の値を結合する2 つの列を持つネストされた配列を含む配列が与えられた場合、タスクはグループ化することです。特定の列に基づいてサブ配列を作成し、各グループ内の別の列の値を連結して、カンマ区切りのリストを作成します。次の配列の例を考えてみましょう。$array = ...
    プログラミング 2024 年 11 月 6 日に公開
  • 新たに追加された 3 つの例外機能
    新たに追加された 3 つの例外機能
    JDK 7 以降、例外処理は 3 つの新機能 (自動リソース管理、マルチキャッチ、より正確な再スロー) で拡張されました。 マルチキャッチを使用すると、同じ catch 句で複数の例外をキャッチでき、コードの重複を回避できます。 マルチキャッチを使用するには、例外のリストを | で区切って指定しま...
    プログラミング 2024 年 11 月 6 日に公開
  • ES6 コード実行時の「予期しないトークンのエクスポート」エラーを修正する方法?
    ES6 コード実行時の「予期しないトークンのエクスポート」エラーを修正する方法?
    「予期しないトークン エクスポート エラーのトラブルシューティング」プロジェクト内で ES6 コードを実行しようとすると、「予期しないトークン エクスポート」エラーが発生する場合があります。このエラーは、使用されている環境が ES6 モジュールで採用されているエクスポート キーワード構文をサポートし...
    プログラミング 2024 年 11 月 6 日に公開
  • アンインストールしても VSCode 拡張機能がファイル システムから削除されないため、解決策を作成しました。
    アンインストールしても VSCode 拡張機能がファイル システムから削除されないため、解決策を作成しました。
    つまり、これは vscode ベースのエディターの問題です。拡張機能をアンインストールした後でも、拡張機能はファイル システムに残り、時間の経過とともにシステムが停止します。簡単なソリューションを作成しました。この Python スクリプトを実行すると、vscode にインストールされていない拡張機...
    プログラミング 2024 年 11 月 6 日に公開
  • GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する
    GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する
    従来の意味でのコンテンツ データベースを必要としない、自立可能なコンテンツ管理システムを構築する私のこれまでの道のりを共有したいと思います。 問題 この Web サイトのコンテンツ (ブログ投稿とブックマーク) は Notion データベースに保存されています: ブックマークのあるデ...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3