Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2024 10:31:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

bootcd
Если вы про именно программистскую вышку - да, у меня такого нет. Я весьма бородатый админ, инженер по образованию. Но сфера разработки приложений сложнее чем скрипты - это для меня новая сфера, да.
Да даже не вышку, просто нижку. Какие-нибудь игры классические типа там Doom или Warcraft написаны без ООП, но это не значит, что ты их напишешь. Это же надо уметь программировать.

bootcd
Мои знания питона - сисадминские. То есть, написать скрипт для мониторинга, парсер логов, добавить в готовую прогу код для метрик Prometheus, дренуть ручку, что-то с нее получить, передать далее и тп.
И ты путаешь знание питона и знание программирования. Это разные вещи. Питон - это карандаш, а программирование - это изобразительное искусство, рисование, если по-простому. Если ты карандаш изучил со всех сторон и даже провёл его молекулярный анализ, то это не значит, что ты им можешь нарисовать сову или кошку автоматически. Для этого надо не карандаш изучать и даже не кисточки, а теорию рисования. Там ни карандаша нет, ничего подобного, эту теорию можно применять хоть к палке на песке, она одинаковая для любых инструментов. И она сама не изучится и ни из какого космоса к тебе в снах сама собой не придёт. Это нужно учиться, тренироваться и так далее.



Отредактировано py.user.next (Май 2, 2024 10:32:52)

Офлайн

#2 Май 2, 2024 10:35:53

bootcd
Зарегистрирован: 2024-04-30
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

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

Это сокращенный код, но суть, я думаю, ясна.
По идее если у меня будет другая БД, я могу изменить engine. Это можно подцепить на аргумент при запуске миграции и затем выставить его в env. Типа, если mysql, то такой-то engine, если postgresql то такой-то. Единственный вопрос, наверное, это то как произойдет миграция, если в sqlalchemy моделях будут какие-то специфические, например, для postgresql вещи.

py.user.next
Давай так: провёл ли ты декомпозицию на объекты, перед тем как вообще классы затрагивать? Сначала нужно выяснить, какие объекты есть и что они делают, когда всё это работает. Это ещё никаких классов нет. Потому что где-то нужно допридумать объекты, где-то их разделить на части (на другие объекты), где-то их соединить (слить в один объект или агрегировать, собрав в одном объекте, не разрушая их границ и не лишая их состояний). Когда у тебя объекты все установлены и функционируют, образуя работающие механизмы, тогда ты думаешь над классами этих объектов - как всю эту массу объектов разбить на отдельные классы по общим признакам. Классы потом тоже нужно увязывать в отношения, чтобы сохранять целостность и компактность программы, устойчивость к изменениям и нововведениям.

Вот! Как раз тут у меня и возникли вопросы.
Я мыслил так.
Я описываю абстракцию “Работа с моделями ОРМ по определенной теме”. Тема, например, серверы организаций-клиентов. Соответственно я создаю класс, который включает в себя всю логику работы с данными из БД по этой теме.
Объект по сути - это набор данных и инструменты работы с ними в виде одной сущности.
По идее такой объект может выглядеть как набор полей: instance_id, form_data, select_filter и набор методов CRUD.
Но тогда я сталкиваюсь с проблемой создания инстанса. Потому как для метода create мне нужно проставить поле form_data, для update мне нужны id и form_data, для delete - поле id, а для методов разной выборки select_filter. То есть абстракция будет порождать экземпляр все время с разным состоянием. Поэтому я отказался от объектов с соcтоянием и сделал класcы просто для неймспейсов. Это мне кажется не верным подходом. Я сюда как раз и пришел за советом, наверное.
Я как раз и не могу понять как реализовать такую абстракцию в виде объекта.



Отредактировано bootcd (Май 2, 2024 10:39:06)

Офлайн

#3 Май 2, 2024 10:53:27

bootcd
Зарегистрирован: 2024-04-30
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

py.user.next
Да даже не вышку, просто книжку. Какие-нибудь игры классические типа там Doom или Warcraft написаны без ООП, но это не значит, что ты их напишешь. Это же надо уметь программировать.

Для начального изучения питона для своих админских нужд я конечно читал книги. Лутца того же. Если оценивать мои скиллы, то наговнокодить я могу разные штуки. по крайней мере взять библиотеку и прочитать документацию - это не проблема. Это часть профессии.

Вопрос в том, что сам процесс произрастания из говнокодера во что-то вменяемое, требующий определенного впитывание информации, чужого опыта и банального набивания шишек, невозможен без получения той самой информации в приемлемом и понятном виде. Так сложилось, что вокруг меня нет опытных разрабов, готовых ответить на какие-то вопросы, поэтому пришел сюда.
Насчет “уметь программировать” - все зависит от критериев оценки. Я уже убедился в том, что многие “умеющие программировать” больше трепят об этом языком, нежели делают дело. Посмотрел однажды отрывки из какого-то платного курса по питону и мне как человеку, имеющему опыт преподавания в ВУЗе, было больно.

py.user.next
Это нужно учиться, тренироваться и так далее.
Этим как раз и занимаюсь. Единственное, что учителей нет, одни умники вокруг.

Офлайн

#4 Май 2, 2024 12:57:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

bootcd
По идее если у меня будет другая БД, я могу изменить engine.
А если не будет движка для этой ORM-системы? Ну, например, база данных представляет из себя текстовые файлы. Как ты сохранишь CRUD, который ты сделал и в котором там много тысяч строк, для подобной базы данных? Никак. Это нереально? Нет, это реально, для этого ООП и существует как раз. Оно даёт полностью менять поведение тонны кода лёгким движением руки.

bootcd
Я описываю абстракцию “Работа с моделями ОРМ по определенной теме”.
Это не абстракция. Абстракция - это такая сущность, которая нужна, чтобы выделить основные черты и спрятать детали. Ну например, я тебе говорю “ты видел собаку на улице?”, ты сразу представляешь что? Жучку с пятого подъезда, такую в ошейнике на рулетке, которую выгуливает хозяйка Клара Ивановна, или ты представляешь какую-то собаку, хрен пойми какую, но вот ты знаешь, что у неё есть шерсть, скорее всего, четыре лапы, уши, хвост какой-то, и она куда-то ходит и делает непонятно что, только в общих чертах ясно, что она делает? Вот с этой собаки можно налепить много разных собак, при этом она - одна. Вот это абстракция, абстракция собаки.

И вот абстрактная собака может погнаться за абстрактной кошкой. Какая за какой? Мы не знаем, это абстракции, но они прилепляются к любым этим ситуациям.

bootcd
Посмотрел однажды отрывки из какого-то платного курса по питону и мне как человеку, имеющему опыт преподавания в ВУЗе, было больно.
В вузе тоже может быть дурак какой-то. Я видал таких. Кто его поправит на парах? кто рискнёт? Но когда он в Интернет вылазит и ему говоришь, что он чушь несёт, он пытается с тобой, как со студентом, обращаться, сейчас двойку поставит. Вместо того, чтобы учиться, он пытается тебя заткнуть. Потому что ломать своё представление о своих способностях, это очень неприятно. И курсы от них тоже есть. Одного вот препода помню “абстракция - это вот какая-то каша у меня в голове, сам не знаю, что несу”. Кто его уволит с вуза, если он дебил? Никто его не уволит, потому что что? потому что надо будет искать нового и затыкать им дыру в расписании.

bootcd
По идее такой объект может выглядеть как набор полей: instance_id, form_data, select_filter и набор методов CRUD.
Надо обнаружить все объекты и рассмотреть, что они делают, какие у них взаимодействия. Это без всяких полей делается. Потому что полей можно напридумывать миллион в разных вариациях. И на них тоже не написано, что вот этот набор полей правильный, а вот этот набор полей неправильный.



Отредактировано py.user.next (Май 2, 2024 13:04:06)

Офлайн

#5 Май 2, 2024 15:04:43

bootcd
Зарегистрирован: 2024-04-30
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

py.user.next
А если не будет движка для этой ORM-системы?
Если мы говорим о программе, которая поддерживает все на свете, тогда я с вами согласен, наверное необходимо абстрагировать работу с БД. Эта подход и тот, код который вы приводили ранее мне ясен.


py.user.next
В вузе тоже может быть дурак какой-то. Я видал таких. Кто его поправит на парах? кто рискнёт? Но когда он в Интернет вылазит и ему говоришь, что он чушь несёт, он пытается с тобой, как со студентом, обращаться, сейчас двойку поставит. Вместо того, чтобы учиться, он пытается тебя заткнуть. Потому что ломать своё представление о своих способностях, это очень неприятно. И курсы от них тоже есть. Одного вот препода помню “абстракция - это вот какая-то каша у меня в голове, сам не знаю, что несу”. Кто его уволит с вуза, если он дебил? Никто его не уволит, потому что что? потому что надо будет искать нового и затыкать им дыру в расписании.

Первый скилл преподавателя заключается в том, что он умеет доносить информацию до обучаемого. Не всякий ученый способен объяснить новичку материал, которым он мастерски владеет. Но умничать и вдаваться в пространные рассуждения вполне. Я выявил статистику. Примерно 80% отличных программистов, с трудом могут объяснить новичку, что такое переменная. Так, чтобы новичек это понял. Второй скилл - умение сомневаться в своих и чужих знаниях, чтобы смочь прокачать свои и передать их другому.

py.user.next
Надо обнаружить все объекты и рассмотреть, что они делают, какие у них взаимодействия. Это без всяких полей делается. Потому что полей можно напридумывать миллион в разных вариациях. И на них тоже не написано, что вот этот набор полей правильный, а вот этот набор полей неправильный.

Как в на данный момент вижу объекты:

1. Есть необходимость реализовать набор функций. CRUD.
2. Эти функции работают вокруг одной темы. В частности они обеспечивают работу с ОРМ, касаемо выделенной темы. Я приводил в пример информацию о серверах организации.
3. Информация о сервере представляет собой набор данных касаемо самого сервера (формфактор, имя в домене и тп) и сопутствующих данных, например информация о доступе по протоколу ssh извне через IP адрес, выданный провайдером, информация о котором лежит в другом месте БД.
4. Я выделяю абстракцию “работа с серверами”. В нее могут входить данные, необходимые для работы (например данные из веб-формы или id записи в таблице БД) и методы, которые мне позволят оперировать с ОРМ через эти данные.
Я вижу такой класс вот так как в этом псевдокоде:

 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)

Офлайн

#6 Май 2, 2024 18:13:35

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

bootcd
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП
Алан Кей про то как стали использовать ООП в свое время сказал: “Я не это имел ввиду”)))

Офлайн

#7 Май 2, 2024 18:54:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2740
Репутация: +  183  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

> Просто реализация функционала на костылях - это плохой код. Велосипедные решения уже давно решенных задач - тоже. Код, который можно безболезненно встроить в имеющийся, который решает типовые задачи и написан согласно паттернам, решающим такие типовые задачи, если это код соответственно может быть использован в других местах и другими людьми - это по моему мнению хороший код.

Всё что ты написал это демагогия и не более того. “Хороший код” должен удовлетворять следующим критериям:
1) Правильно работать
2) Иметь достаточно хорошую архитектуру
3) Быть достаточно производительным
Насколько я понял с 1 и 3 пунктом проблем нет. Что касается 2-го пункта, то ты в первую очередь должен обеспечить слабую связанность между компонентами системы. Как раз SOLID и “депенденси инджекшн” (если ты не разобрался с тем что это такое обрати внимание на второй пост, там как раз он продемонстрирован) на это и нацелены.

> Там я вижу или нубский код типа моего или какую-то хтонь с дженериками, протоколами и прочими малопонятными мне на данный момент вещами.

Не нужно думать что если код “нубский”, то он плохой. Оценивай сами проекты, смотри сколько людей, звёзд и прочее.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Май 2, 2024 19:21:50

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2740
Репутация: +  183  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

> Я вижу такой класс вот так как в этом псевдокоде …

Первое что приходит в голову это вот так:

 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)
Ну и так далее, надеюсь что ты понял.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Май 2, 2024 23:34:46

sa
Зарегистрирован: 2024-03-16
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

bootcd
В итоге я отказался от этой идеи и просто завел набор статических методов, используя класс как неймспейс.
Вопрос именно в том, где у меня кардинальное непонимание принципов ООП, что я пришел вот к такому?
https://dl.booksee.org/genesis/857000/bd68371f13bc18a27ddea0b64239e58a/_as/_Programmirovanie_na_Java_dlya_det(BookSee.org).pdf
Не читал книгу Якова Файна “Программирование на Java для детей…”, про объекты мне кажется лучше всех разложено.
Понимаешь же для чего функции? если скрипты пишешь в один экран, они не нужны вроде как, а если программа на 1000 строк, то нужно в функции все раскладывать, иначе уже завтра не сможешь свой код поменять.
Объекты это более продвинутый метод упаковки кода, когда уже функций недостаточно стало, программы подросли, придумали ООП. Объекты удобнее, у нас в жизни все объекты, описывать код удобно.

Отредактировано sa (Май 2, 2024 23:50:41)

Офлайн

#10 Май 3, 2024 11:00:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

Правильный CRUD репозиторий.

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version