Форум сайта python.su
bootcdДа даже не вышку, просто нижку. Какие-нибудь игры классические типа там Doom или Warcraft написаны без ООП, но это не значит, что ты их напишешь. Это же надо уметь программировать.
Если вы про именно программистскую вышку - да, у меня такого нет. Я весьма бородатый админ, инженер по образованию. Но сфера разработки приложений сложнее чем скрипты - это для меня новая сфера, да.
bootcdИ ты путаешь знание питона и знание программирования. Это разные вещи. Питон - это карандаш, а программирование - это изобразительное искусство, рисование, если по-простому. Если ты карандаш изучил со всех сторон и даже провёл его молекулярный анализ, то это не значит, что ты им можешь нарисовать сову или кошку автоматически. Для этого надо не карандаш изучать и даже не кисточки, а теорию рисования. Там ни карандаша нет, ничего подобного, эту теорию можно применять хоть к палке на песке, она одинаковая для любых инструментов. И она сама не изучится и ни из какого космоса к тебе в снах сама собой не придёт. Это нужно учиться, тренироваться и так далее.
Мои знания питона - сисадминские. То есть, написать скрипт для мониторинга, парсер логов, добавить в готовую прогу код для метрик Prometheus, дренуть ручку, что-то с нее получить, передать далее и тп.
Отредактировано py.user.next (Май 2, 2024 10:32:52)
Офлайн
py.user.next
А если база данных сменится с изначальной на другую, что ты делать будешь?
engine = create_engine(f'mysql+pymysql://' f'{os.getenv("DB_USER")}' f':{os.getenv("DB_PASSWORD")}' f'@{os.getenv("DB_SERVER")}/' f'{os.getenv("DB_NAME")}', pool_recycle=3600) Base = declarative_base() def get_session(): return Session(bind=engine) class LDAPAccountsRepo(UserAccountsRepo): @staticmethod def get_accounts(domain_id, search_filter=None): with get_session() as session: accounts=session.query(UserAccount).filter_by(domain_id=domain_id).all() return accounts
py.user.next
Давай так: провёл ли ты декомпозицию на объекты, перед тем как вообще классы затрагивать? Сначала нужно выяснить, какие объекты есть и что они делают, когда всё это работает. Это ещё никаких классов нет. Потому что где-то нужно допридумать объекты, где-то их разделить на части (на другие объекты), где-то их соединить (слить в один объект или агрегировать, собрав в одном объекте, не разрушая их границ и не лишая их состояний). Когда у тебя объекты все установлены и функционируют, образуя работающие механизмы, тогда ты думаешь над классами этих объектов - как всю эту массу объектов разбить на отдельные классы по общим признакам. Классы потом тоже нужно увязывать в отношения, чтобы сохранять целостность и компактность программы, устойчивость к изменениям и нововведениям.
Отредактировано bootcd (Май 2, 2024 10:39:06)
Офлайн
py.user.next
Да даже не вышку, просто книжку. Какие-нибудь игры классические типа там Doom или Warcraft написаны без ООП, но это не значит, что ты их напишешь. Это же надо уметь программировать.
py.user.nextЭтим как раз и занимаюсь. Единственное, что учителей нет, одни умники вокруг.
Это нужно учиться, тренироваться и так далее.
Офлайн
bootcdА если не будет движка для этой ORM-системы? Ну, например, база данных представляет из себя текстовые файлы. Как ты сохранишь CRUD, который ты сделал и в котором там много тысяч строк, для подобной базы данных? Никак. Это нереально? Нет, это реально, для этого ООП и существует как раз. Оно даёт полностью менять поведение тонны кода лёгким движением руки.
По идее если у меня будет другая БД, я могу изменить engine.
bootcdЭто не абстракция. Абстракция - это такая сущность, которая нужна, чтобы выделить основные черты и спрятать детали. Ну например, я тебе говорю “ты видел собаку на улице?”, ты сразу представляешь что? Жучку с пятого подъезда, такую в ошейнике на рулетке, которую выгуливает хозяйка Клара Ивановна, или ты представляешь какую-то собаку, хрен пойми какую, но вот ты знаешь, что у неё есть шерсть, скорее всего, четыре лапы, уши, хвост какой-то, и она куда-то ходит и делает непонятно что, только в общих чертах ясно, что она делает? Вот с этой собаки можно налепить много разных собак, при этом она - одна. Вот это абстракция, абстракция собаки.
Я описываю абстракцию “Работа с моделями ОРМ по определенной теме”.
bootcdВ вузе тоже может быть дурак какой-то. Я видал таких. Кто его поправит на парах? кто рискнёт? Но когда он в Интернет вылазит и ему говоришь, что он чушь несёт, он пытается с тобой, как со студентом, обращаться, сейчас двойку поставит. Вместо того, чтобы учиться, он пытается тебя заткнуть. Потому что ломать своё представление о своих способностях, это очень неприятно. И курсы от них тоже есть. Одного вот препода помню “абстракция - это вот какая-то каша у меня в голове, сам не знаю, что несу”. Кто его уволит с вуза, если он дебил? Никто его не уволит, потому что что? потому что надо будет искать нового и затыкать им дыру в расписании.
Посмотрел однажды отрывки из какого-то платного курса по питону и мне как человеку, имеющему опыт преподавания в ВУЗе, было больно.
bootcdНадо обнаружить все объекты и рассмотреть, что они делают, какие у них взаимодействия. Это без всяких полей делается. Потому что полей можно напридумывать миллион в разных вариациях. И на них тоже не написано, что вот этот набор полей правильный, а вот этот набор полей неправильный.
По идее такой объект может выглядеть как набор полей: instance_id, form_data, select_filter и набор методов CRUD.
Отредактировано py.user.next (Май 2, 2024 13:04:06)
Офлайн
py.user.nextЕсли мы говорим о программе, которая поддерживает все на свете, тогда я с вами согласен, наверное необходимо абстрагировать работу с БД. Эта подход и тот, код который вы приводили ранее мне ясен.
А если не будет движка для этой ORM-системы?
py.user.next
В вузе тоже может быть дурак какой-то. Я видал таких. Кто его поправит на парах? кто рискнёт? Но когда он в Интернет вылазит и ему говоришь, что он чушь несёт, он пытается с тобой, как со студентом, обращаться, сейчас двойку поставит. Вместо того, чтобы учиться, он пытается тебя заткнуть. Потому что ломать своё представление о своих способностях, это очень неприятно. И курсы от них тоже есть. Одного вот препода помню “абстракция - это вот какая-то каша у меня в голове, сам не знаю, что несу”. Кто его уволит с вуза, если он дебил? Никто его не уволит, потому что что? потому что надо будет искать нового и затыкать им дыру в расписании.
py.user.next
Надо обнаружить все объекты и рассмотреть, что они делают, какие у них взаимодействия. Это без всяких полей делается. Потому что полей можно напридумывать миллион в разных вариациях. И на них тоже не написано, что вот этот набор полей правильный, а вот этот набор полей неправильный.
class ServerWorksManager(): form_data: dict # Позволяет задать содержимое ORM объекта для сохранения и обновления данных в БД при CREATE и UPDATE instance_id: int # Позволяет задать id сервера при операциях READ, UPDATE и DELETE select_filter: int # Позволяет задать фильтр для остальных методов READ получения той или иной информации def create_server(self): orm.save(self.form_data) def get_server_by_id(self): orm.get(self.id) def delete_server(self): orm.delete(self.id) server_works_manager = ServerWorksManager(form_data=form_data) server_works_manager.create_server() server_works_manager = ServerWorksManager(instance_id=instance_id) server_works_manager.delete_server()
py.user.nextЯ по своей работе периодически общаюсь со стажерами и новичками, которые думают, что умеют в компьютеры и могут порой нести несусветную чушь. Но по той причине, что я вызвался в какой-то момент им помогать входить в курс дела, я запасся терпением и просто стараюсь им объяснять так, ка кони могут это понять. Работа в ВУЗе меня научила объяснять материал, как раз этим пользуюсь.
Но когда он в Интернет вылазит и ему говоришь, что он чушь несёт, он пытается с тобой, как со студентом, обращаться, сейчас двойку поставит.
Отредактировано bootcd (Май 2, 2024 15:06:12)
Офлайн
bootcdАлан Кей про то как стали использовать ООП в свое время сказал: “Я не это имел ввиду”)))
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП
Офлайн
> Просто реализация функционала на костылях - это плохой код. Велосипедные решения уже давно решенных задач - тоже. Код, который можно безболезненно встроить в имеющийся, который решает типовые задачи и написан согласно паттернам, решающим такие типовые задачи, если это код соответственно может быть использован в других местах и другими людьми - это по моему мнению хороший код.
Всё что ты написал это демагогия и не более того. “Хороший код” должен удовлетворять следующим критериям:
1) Правильно работать
2) Иметь достаточно хорошую архитектуру
3) Быть достаточно производительным
Насколько я понял с 1 и 3 пунктом проблем нет. Что касается 2-го пункта, то ты в первую очередь должен обеспечить слабую связанность между компонентами системы. Как раз SOLID и “депенденси инджекшн” (если ты не разобрался с тем что это такое обрати внимание на второй пост, там как раз он продемонстрирован) на это и нацелены.
> Там я вижу или нубский код типа моего или какую-то хтонь с дженериками, протоколами и прочими малопонятными мне на данный момент вещами.
Не нужно думать что если код “нубский”, то он плохой. Оценивай сами проекты, смотри сколько людей, звёзд и прочее.
Офлайн
> Я вижу такой класс вот так как в этом псевдокоде …
Первое что приходит в голову это вот так:
class ServerWorksManager(): def create_server(self, form_data): self.orm.save(form_data) def get_server_by_id(self, _id): self.orm.get(_id) def delete_server(self, _id): self.orm.delete(_id)
class ServerWorksManager(): def create_server(self, data): self.orm.save(data.form_data) def get_server_by_id(self, data): self.orm.get(data._id) def delete_server(self, data): self.orm.delete(data._id)
class Crud_Singleton: orm = .... class BaseData: def __init__(self): self._orm = Crud_Singleton() class Server(BaseData): def __init__(self, _id, form_data): super().__init__() self._id = _id self.form_data = form_data def create(self): self._orm.save(self.form_data) def get_by_id(self): self._orm.get(self._id) def delete(self): self._orm.delete(self._id)
Офлайн
bootcdhttps://dl.booksee.org/genesis/857000/bd68371f13bc18a27ddea0b64239e58a/_as/_Programmirovanie_na_Java_dlya_det(BookSee.org).pdf
В итоге я отказался от этой идеи и просто завел набор статических методов, используя класс как неймспейс.
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП, что я пришел вот к такому?
Отредактировано sa (Май 2, 2024 23:50:41)
Офлайн
bootcdВот пройдёт год, два, три, ты по этому описанию сам ничего не поймёшь. А если ты ещё и десяток программ таких напишешь за это время - тоже про серверы, про базы данных, про формы, про соединения, - то ты даже вспомнить не сможешь, про что ты там думал, когда это проектировал.
Как в на данный момент вижу объекты:
1. Есть необходимость реализовать набор функций. CRUD.
2. Эти функции работают вокруг одной темы. В частности они обеспечивают работу с ОРМ, касаемо выделенной темы. Я приводил в пример информацию о серверах организации.
3. Информация о сервере представляет собой набор данных касаемо самого сервера (формфактор, имя в домене и тп) и сопутствующих данных, например информация о доступе по протоколу ssh извне через IP адрес, выданный провайдером, информация о котором лежит в другом месте БД.
4. Я выделяю абстракцию “работа с серверами”. В нее могут входить данные, необходимые для работы (например данные из веб-формы или id записи в таблице БД) и методы, которые мне позволят оперировать с ОРМ через эти данные.
bootcdЕсли у тебя есть класс Менеджер, то с его помощью можно создать сто абсолютно одинаковых менеджеров, как будто склонированных. И это будут абсолютно разные объекты все, хоть у них вообще всё будет одинаковое. У каждого из этих объектов есть своя жизнь. Эти разные жизни могут протекать абсолютно одинаково, но при этом это абсолютно разные жизни.
То есть, по факту - это менеджер, который ходит и носит данные в БД, из нее или их там обновляет.
У меня возникли проблемы с пониманием объекта этого менеджера. Потому что по факту в классе “менеджер”, мы создаем инстансы не сколько самого менеджера, а разных по сути менеджеров (менеджер для создания, менеджер для удаления, менеджер для обновления и тд.)
В итоге я отказался от этой идеи и просто завел набор статических методов, используя класс как неймспейс.
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП, что я пришел вот к такому?
bootcdА с чего ты взял, что ты их знаешь?
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП
bootcd
Я написал набор классов, который состоит из статических методов, как раз, чтобы инкапсулировать работу с ORM.
bootcdЯ думаю: “Что-то он даже не видит, что у него нарушение инкапсуляции идёт. Так он, наверное, не знает про инкапсуляцию? Иначе зачем он про неё сначала пишет, а потом тут же её нарушает?”
По идее можно делать объект типа ServerRepo:
И в зависимости от необходимости в клиентской части укладывать в него нужное поле:илиserver = ServerRepo() server.data = form_data server.create()server.id = id server.new_data = form_data server.update()
Отредактировано py.user.next (Май 3, 2024 11:08:14)
Офлайн