Приведите пример класса или модуля, нарушающего принципы SOLID, опишите конкретные проблемы сопровождаемости и тестируемости и покажите, как рефакторинг (разбиение ответственности, интерфейсы, инверсия зависимостей) улучшит дизайн

24 Сен в 12:18
10 +1
0
Ответы
1

Пример класса, нарушающего принципы SOLID

Рассмотрим простой класс, который управляет заказами и одновременно отвечает за их обработку и сохранение в файл.

class OrderProcessor:
def __init__selfselfself:
self.orders =
def add_orderself,orderself, orderself,order:
self.orders.appendorderorderorder
def process_ordersselfselfself:
for order in self.orders:
self._process_orderorderorderorder
def _process_orderself,orderself, orderself,order:
# Здесь может быть сложная логика обработки заказа
printf"Processingorder:order"f"Processing order: {order}"f"Processingorder:order"
def save_orders_to_fileself,filenameself, filenameself,filename:
with openfilename,′w′filename, 'w'filename,w as file:
for order in self.orders:
file.write(f"{order}\n")Проблемы сопровождаемости и тестируемости

Нарушение принципа единственной ответственности SingleResponsibilityPrinciple−SRPSingle Responsibility Principle - SRPSingleResponsibilityPrincipleSRP:
Класс OrderProcessor отвечает за управление заказами, их обработку и сохранение в файл. Это затрудняет его изменение и тестирование, так как изменение логики обработки может затронуть и функциональность сохранения.

Нарушение принципа открытости/закрытости Open/ClosedPrinciple−OCPOpen/Closed Principle - OCPOpen/ClosedPrincipleOCP:
Если мы захотим изменить способ сохранения заказов например,сохранятьвбазуданныхвместофайланапример, сохранять в базу данных вместо файланапример,сохранятьвбазуданныхвместофайла, нам придется изменять существующий класс, что может привести к введению ошибок.

Нарушение принципа инверсии зависимостей DependencyInversionPrinciple−DIPDependency Inversion Principle - DIPDependencyInversionPrincipleDIP:
Класс жестко зависит от реализации сохранения, что делает его трудным для тестирования например,нужнобудетподменятьлогикупритестированиинапример, нужно будет подменять логику при тестированиинапример,нужнобудетподменятьлогикупритестировании.

Рефакторинг

Разобьем класс на несколько классов с четкими обязанностями и добавим интерфейсы.

from abc import ABC, abstractmethod
class Order:
def __init__self,id,detailsself, id, detailsself,id,details:
self.id = id
self.details = details
class OrderProcessor:
def __init__self,orderstorageself, order_storageself,orders torage:
self.orders = self.order_storage = order_storage
def add_orderself,orderself, orderself,order:
self.orders.appendorderorderorder
def process_ordersselfselfself:
for order in self.orders:
self._process_orderorderorderorder
def _process_orderself,orderself, orderself,order:
# Логика обработки заказа
printf"Processingorder:order.id"f"Processing order: {order.id}"f"Processingorder:order.id"
def save_ordersselfselfself:
self.order_storage.saveself.ordersself.ordersself.orders
class OrderStorageABCABCABC:
@abstractmethod
def saveself,ordersself, ordersself,orders:
pass
class FileOrderStorageOrderStorageOrderStorageOrderStorage:
def __init__self,filenameself, filenameself,filename:
self.filename = filename
def saveself,ordersself, ordersself,orders:
with openself.filename,′w′self.filename, 'w'self.filename,w as file:
for order in orders:
file.write(f"{order.id}: {order.details}\n")
# Пример использования
order_storage = FileOrderStorage′orders.txt′'orders.txt'orders.txt processor = OrderProcessororderstorageorder_storageorders torage
order1 = Order1,′Orderdetails1′1, 'Order details 1'1,Orderdetails1 order2 = Order2,′Orderdetails2′2, 'Order details 2'2,Orderdetails2
processor.add_orderorder1order1order1 processor.add_orderorder2order2order2 processor.process_orders processor.save_ordersУлучшения

Соблюдение принципа единственной ответственности: Каждый класс теперь отвечает за свою конкретную задачу: OrderProcessor управляет заказами и их обработкой, FileOrderStorage сохраняет заказы в файл.

Соблюдение принципа открытости/закрытости: Чтобы изменить способ хранения заказов, просто создадим новый класс, реализующий OrderStorage, без необходимости изменять OrderProcessor.

Соблюдение принципа инверсии зависимостей: Вместо жесткой зависимости от конкретного способа сохранения заказов мы используем интерфейс OrderStorage, что упрощает тестирование и замену реализаций.

Такой рефакторинг делает код более гибким, упрощает его сопровождение и тестирование, так как мы можем легко подменять зависимости и изменять поведение, не меняя основную логику.

24 Сен в 12:30
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир