Feelgood
можете построчно рассказать что делает эта функция
Класс SQLite, который я создал, является адаптером для модуля sqlite3 в питоне. Адаптер - это такая фигня, в которой ты можешь методы и поля написать как угодно, и снаружи он будет выглядеть так, как ты захочешь. При этом с другой стороны к нему подключается уже что-то такое, в чём ты методы и поля не можешь поменять. Так вот эти методы, которые ты не можешь поменять, могут быть жутко неудобными, требовать каких-то там синтаксических конструкций забубённых. Таких средств с такими методами может быть дофига и все они могут быть неудобными и, главное, могут сильно различаться между собой. Поэтому ты делаешь один удобный адаптер (с удобными методами) и управляешь им - пишешь программу на его основе. А к нему ты уже можешь подключать любую неудобную хрень и она будет правильно работать, потому что адаптер научен, как ею управлять. Благодаря адаптеру ты можешь менять одну хрень на другую хрень, но при этом вся твоя программа остаётся неизменной, потому что она пользуется только адаптером.
Вот пример из твоего кода
Feelgood
c.execute('''INSERT INTO finance(description, costs, total) VALUES (?, ?, ?)''', (description, costs, total))
Здесь написаны вопросы на месте подстановок. Но эти вопросы не стандартизованы и относятся только к одному модулю sqlite3 в питоне. Если вдруг модуль sqlite3 тебе не подойдёт и его надо будет заменить на другой модуль, то эти вопросы тоже надо будет менять на синтаксис того модуля. И прикинь, если у тебя таких мест в коде, где используется синтаксис модуля sqlite3, дофига. Тебе придётся полпрограммы менять. И так каждый раз при смене любого модуля.
Поэтому мы и строим адаптер, чтобы при смене модуля программу вообще не трогать, а переписать только один небольшой класс.
def execute(self, cmd, subvars=None): (1)
if subvars is None: (2)
self.cur.execute(cmd) (3)
else: (4)
newcmd = translate_universal_to_sqlite3(cmd) (5)
self.cur.execute(newcmd, subvars) (6)
self.conn.commit() (7)
1. Метод execute() адаптера SQLite со своей командой и своими переменными для подстановки
2. Если переменных для постановки не задано.
3. Выполнить у подключенной через модуль sqlite3 базы её метод execute(), передав команду напрямую.
4. Если переменные для постановки заданы.
5. Перевести команду с языка адаптера на язык модуля sqlite3 питона.
6. Выполнить у подключенной через модуль sqlite3 базы её метод execute(), передав переведённую команду и переменные для подстановки.
7. Завершить выполнение команды в базе данных (гарантированно переставить курсор).
Пункт 5 здесь переводит вопросики в команде в вопросики в новой команде. Но может быть и так, что вопросики в команде будут переводиться в %s, потому что в некоторых модулях используются не вопросики, а какие-то последовательности с процентом. Где-то %s, а где-то %1, %2 и так далее. Суть в том, что за все переводы отвечает адаптер, а в своей программе ты пишешь всё в одном стиле под этот свой адаптер, у которого свой язык, который ты задал.
Функцию translate_universal_to_sqlite3() ты тоже пишешь сам. В данном случае она принимает строку и возвращает эту же строку (потому что вопросики мы ни на что не меняем). В других случаях она может принять строку и вопросики заменить на %s.
То есть вся программа не узнает, что там что-то заменяется, она будет использовать только вопросики у адаптера.
И теперь главное - нахрена всё это нужно делать: если ты не будешь использовать интерфейсы и адаптеры, твоя программа в скором времени закупорится и её станет невозможно дорабатывать дальше (добавлять возможности, исправлять сложные баги); останется её либо использовать на том уровне, до которого её развить получилось (и с багами, которые невозможно исправить), либо выкинуть всё и писать всё заново. Пока программа маленькая, её можно заново написать. Но когда программа немаленькая, то заново её уже не напишешь, а выбрасывать жалко. Но итог у таких программ один - они не развиваются и неожиданно появляются конкурирующие программы, у которых всё нормально в коде. Так программу перестают использовать и уходят с неё на конкурирующую.
Отредактировано py.user.next (Дек. 8, 2017 02:54:04)