Форум сайта python.su
Есть, например, класс Goods выдающий информацию из базы данных.
Когда принято делать подключение к базе данных?
1) В основной программе, а в объект передавать идентификатор подключения.
Допустим Goods имеет два разных подключения к базе(один к локальной с описание товаров, а другой удаленный к сладу) и тогда выносить логику выбора из класса некрасиво
2) Создавать подключение в __init__ и сразу сообщить основной программе о проблемах с подключением.
Но возможно, программе и подключение к складу не нужно в данный момент.
Плюс, в основной программе, несколько копий объекта и следовательно к базе может быть очень много подключений
3) Создать при вызове методов Goods, по мере необходимости. Тогда каждый запрос будет подключение/отключение, что создась большую нагрузку
Офлайн
doubtpointКласс ничего не выдаёт. Класс описывает устройство каждого объекта, принадлежащего этому классу. Класс - это такое объединение одинаковых объектов в одно множество. Соответственно, у тебя может быть много объектов класса Goods, каждый из которых имеет собственное, индивидуальное взаимодействие с базой данных. И вот объект уже как раз и берёт и выдаёт информацию из базы данных. Но класс один и он ничего не делает, потому что его нет ни в памяти, ни во времени, а объектов этого класса много и каждый из них имеет место в памяти и время жизни, в течение которого его состояния меняются с одного на другое.
Есть, например, класс Goods выдающий информацию из базы данных.
doubtpointПодключением к базе данных может заниматься вообще другой объект. А каждый объект, описанный в классе Goods, может подключаться только к одной базе, которую ему подадут снаружи. И то ему подают эту базу данных не напрямую, а опосредованно, в качестве какого-то источника с данными. Объект класса Goods даже не в курсе, что это за источник и является ли он какой-то базой данных. Объект класса Goods просто знает про операции, которые можно совершать над объектом-источником. А объект-источник, в свою очередь, подключен к базе данных каким-то способом, которых может быть много. В том числе объект-источник может быть подключен вообще к нескольким базам данных одновременно. Никто об этом не будет знать. Просто операция над объектом-источником будет скрыто выполнять поиск в нескольких базах. А объект-клиент, выполняющий эту операцию над объектом-источником, просто будет получать данные и не знать ничего про то, откуда и каким образом эти данные получены.
Когда принято делать подключение к базе данных?
1) В основной программе, а в объект передавать идентификатор подключения.
Допустим Goods имеет два разных подключения к базе(один к локальной с описание товаров, а другой удаленный к сладу)
doubtpointПодключением к базе данных должен заниматься вообще другой объект. На нём же и лежит ответственность за снижение нагрузки при подключении к базе данных. Объект, работающий с данными из базы данных, просто должен общаться с объектом, который управляет подключением к базе данных, и получать от него объект для работы с базой данных и сохранять этот объект для работы с базой данных у себя в памяти.
3) Создать при вызове методов Goods, по мере необходимости. Тогда каждый запрос будет подключение/отключение, что создась большую нагрузку
>>> class Reader: ... def set_db(self, db): ... self.db = db ... ... def read(self): ... return self.db.query() ... >>> class Connector: ... def connect(self, address, user, password): ... return DB(address, user, password) ... >>> class DB: ... def __init__(self, address, user, password): ... self.address = address ... self.user = user ... self.password = password ... ... def query(self): ... return 'name=kate age=30' ... ... def status(self): ... return 'db<a={}, u={}, p={}>'.format( ... self.address, self.user, self.password) ... >>> reader = Reader() >>> db = Connector().connect('https://host', 'u', '!@#$') >>> reader.set_db(db) >>> >>> status = db.status() >>> print(status) db<a=https://host, u=u, p=!@#$> >>> >>> result = reader.read() >>> print(result) name=kate age=30 >>>
Отредактировано py.user.next (Май 5, 2022 19:31:53)
Офлайн
Спасибо за ответ. Не понял а где в вашем коде Goods? Возможно я имел ввиду под Reader его(основной метод его получать информацию из базы).
class Goods: def set_db(self, db): self.db = db def desk(self, item): return self.db.query('desk', item) def sell(self, item): if self.db.query('amount', item)>0: return 'отгружаем' else: return 'нет на складе' class Connector: def connect(self, address, user, password): return DB(address, user, password) class DB: base = { 'base': {'desk':{'apple':'яблоки','tomato':'помидоры' }}, 'sklad1': {'amount':{'apple':1,'tomato': 0 }}, 'sklad2': {'amount':{'apple':3,'tomato': 2 }}, } def __init__(self, address, user, password): self.address = address self.user = user self.password = password def query(self, tab, item): return self.base[self.address][tab][item] def status(self): return 'db<a={}, u={}, p={}>'.format( self.address, self.user, self.password) goods = Goods() db = Connector().connect('base', 'u', '!@#$') goods.set_db(db) status = db.status() print(status) #db<a=base, u=u, p=!@#$> name = goods.desk('apple') print(name) # яблоки db = Connector().connect('sklad1', 'u', '!@#$') goods.set_db(db) result = goods.sell('apple') print(' '.join ([result,name])) #отгружаем яблоки #db = Connector().connect('base', 'u', '!@#$') #goods.set_db(db) name = goods.desk('tomato') print(name) # Забыли переключить базу!!!!
Офлайн
doubtpointОбъект класса Goods должен выполнять операции над объектом класса Reader. Объект класса Reader получает информацию, а объект класса Goods работает с уже полученной информацией. Откуда объект класса Goods её получил, к нему относится вообще? Это не его дело вообще. А в это время каждый объект класса Reader подключается к своей базе. Соответственно, так можно общаться с несколькими разными объектами класса Reader, каждый из которых несёт свою личную ответственность за подключение к своей личной базе данных своим личным способом.
Не понял а где в вашем коде Goods? Возможно я имел ввиду под Reader его
doubtpointЕсли бы ты умел строить объектные модели, у тебя уже давно бы сложилось всё в оптимальную картинку, в которую это можно сложить. Но так как ты не видишь состояний объектов, ролей объектов, обязанностей объектов, отношений между объектами, то ты и начинаешь всё упрощать под своё мышление, которое развито максимум до процедур. То есть вместо равномерно распределённой по разным объектам модели, ты просто всё стираешь и пишешь тупую в лоб процедуру, которая вот в таком виде тебе понятна. Reader не надо стирать, им надо пользоваться, не задумываясь о том, что находится за ним. Это свойство называется инкапсуляцией. Знакомо тебе такое понятие? Инкапсуляция нужна для того, чтобы писать большие программы.
Так неудобно, потому что основная программа, по смыслу, не должна заботиться о том на каком складе(базе) искать
Отредактировано py.user.next (Май 2, 2022 22:09:48)
Офлайн
py.user.nextЯ как раз об инкапсуляции и задумываюсь задавая вопрос.
инкапсуляцией
Офлайн
doubtpointА ты знаешь, что такое инкапсуляция? Я вот думаю, что у тебя искажённое представление о том, что это такое.
Я как раз об инкапсуляции и задумываюсь задавая вопрос.
doubtpointОбъект класса Goods должен работать только с данными про товары. Он не должен знать вообще про существование каких-то там баз данных. Объект класса Reader должен только читать данные из уже подключенного источника. Он не должен знать, какая там система управления базами данных, как к ней подключаться, на каком она сервере или хранится ли она локально. Объект класса Connector должен подключаться к источнику с данными. Он не должен знать, что это за источник по своей структуре, база данных это или это файл на диске. Соответственно, должен ли объект класса Goods знать про какие-то там пароли? Да он вообще не знает, как вся эта хуйня устроена, от него это всё скрыто. При этом к нему когда обращаются, он так же от них скрывает, что он там делает с этими товарами и сколько он их там видит и через что он их видит. Вот это инкапсуляция. Она даёт возможность выращивать программу дальше в любой её точке. При этом ни один объект из уже созданных и функционирующих не будет понимать этого даже, что в какой-то части программы что-то там меняется.
Пускай в Goods есть несколько Reader. Connector для них создается в основной программе или в Goods передавать информацию о логине и пароле для создания там?
Отредактировано py.user.next (Май 4, 2022 23:34:56)
Офлайн
doubtpointРасскажи что это за программа в целом, какие операции она автоматизирует,т.е будет делать без твоего участия.
Есть, например, класс Goods выдающий информацию из базы данных.
Офлайн