「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > S - 単一責任原則(SRP)

S - 単一責任原則(SRP)

2024 年 11 月 6 日に公開
ブラウズ:491

S - Single Responsibility Principle(SRP)

Single Responsibility Principle(SRP)

The Single Responsibility Principle(SRP) is the first of the SOLID principles, which plays an important role in object-oriented programming.

The main point of this principle is: A class or module should have only one responsibility. In other words, a class, module, or function should be used or modified for only one reason.

Detailed Explanation:

  1. Definition of Responsibility:
    Responsibility refers to the specific task or functionality that a class or module performs or manages.

  2. Importance of Single Responsibility:

  • Easy Maintenance: When a class or function has a single responsibility, it's easier to update or modify because the impact of changes is limited.

  • Reusability: Classes or functions with a single responsibility are easier to reuse in other projects or modules.

  • Reduced Complexity: Code complexity is reduced because each class or function has clear and limited tasks.

  • Easy Testing: Small and well-defined classes are easier to test.

For example, let's say we have a class that handles both data processing and file management tasks. This violates the Single Responsibility Principle. In this case, we can create separate classes for data processing and file management. This way, if we need to make changes related to file management in the future, it won't affect the data processing functionality.

Example 1:

Let's say we have a User class that both stores user information and prints that information to the console.

// Java code

public class User {
    private String name;
    private String email;

    // Constructor, Getter, Setter

    public void printUserDetails() {
        System.out.println("Name: "   name);
        System.out.println("Email: "   email);
    }
}

Here, the User class is handling two responsibilities:

  • Storing user information.
  • Printing user information to the console.

According to the Single Responsibility Principle, this class should be divided into two separate classes:

// Java code

// For storing user information
public class User {
    private String name;
    private String email;

    // Constructor, Getter, Setter
}

// For printing user information
public class UserPrinter {
    public void printUserDetails(User user) {
        System.out.println("Name: "   user.getName());
        System.out.println("Email: "   user.getEmail());
    }
}

This way, the responsibility of each class becomes clear and distinct. If we need to change the way information is printed in the future, only the UserPrinter class needs to be modified, while the User class remains unchanged.

Example 2:

Let's say we are building a task management system where a Task class is responsible for creating tasks, updating them, and checking if a task is completed.

// JavaScript code:

class Task {
    constructor(name, completed = false) {
        this.name = name;
        this.completed = completed;
    }
    completeTask() {
        this.completed = true;
    }
    updateTask(name) {
        this.name = name;
    }
    notifyUser() {
        console.log(`Task "${this.name}" is completed!`);
    }
}

const task = new Task('Learn JavaScript');
task.completeTask();
task.notifyUser();

Here, the Task class is handling three different responsibilities:

  • Creating and updating tasks.
  • Completing tasks.
  • Notifying the user when a task is completed.

This violates the Single Responsibility Principle because multiple responsibilities are handled within one class.

Refactoring the code to follow SRP:

Now, we will split these responsibilities into separate classes so that each class has only one responsibility.

// JavaScript code:

// For creating and updating tasks
class Task {
    constructor(name, completed = false) {
        this.name = name;
        this.completed = completed;
    }

    updateTask(name) {
        this.name = name;
    }

    completeTask() {
        this.completed = true;
    }
}

// For notifying the user about task completion
class TaskNotifier {
    notifyUser(task) {
        if (task.completed) {
            console.log(`Task "${task.name}" is completed!`);
        } else {
            console.log(`Task "${task.name}" is not yet completed.`);
        }
    }
}

const task = new Task('Learn JavaScript');
task.completeTask();

const notifier = new TaskNotifier();
notifier.notifyUser(task);

How does this follow the SRP?

  • The Task class is now only responsible for creating and updating tasks. It handles changing the task's name or marking it as completed.

  • The TaskNotifier class is solely responsible for notifying the user about the task's status.

Benefits:

  • If in the future, we need to perform additional actions when a task is completed (e.g., sending an email), only the TaskNotifier class will need to be changed. The Task class remains unchanged.

  • The code is now cleaner, more modular, and easier to maintain.

By following the Single Responsibility Principle, this example shows how breaking the code into smaller, specialized classes can make maintenance easier and improve clarity.

Single Responsibility Principle in React.

Applying the SOLID principles while building a React application can bring significant changes. These principles are fundamental concepts of object-oriented design that provide a strong foundation for writing clean, efficient, and maintainable code. As a result, our React components will not only be functional but also easier to manage and extend.

According to the Single Responsibility Principle (SRP), a class or component should only change for one reason, meaning it should have only one responsibility or task.

How to Apply SRP in React:

To follow the Single Responsibility Principle (SRP) in React:

  • Each Component Should Have a Specific Task or Functionality:
    Each component should serve a single purpose. For example, a component might only display form data, show a user profile, or render a list of items.

  • Keep Components Small and Specialized:
    This makes it easier to test and update each component individually. Smaller, more focused components can be reused across the application, leading to better maintainability and clarity.

By adhering to these guidelines, you can create a more organized and manageable codebase in your React applications.

Example 1:

Let's say we are building a todo application where one component displays a list of tasks, and another component handles the form for adding new tasks.

Good Design According to SRP:

TaskList Component:

function TaskList({ tasks }) {
    return (
        
    {tasks.map(task => (
  • {task.name}
  • ))}
); }
  • This component is responsible solely for displaying the list of tasks.

AddTaskForm Component:

// JavaScript Code:

function AddTaskForm({ onAdd }) {
    const [taskName, setTaskName] = useState("");

    const handleSubmit = (e) => {
        e.preventDefault();
        onAdd(taskName);
        setTaskName("");
    };

    return (
        
setTaskName(e.target.value)} placeholder="Add a new task" />
); }
  • This component is solely responsible for managing a form to add new tasks.

Why Following SRP is Beneficial?

  1. Increased Reusability of Components:
    If we want to change only the task list, we can simply update the TaskList component. If we need to modify the form for adding new tasks, we only need to update the AddTaskForm component. This separation makes components more reusable across different parts of the application.

  2. Easier Debugging and Maintenance:
    Instead of handling multiple responsibilities, each component performs a single task. This makes it easier to find and fix bugs, as the scope of potential issues is limited to one component.

  3. Improved Code Understandability for Other Developers:
    Components with clearly defined responsibilities are easier to understand. Smaller, focused components make the codebase more approachable for other developers who might work on the project.

By applying the Single Responsibility Principle (SRP), our React application becomes clearer, more modular, and easier to maintain.

Example 2:

In this example, we have created two separate components: UserProfile and AuthManager, each with a specific task or responsibility.

UserProfile.js:

// JavaScript code

const UserProfile = ({ user }) => (
  

{user.name}

{user.bio}

);

Responsibility of the UserProfile Component:

  • The UserProfile component is solely responsible for displaying the user's profile. It shows the user's name and bio.

AuthManager.js:

// JavaScript code 
const AuthManager = () => (
  
{/* Authentication logic here */} Login Form
);

Responsibility of the AuthManager Component:

  • The AuthManager component is created to handle authentication. It displays the login form and manages the logic required for authentication.

Why This Follows the Single Responsibility Principle (SRP)?

  • Each Component Has a Specific Responsibility:
  • The UserProfile component focuses solely on displaying profile information.

  • The AuthManager component is dedicated to handling authentication logic.

  • Components Are Separate, Manageable, and Testable:
  • If we need to make changes related to displaying profile information, we only need to modify the UserProfile component.

  • Similarly, any updates regarding authentication can be made exclusively within the AuthManager component.

  • Increased Code Reusability:
  • We can reuse the UserProfile and AuthManager components in various parts of our application since they perform specific responsibilities.

By adhering to the Single Responsibility Principle, each component is assigned a single responsibility, which makes the code clean, modular, and easier to maintain.

Disadvantages of the Single Responsibility Principle (SRP)

Disadvantages of the Single Responsibility Principle (SRP)
While the Single Responsibility Principle (SRP) offers numerous advantages, there are also some limitations and challenges that developers may need to consider. Here are some of the key drawbacks:

  1. Increased Number of Components or Classes:
    Following SRP requires creating separate components or classes for each task or responsibility, which can lead to a rapid increase in the number of components or classes in the application. This can make the codebase harder to manage.

  2. Increased Complexity:
    The proliferation of small components or classes can complicate their coordination. Passing data and facilitating communication between various components may become challenging.

  3. Excessive Abstraction:
    Overzealous application of SRP can sometimes result in unnecessary abstraction. Creating too many small components or classes may make the code harder to read and understand, especially if each component's role is trivial.

  4. Learning Curve:
    New developers may find it difficult to fully understand and apply SRP. It requires experience and a clear understanding of how to break down an application into smaller, reusable components.

  5. Overhead in Testing:
    With many small components being created, there is a need to write separate tests for each one. This can increase the time and complexity involved in writing test code.

  6. Balance in Applying SRP:
    It may not always be practical to apply SRP strictly. Sometimes, it can be more effective for a component or class to handle a few closely related responsibilities. Applying SRP excessively can unnecessarily complicate the code, making it more difficult to read and maintain.

By considering these disadvantages, developers can make informed decisions about when and how to apply the Single Responsibility Principle in their projects.

In summary, SRP (Single Responsibility Principle) is a powerful principle that helps keep code clean, modular, and maintainable. However, it should be applied with its limitations in mind. Sometimes, excessive use of the principle can have the opposite effect, so it is important to maintain balance according to the specific needs of the code.

リリースステートメント この記事は次の場所に転載されています: https://dev.to/nozibul_islam_113b1d5334f/s-single-responsibility-principlesrp-h4g?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    Selenium で「span:contains(\'String\')」\ による InvalidSelectorException を解決する方法
    「span:contains('String')」による Selenium の無効な SelectorExceptionFirefox で Python の Selenium を使用するときに、 CSS セレクター「span:contains('コントロール パネル'...
    プログラミング 2024 年 11 月 6 日に公開
  • InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    InnerHTML の落とし穴を回避して HTML をコンテナ要素に追加するにはどうすればよいですか?
    innerHTML を使用しないコンテナ要素への HTML の追加再訪当面の問題は、制限を回避しながら HTML をコンテナ要素に追加する方法です。 innerHTML プロパティを使用する場合の落とし穴。 OP が正しく指摘しているように、innerHTML は既存のコンテンツを置き換える動作によ...
    プログラミング 2024 年 11 月 6 日に公開
  • 継続的テスト: DevOps パイプラインの品質を確保する
    継続的テスト: DevOps パイプラインの品質を確保する
    継続的なテストは、最新のソフトウェア開発、特に DevOps フレームワーク内での重要な実践です。これには、コードベースに加えられたすべての変更が完全に検証されていることを確認するために、ソフトウェア配信パイプライン全体でのテストの自動実行が含まれます。開発プロセスのすべての段階にテストを統合する...
    プログラミング 2024 年 11 月 6 日に公開
  • 背景色の変更動画
    背景色の変更動画
    インスタグラムをフォローしてください このビデオチュートリアルでは、HTML、CSS、JavaScript を使用して素晴らしい Instagram カードを作成する方法を説明します。このカードには、色が変化する鮮やかな境界線、円形のプロフィール写真、およびオンラインでの存在感に魅力的なタッチを加え...
    プログラミング 2024 年 11 月 6 日に公開
  • PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHPを使用してブラウザのキャッシュをクリアするにはどうすればよいですか?
    PHP を使用したブラウザ キャッシュのクリアブラウザ キャッシュにより、頻繁にアクセスされるファイルがローカルに保存され、Web サイトの読み込み時間が短縮されます。ただし、キャッシュされたファイルが古い場合は、テストや開発に支障をきたす可能性もあります。この記事では、PHP を使用してブラウザの...
    プログラミング 2024 年 11 月 6 日に公開
  • Go を使用した AWS Lambda、初期定型文
    Go を使用した AWS Lambda、初期定型文
    Unsplash の Lukáš Vaňátko による写真 導入 Go はそのシンプルさから、常に私のお気に入りの言語の 1 つです。最近、Go で書かれたラムダ関数を使用した単純な定型的なサーバーレス プロジェクトを作成するには何が必要かを理解することにしました。ツールと開発者の...
    プログラミング 2024 年 11 月 6 日に公開
  • Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    Laravelで空の値が一番下にあり空でない値がある行を降順で並べ替える
    データベースを操作する場合、一部のフィールドが空または NULL になる状況がよく発生します。よく発生する課題の 1 つは、空のフィールドを含む行が結果セットの最後に表示され、空ではない値を含む行が意味のある方法 (降順など) で並べられるようにレコードを並べ替える方法です。この投稿では、実用的な例...
    プログラミング 2024 年 11 月 6 日に公開
  • オリーブオイルの利点
    オリーブオイルの利点
    オリーブオイルの利点 地中海食の基礎としてよく称賛されるオリーブオイルは、さまざまな料理に風味を加えるだけでなく、健康上の利点も満載です。オリーブの木の果実から抽出されるオリーブオイルは何世紀にもわたって使用されており、現代の研究によりその多くの利点が明らかになり続けています。オリ...
    プログラミング 2024 年 11 月 6 日に公開
  • JSON Diff: 開発者向けの完全ガイド
    JSON Diff: 開発者向けの完全ガイド
    JSON (JavaScript Object Notation) は、システム間で情報を交換するために広く使用されているデータ形式です。開発者が API、データベース、構成を操作する場合、JSON データの一貫性と正確性を確保することが不可欠です。ここで JSON diff が役に立ちます。 J...
    プログラミング 2024 年 11 月 6 日に公開
  • 知っておくべき avascript のヒント
    知っておくべき avascript のヒント
    ジョアブ・チュア著 1. コンソール.ログ コンソール ログに色を追加 これだけはやめてください! ❌ 代わりにこれを試してください。 ✅ しかし、オブジェクトの配列がある場合は、これを試してみるとさらに良いでしょう ? コード内で特定の操作がどのくらい速く実行されるかを測定したい場...
    プログラミング 2024 年 11 月 6 日に公開
  • Python を使用して Google Scholar をスクレイピングする技術を習得する
    Python を使用して Google Scholar をスクレイピングする技術を習得する
    学術研究やデータ分析に取り組んでいる場合、Google Scholar のデータが必要になる場合があります。残念ながら、公式の Google Scholar API Python サポートがないため、このデータの抽出は少し難しくなります。ただし、適切なツールと知識があれば、Google Schola...
    プログラミング 2024 年 11 月 6 日に公開
  • Go、クリーン アーキテクチャ、PostgreSQL による堅牢な電子商取引プラットフォームの構築
    Go、クリーン アーキテクチャ、PostgreSQL による堅牢な電子商取引プラットフォームの構築
    概要 私たちの目標は、商品管理から注文処理まですべてを処理できる総合的な電子商取引ソリューションを開発することです。このプラットフォームは、オンライン ビジネスの強固な基盤として機能し、需要の増大に合わせて拡張し、市場のニーズの変化に適応することができます。 当社の e コマース ...
    プログラミング 2024 年 11 月 6 日に公開
  • Redis の説明: 主な機能、使用例、実践的なプロジェクト
    Redis の説明: 主な機能、使用例、実践的なプロジェクト
    Introduction Redis is an open-source, in-memory data structure store used as a database, cache, and message broker. It’s known for its perfor...
    プログラミング 2024 年 11 月 6 日に公開
  • macOS で MySQL を自動起動するように設定する方法: 開発者向けのステップバイステップ ガイド
    macOS で MySQL を自動起動するように設定する方法: 開発者向けのステップバイステップ ガイド
    開発者として、私たちはローカル マシン上で MySQL データベースを操作することがよくあります。システムを起動するたびに MySQL を手動で起動するのは管理可能ですが、面倒な作業になる可能性があります。このガイドでは、macOS 上で MySQL が自動的に起動するように設定し、時間を節約し、ワ...
    プログラミング 2024 年 11 月 6 日に公開
  • TypeScript をマスターする: extends の力を理解する
    TypeScript をマスターする: extends の力を理解する
    TypeScript の extends キーワードは、一種のスイス アーミー ナイフです。これは、継承、ジェネリック、条件型などの複数のコンテキストで使用されます。 extends を効果的に使用する方法を理解すると、より堅牢で再利用可能でタ​​イプセーフなコードを作成できます。 ...
    プログラミング 2024 年 11 月 6 日に公開

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

Copyright© 2022 湘ICP备2022001581号-3