CS jak Ćwiczenia Single responsibility principle, czyli zasada jednej odpowiedzialności

przez | 4 marca, 2020

Single responsibility principle — Zasada jednej odpowiedzialności

Każda klasa powinna mieć tylko jedną odpowiedzialność (czyli tylko jeden powód do modyfikacji klasy) – jeden cel istnienia.

Bestseller dnia w księgarni Złote Myśli

Jak wykorzystywać w praktyce SRP?

Łącz w jedno kod, który ma ten sam jeden powód do zmiany. Rozdzielaj od siebie kod, który ma wiele powodów do zmiany.

Trudności związane z SRP

Z zasadą jednej odpowiedzialności związane są pewne trudności:

  • Nie jest zdefiniowane, czym jest zmiana.
  • Nie jest zdefiniowane, czym jest odpowiedzialność.
  • Wymaga przewidywania przyszłości.

Zasadę pojedynczej odpowiedzialności można przedefiniować.

Klasa, funkcja, metoda itp. powinna odpowiadać za pojedynczą logikę biznesową na jednym poziomie abstrakcji. (http://adam.wroclaw.pl/2014/12/zasada-pojedynczej-odpowiedzialnosci/)

Klasy powinny być organizowane tak, aby minimalizować złożoność. Powinny:

  • Być na tyle małe, aby zmniejszać zależności.
  • Być na tyle duże, aby maksymalizować spójność.

Domyślnie powinno się wybierać grupowanie funkcjonalności na rzecz rozdzielania kodu. (https://sklivvz.com/posts/i-dont-love-the-single-responsibility-principle)

Przykład

Klasa książka ma dwie odpowiedzialności:

  1. Posiadanie informacji o sobie.
  2. Drukowanie siebie.

   class Book
    {
        private string title;
        private string content;
        public Book(string title, string content)
        {
            this.title = title;
            this.content = content;
        }



        public void PrintBook()
        {
            Console.WriteLine(title);
            Console.WriteLine(content);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book("Interesting title", "Nice content");
            book.PrintBook();
        }
    }

W ramach refaktoryzacji wydzieliłem odpowiedzialność związaną z książką do oddzielnej klasy.


class Book
    {
        private string title;
        private string content;

        public Book(string title, string content)
        {
            this.title = title;
            this.content = content;
        }

        public string GetBookToPrint()
        {
            return $"{title}{Environment.NewLine}{content}";
        }
    }


    interface IPrinter
    {
        void Print(string content);
    }

    class BookPrinter : IPrinter
    {
        public void Print(string content)
        {
            Console.WriteLine(content);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IPrinter printer = new BookPrinter();
            Book book = new Book("Interesting title", "Nice content");
            var bookToPrint = book.GetBookToPrint();
            printer.Print(bookToPrint);
        }
    }

    }

Wszystkie posty związane z mini projektem: Poznaj zasady SOLID i OOP:

Źródła

Obraz główny

Materiały

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *