Как можно изменить код, следуя принципу SOLID?

Как можно продемонстрировать простой псевдокод REST API?
  • 15 декабря 2023 г. 8:47
Ответы на вопрос 2
1. Принцип единственной ответственности (Single Responsibility Principle - SRP):
   - Разделите функции классов так, чтобы каждый класс отвечал только за одну конкретную часть функциональности.
   - Разделяйте классы для обработки бизнес-логики, классы для работы с данными, классы для взаимодействия с внешними системами и т. д.

2. Принцип открытости/закрытости (Open/Closed Principle - OCP):
   - Используйте полиморфизм и абстракции, чтобы программный код был открыт для расширения новым функционалом, но закрыт для модификации существующего кода.

3. Принцип подстановки Лисков (Liskov Substitution Principle - LSP):
   - Все подклассы должны быть взаимозаменяемыми со своими суперклассами, не нарушая работу остальной программы.
   - Необходимо следовать контрактам, определенным в суперклассе, и не изменять поведение, которое ожидается от суперкласса.

4. Принцип разделения интерфейса (Interface Segregation Principle - ISP):
   - Разделяйте интерфейсы на более мелкие, чтобы клиенты могли реализовывать только те методы, которые им нужны, вместо реализации всех методов одного большого интерфейса.

5. Принцип инверсии зависимостей (Dependency Inversion Principle - DIP):
   - Зависимости между классами должны быть основаны на абстракциях, а не на конкретных реализациях.
   - Классы должны зависеть от абстракций, а не от конкретных классов.

Пример простого псевдокода REST API:

```python
class UserService:
    def get_user(self, user_id: int) -> User:
        # Возвращает пользователя по его ID из базы данных

    def create_user(self, user_data: dict) -> User:
        # Создает пользователя на основе переданных данных и сохраняет его в базе данных
        # Возвращает созданного пользователя

    def update_user(self, user_id: int, user_data: dict) -> User:
        # Обновляет данные пользователя по его ID и сохраняет изменения в базе данных
        # Возвращает обновленного пользователя

    def delete_user(self, user_id: int) -> None:
        # Удаляет пользователя по его ID из базы данных


class UserController:
    def __init__(self, user_service: UserService) -> None:
        self.user_service = user_service

    def get_user(self, user_id: int) -> User:
        user = self.user_service.get_user(user_id)
        return user

    def create_user(self, user_data: dict) -> User:
        user = self.user_service.create_user(user_data)
        return user

    def update_user(self, user_id: int, user_data: dict) -> User:
        user = self.user_service.update_user(user_id, user_data)
        return user

    def delete_user(self, user_id: int) -> None:
        self.user_service.delete_user(user_id)
```

В этом примере псевдокода мы разделили функциональность на классы `UserService` и `UserController`. `UserService` отвечает за работу с базой данных и выполнение операций с пользователями, а `UserController` связывает запросы от клиента с соответствующими методами `UserService`. Это демонстрирует принцип единственной ответственности (SRP) и принцип инверсии зависимостей (DIP).
для начала научись грамотно формулировать мысли и приводить работоспособные примеры 
1. все строится на интерфейсах которые у тебя нихрена не описаны - откуда-то появляется UserControllerInterface
2. для проброса объектов использовать либо контейнеры, либо фабрики
3. не стоит пытаться создать holy controller подходящий для решения все задач
4. к OCP твой вопрос никак не относится - суть данного принципа в том, что свойства классов приватные, а геттеры/сеттеры - публичные, это позволит расширять класс при этом не модифицируя напрямую родителя
Похожие вопросы