
?
04.04.2017
13:38:30
https://www.youtube.com/watch?v=85B3FV_sB60
https://www.youtube.com/watch?v=C3u6b2-y9Vk

Oleg
04.04.2017
14:01:17
А перевод есть ?

?
04.04.2017
14:01:37
Нету

Google

Oleg
04.04.2017
14:11:44
пичаль

da horsie
04.04.2017
16:39:05

f4rt~
04.04.2017
17:00:54

Sergei
05.04.2017
10:04:26
Кто читал книгу: http://ecx.images-amazon.com/images/I/815pmDIU7yL.jpg
Стоит читать или нет?

Dmitry
05.04.2017
10:17:04
Такая есть на русском вроде

Aleh
05.04.2017
10:31:00
https://www.innoq.com/en/blog/fp-vs-oo/

.avolver
05.04.2017
10:31:57

Aleh
05.04.2017
10:32:52

Oleg
05.04.2017
11:14:39

Dmitry
05.04.2017
11:18:13
Прошу прощение, перепутал. На русском нет.
https://habrahabr.ru/post/312248/

Sergei
05.04.2017
13:02:15
Всё ясно, 400 страниц вполне терпимо
Вообще советую не искать в русском переводе, а читать в оригинале.

Max
06.04.2017
01:00:55
Господа, день добрый. Вопрос про ООП в питоне: есть class App, который дергает data-storage и отдает данные интерфейсу (консоли, гую etc).
Data-storage - это пока что sqlite3, class Database (коннект к базе) и модуль models, где по классу на каждую таблицу, raw sql-запросы на get\set там же.
Вопрос - каким паттерном элегантней и проще всего организовать доступ к базе данных через App?
Готовые ORM предлагать не надо, тут задача чисто поломать себе голову. Делал бы на php\java - лепил бы фабрику, статичные методы, синглтоны, но в питоне ведь синглтоны лучше не лепить.

da horsie
06.04.2017
01:02:19
синглтоны лучше нигде не лепить

Google

Max
06.04.2017
01:08:23

da horsie
06.04.2017
01:13:36
Гм
Не создавать много коннектов и пользоваться одним?

Max
06.04.2017
01:17:53
Гм
да, коннект к базе и должен же быть один, и под эту задачу так и просится синглтон

da horsie
06.04.2017
01:19:43
Нужен ли тебе одноразовый молоток чтобы забить ровно один гвоздь?
"так и просится паттерн" - опасный симптом

Max
06.04.2017
01:21:01

da horsie
06.04.2017
01:21:30
Гвоздь - задача. Молоток - готовый инструмент.

Sergei
06.04.2017
01:22:43
Ок, собственно вариантов не густо:
1) полноценный синглтон - сам создаётся в момент первого обращения; обращаемся через статическую функцию типа "getDatabase()";
2) "недосинглтон" - необходимо инициализировать принудительно, в момент первого доступа может быть уже инициализирован (используем) или ещё не инициализирован (сообщаем об ошибке); обращаемся так же как и к синглтону через статический метод;
3) передаём "по-старинке" ссылку на объект БД в каждый объект, которому она нужна - обращаемся по переданной ссылке.

da horsie
06.04.2017
01:24:16
По-моему тут выбор между номеами 3, 3 и 3

Max
06.04.2017
01:24:41

da horsie
06.04.2017
01:25:41
Либо у них есть веские причины либо они не такие умные
Синглтон = глобал стейт

Sergei
06.04.2017
01:26:17
С синглтоном одна большая проблема - он "отравляет" код синглетонизмом.
Сейчас разовью мысль.

Admin
ERROR: S client not available

Max
06.04.2017
01:27:46
Синглтон = глобал стейт
Хорошо, но тут либо я явно импортирую модуль (подключаю класс) и беру инстанс, либо явно передаю инстанс аргументом.

da horsie
06.04.2017
01:28:13
Передавай зависимость явно

Max
06.04.2017
01:28:53
Если синглтон плох, но все еще продолжает быть в умных книжках\чужом коде (не noname проектов), значит все-таки есть веские причины его использовать?

Google

Sergei
06.04.2017
01:29:18
Синглтон будет инициализирвоан в момент первого обращения. Неприятно то что иногда вызов синглтона может быть добавлен в какое-то новое место кода, и синглтон будет инициализирован сильно раньше чем ожидаемо.
Это либо означает что синглтон может использовать еще неинициализированные системы, или необходимо гарантировать что все системы к которым синглтон обращается - тоже синглтоны ("отравление кода синглетонизмом").

da horsie
06.04.2017
01:30:24

Sergei
06.04.2017
01:30:25
(Но некоторые люди конечно получают травмы и по результату недовольны)
Синглетон - просто написать, просто использовать, "прямо просится в код". Проблемы: усложняет инициализацию приложения, усложняет юнит-тестирование и т.д.
Передавать зависимости - упрощает юнит тестирование, делает инициализацию очевидной. Но заставляет думать за каждый класс - что ему нужно и когда.


Max
06.04.2017
01:37:09
Я понял ваши, доводы, спасибо что поделились мыслями. Получается, либо лепить глобал стейт (для меня это псевдо-глобал стейт, т.к. кроме как открытия коннекта синглтон ничего не делает), либо явно передавать аргументом. Но это же тогда нужно заранее создавать инстанс бд, следить чтобы он был один, городить обвязки (чтобы было тру-ооп)

da horsie
06.04.2017
01:42:10


Sergei
06.04.2017
01:42:26
например я хочу протестировать как объект будет писать сам себя в БД, какие вызывать методы и т.д.
в случае с явной передачей параметров я сделаю что-то отдаленно вот такое:
DB *mock = new MockDb();
myObject.useDb(mock);
myObject.serializeToDb();
// и здесь смтотреть что там в mock DB было по факту записано
а в случае с синглтоном:
// ну передать я понятно ничего не могу - оно там внутри же синглтоном использует
myObject.serializeToDb() ;// ууупс, оно там внутри попробует использовать синглтон - как его теперь подменить на MockDB?
@sparmax пример про такой кейс - он практически из жизни; однажды я должен был проследить поведение объекта в момент записи данных в Redis. по счастью я передавал зависимости явным образом, и не составило труда вместо настоящего Redis передать искусственно созданный "очень похожий" объект, который записывал внешние обращения и сравнивал их с эталонными.


Max
06.04.2017
01:55:58
Хорошо, если не синглтон, то какой тогда безопастный способ передать аргументом инстанс базы и следить, чтобы инстансов больше не создавалось? делать счетчик и assert писать?