Всем привет.
Я не опытный разработчик поэтому будет очень банальный вопрос.
У меня есть небольшой проект "Отель". Мне сказали использовать там 2 класса: Отель, и Номер.
При создании объекта Номер, он добавляется в Лист аргумент в Объекте Отель.
Соответсвенно я храню все объекты Номеров в листе в Отеле. И когда мне надо указать что Клиент зарегистрировался в номере, я вызываю нужный мне объект Номера, и меняю пару параметров там, типо номер "Занят" и добавляю имя клиента в этот объект.
Следующим шагом мне сказали добавить БД MySQL, для того чтобы хранить данные там. Тогда возникает вопрос, зачем нужны Классы Отель, и Номер, если в любом случае они не будут храниться в БД. В БД будет храниться информация в виде: Номер, Клиент, курить можно или нет и т.д. Не нужно никаких классов тогда. Зачем создавать объекты если при окончании работы скрипта они все просто удаляются.
Соответственно вопрос в архитектуре: зачем вообще создавать объекты классов, если вся полезная инфа будет храниться в БД?
А создавая Объекты + еще добавляя инфу в БД, потом при удалении чего то из БД, надо удалять это из объекта..... Не имеет смысла.
Пожалуйста объясните нубу, как это все организованно.
Это очень сложный раздел и нубу в него лучше не лезть.
Ответ на вопрос "нужны ли классы" не лежит в области практической необходимости.
Разумеется, классы не "нужны", в той степени, в которой нужно хранилище данных, например.
Можно вполне сделать без них.
Это вопрос архитектуры.
А вопросы архитектуры не учат в виде "ну накидайте мне тут быренько", на это нужно время. Много времени.
Чтобы получить ответ на свой вопрос "зачем нужны классы, ведь можно без них", надо потратить немного больше усилий, чем за 5 сек написать вопрос на форум и за 15 получить готовое решение.
Именно поэтому вас и не устраивают ответы. А совсем не потому все вокруг дураки.
На общем уровне - классы и объекты позволяют просто удобно работать с предметной областью, одинаково , по одним и тем же правилам, при этом скрывая реализацию. можно прочитать про ООП в целом и про SOLID отдельно. Если подключается бд то тут либо что-то не правильно понято либо что-то не дано, но ощущается что максимум - учебный проект. Конечно, в нормальной ситуации вся эта информация будет храниться в базе в нормализованном виде.
Ну а удаление в бд - не должно приводить к изменению в объекте, наоборот - объект это в данном случае интерфейс для взаимодействия с базой и не надо допускать возможности производить операции над базой вне них
def __init__(self, name, location):
self.name = name
self.location = location
def add_room(self, roomnumber, bedtype, smoking, price):
new_room = Room(roomnumber, bedtype, smoking, price)
for x in self.rooms:
if x.getRoomNum() == roomnumber:
print(f"This room number {roomnumber} already exist in DB. Please choose another room number")
return
self.rooms.append(new_room)
self.numOfRooms +=1
#print(f"Room was added succesfully!")
Как вы можете видеть тут я используя класс Hotel, создаю объект класса Room и добавляю его в Лист rooms = []
Я могу просто (допустим connection к БД будет уже сделано), добавить еще 10-15 строк для добавления все инфы в БД, такой как Номер, Имя и т.д. Но получается что я создаю объект, и потом руками еще и заполняю БД. Какой смысл делать тогда класс Room?
NeoVic2006, в данном примере вообще нет базы данных для хранения состояния. Это просто работа с памятью. Это нужно чтобы показать как работает ООП. Судя по всему кто-то не читал вообще ни одной книги и не пробовал разобраться в теме ООП
NeoVic2006, ну так имплементируйте, в чем проблема? Если это домашнее задание то пробуйте и смотрите варианты. Про ООП и SOLID я уже сказал - изучайте.
NeoVic2006, ну так знание должно усваиваться через опыт. Знание, которое просто выложили как решение никакой пользы для развития как программиста не несёт. Навык номер ноль - умение искать информацию самостоятельно. Я и так целые две аббревиатуры выдал при изучении которых, а не поверхностном прочтении должно стать все ясно
Мой вопрос был про архитектуру. Я знаю как писать классы, создавать объекты классов, подсоединять ДБ и т.д.
Мне не нужны советы в этом плане.
Мой вопрос больше связан с архитекрутой работы классов и БД. Я не понимаю как все должно быть связано.
Если у нас есть класс Room, и БД, зачем нам создавать объект ROOM, если мы уже просто напрямую можем вприсать данные в бд. Тогда вообще зачем создавать объекты классов, если вся инфа в этих объектах будет удалена при окончинии работы программы ? информация в БД же останется ? зачем вообще нужны объекты тогда? вот ответы на эти вопросы мне нужны. А вы говорите иди и читай ООП. Единсвенная причина по которой я вообще сюда написал, это то что у меня нет рядом опытного программиста, который буквально за 5 минут описал бы мне эту стуркруту и сказал теперь иди делай. Поэтому я пытаюсь хоть как то подробно описать мой вопрос и найти адекватный ответ.
NeoVic2006, это все не архитектура а базовые знания по ООП. Если не хочется идти изучать эту тему то из вас не выйдет программиста. Более того, есть миллион способов выполнить данную задачу и чем более опытный программист будет ее решать тем больше фраза «теперь так и делай» будет полной чушью
Иван Шумов,
ничего тут про ООП нет, это DDD, моделирование предметной области и отделение её от конкретной реализации хранилища, именно поэтому автора и впрягли теперь прикрутить базу данных, только видимо про интерфейсы и инверсию зависимостей ничего не рассказали.
NeoVic2006,
Всё это сделано для того чтобы уменьшить связанность приложения и базы данных, чтобы её можно было с легкостью поменять на что-нибудь другое и не закладываться не детали её реализации.
Добавлять код для сохранения в базу данных напрямую в свои классы Hotel и Room неправильно, связанность это не уменьшит, это объекты твоей бизнес логики, по-хорошему, они про базу вообще ничего знать не должны, но на деле на это часто забивается болт и Hotel + Room становятся непосредственной моделью данных хранящихся в БД (как например это сделано в django).
Всю эту проблему может решить ORM: https://ru.wikipedia.org/wiki/ORM
Например в sqlalchemy есть https://docs.sqlalchemy.org/en/14/orm/mapping_styl... которые решают проблему объектов которые должны ничего не знать про хранилища.
В джанге тоже можно организовать подобное, но немного сложнее.
Но и ORM использовать не обязательно, есть repository pattern. При реализации которого ты сможешь на raw sql написать код для CRUD своих объектов в БД. А когда понадобится - реализовать ещё один репозиторий, который будет работать с другим хранилищем и всё это без лазания в бизнес логику и риск чего-нибудь сломать.
Чтобы не переписывать потом весь проект, если придётся MySQL заменить на другую СУБД. А будет достаточно только отредактировать те классы, которые работают непосредственно с базой данных, остальное с БД работать напрямую не должно, только через эти классы.
Короче, я так понял что у тебя вопрос коротко звучит так: Зачем нужны классы, если в них нельзя хранить информацию, а все равно нужна бд?
Коротко - данные НЕ ХРАНЯТСЯ в объектах, объекты предназначены для организации кода и к хранению никакого отношения не имеют. Объекты в момент создания пусты, или инициализируются некоторыми данными извне (например, из бд), для большего понимания и если сильно упрощать - это усложненные массивы, которые умеют еще и манипуляции со своими данными.
Соответственно вопрос в архитектуре: зачем вообще создавать объекты классов, если вся полезная инфа будет храниться в БД?
По этой фразе вроде как именно не понимает зачем объекты когда храним в бд... Думаю он просто нормально сформулировать не может, ну как собаки, типа все понимают, а сказать не могут... Хотя может я чего в его диалекте не понимаю...