Что предпочтительнее: наследование или обёртка? Добрый день.
У меня есть класс который реализует парсер для определенного формата файла.
Я хочу добавить возможность парсинга еще одного формата. Мне представляется, что это можно сделать двумя способами: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
195 +1
0
Ответы
1

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

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

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

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

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

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