Удобное расширение функционала класса Пишу на Python. Столкнулся с такой задачей — существует класс для работы с базой данных. У него есть некие функции. Одна получает первые 50 записей, вторая сохраняет запись и возвращает какой-то параметр, третья получает запись и т.п. Для работы я создаю 1 экземпляр этого класса и устанавливаю ссылку на него во всех объектах, а они по ссылке обращаются к этому классу и так получают доступ к его функциям. class DB():
def __init__(self):
#Какие-то настройки для создания соединения с БД
def createConnection(self):
#Создание соединения
self.connection = new Connection(param1, param2, param3)
def get50Records(self):
#Получение 50 записей
result = self.conncetion.select(TABLE_RECORDS, limit=50)
return result
def saveRecords(self, params):
pass
....

В чем проблема — когда я хочу добавить новую функцию в класс DB, мне приходиться дописывать ее в сам класс. То есть как бы изменять его. А это не хочется делать. Нужен какой-то удобный способ добавлять новый функционал.
Я придумал вот такое. Я создаю один класс DB, в котором есть только параметры для создания соединения и сама функцию создания соединения. Далее я создаю новый класс называю его, например, DBget50Records и там функционал функции get50Records. А класс DB я наследую от класса DBget50Records. То есть, получается, что DBget50Records — родитель и у класса DB есть весь функционал, что и у родителя. Поэтому я, так же, создаю 1 экземпляр класса DB и все объектам передаю ссылку на него. А если мне надо расширить функционал, то я создаю новый класс DBsaveRecords и добавляю его в родители класса DB.class DBget50Records():
def get50Records(self):
#Получение 50 записей
result = self.conncetion.select(TABLE_RECORDS, limit=50)
return result
class DBsaveRecords():
def saveRecords(self, params):
pass
class DB(DBget50Records, DBsaveRecords):
def __init__(self):
#Какие-то настройки для создания соединения с БД
def createConnection(self):
#Создание соединения
self.connection = new Connection(param1, param2, param3)

Что вы думаете по этому поводу? Я понимаю, что все ровно придется менять класс DB добавляя ему родителей, но пока что ничего интереснее не придумал. Паттерн Декоратор не подходит!

21 Авг 2019 в 07:10
165 +1
0
Ответы
1

Ваш подход с использованием наследования для добавления нового функционала к классу DB имеет свои плюсы и минусы.

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

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

Если вам нужно добавить много нового функционала к классу DB, можно также рассмотреть использование композиции, где новая функциональность будет описана в отдельных классах, которые будут взаимодействовать с основным классом DB. Это может упростить структуру кода и избежать проблем, связанных с множественным наследованием.

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

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

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