Что предпочтительнее: наследование или обёртка? Добрый день.
У меня есть класс который реализует парсер для определенного формата файла.
Я хочу добавить возможность парсинга еще одного формата. Мне представляется, что это можно сделать двумя способами:1. Реализовать несколько методов парсера в одном классе, проверять расширение файла и вызывать соответствующий метод для обработки:class FileParser:
def __init__(self, file_name):
self.ext = os.path.splitext(file_name)[1]
if self.ext == '.foo':
self.data = self._parse_foo(file_name)
elif self.ext == '.bar':
self.data = self._parse_bar(file_name)
else:
raise TypeError('Wrong file extension')
def _parse_foo(self,file_name):
pass
def _parse_bar(self,file_name):
pass
def do_great_things_with_data(self):
pass2. Сделать наследование от исходного класса и реализовать в каждом наследнике свою функцию парсинга. При этом сделать фабрику объектов, которая будет создавать наследника нужного класса в соответствие с расширением файла:class FileParser:
@staticmethod
def load_file(cls, file_name):
ext = os.path.splitext(file_name)[1]
if ext == '.foo':
return FooFileParser(file_name)
elif ext == '.bar':
return BarFileParser(file_name)
else:
raise TypeError('Wrong file extension')
def do_great_things_with_data(self):
pass
class FooFileParser(FileParser):
def __init__(self):
pass
class BarFileParser(FileParser):
def __init__(self):
pass
Какой подход лучше использовать? Какие у каждого есть достоинства/недостатки?

21 Авг 2019 в 06:59
176 +1
0
Ответы
1

Оба подхода имеют свои достоинства и недостатки, и выбор зависит от конкретной задачи и контекста использования.

Первый подход (использование одного класса с проверкой расширения файла) более простой и прямолинейный. Он позволяет избежать избыточности кода и уменьшить количество классов. Однако в этом подходе возможно нарушение принципа единственной ответственности, так как класс будет отвечать за несколько различных типов парсинга.

Второй подход (использование наследования и фабрики) более гибкий и расширяемый. Он позволяет добавлять новые типы парсеров без изменения основного класса и использовать принцип открытости/закрытости. Однако этот подход может привести к увеличению количества классов и усложнению структуры программы.

Если вам нужно добавить всего несколько новых типов парсера и структура программы не должна меняться часто, то первый подход может быть предпочтительнее. Если же вам нужно добавлять много различных типов парсеров и вы хотите сохранить гибкость и расширяемость программы, то второй подход будет более подходящим.

В любом случае, важно соблюдать принципы SOLID и выбирать подход, который лучше подходит к вашей конкретной задаче и требованиям системы.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир