@oop_ru

Страница 356 из 785
Sergey
08.10.2017
16:59:28
там есть разные варианты и все сильно от задачи зависит

Андрэ
08.10.2017
16:59:39
Понятно, он получает от функции в бизнес-логике true\false, и далее уже как-то показывает это в ui. Я получил ответ на свой вопрос, спасибо.
вот я бы как-то так делал наверное. Получить от БД ошибку или нет и дальшге решить, что с ней делать

Sergey
08.10.2017
16:59:47
Ок, а приведите пример исключительных ситуаций для выбрасывания exception?
любая ситуация когда продолжать работу система не может

Google
Sergey
08.10.2017
17:00:13
не прошла транзакция - ну значит что-то там есть)

а для UI есть простая проверочка

Андрэ
08.10.2017
17:00:37
блин) я опечатался вместо БЛ - БД)

Sergey
08.10.2017
17:00:59
давай усложним - представь что у тебя нет бд)

Андрэ
08.10.2017
17:01:32
Ну погоди, мы ж не про БД. Мы про ситуацию, когда контроллеру надо что-то провалидировать так, что это только слой БЛ может сделать

Так я бы не кидал скорее всего эксепшн в слое БЛ, а сделал, чтобы контроллер, получив ответ, что валидация не прошла - решал бы уже что делать, эксепшн или выдача ответа юзеру и тп

Хотя конечно это все "в среднем по больнице"

Sergey
08.10.2017
17:02:35
нужны конкретные примеры и желательно разные

Max
08.10.2017
17:02:35
По исключениям понял, спасибо. Ок, а если мне в контроллере на каждый такой случай надо опрашивать бизнес-логику, получается лапша из if-else. Не проще ли спросить из бизнес-логики одну функцию, которая вернет мне error_msg?

Max
08.10.2017
17:03:03
Допустим, у меня не только ip адресс должен быть уникальным, но и что-то еще (nickname, email, etc)

Андрэ
08.10.2017
17:03:04
А почему вообще в конроллере?

Google
Андрэ
08.10.2017
17:03:15
Не подойдет ли тут какой- middleware например?

Sergey
08.10.2017
17:03:28
Андрэ
08.10.2017
17:03:30
Который до контроллера валидирует поля и кидает экспешн в случае чего

Sergey
08.10.2017
17:03:37
Допустим, у меня не только ip адресс должен быть уникальным, но и что-то еще (nickname, email, etc)
давай так. уникальный nickname + email это какой-то трэш с точки зрения ux

ip это явно уже другое какое-то ограничение

Max
08.10.2017
17:04:33
давай так. уникальный nickname + email это какой-то трэш с точки зрения ux
я притянутый за уши пример привел, понятно что это треш

Ilshat
08.10.2017
17:04:39
403

Sergey
08.10.2017
17:04:41
ну так давай реальные вещи обсуждать

потому что для трэша не стыдно и без объяснения причин вернуть

Андрэ
08.10.2017
17:04:57
403 на поле, не прошедшее валидацию на уникальность?

Ну я бы очень удивился, получив такое

Sergey
08.10.2017
17:05:06
409 - конфликт

403 - нет доступа

Ilshat
08.10.2017
17:05:30
у него ип как часть правила авторизации

Sergey
08.10.2017
17:05:30
422 - универсальный код для валидации

Max
08.10.2017
17:05:40
ip это явно уже другое какое-то ограничение
помимо ip, у меня допустим есть реферальный код, комплексная проверка user_agent и ip в бд и еще пару ограничений

Sergey
08.10.2017
17:05:43
у него ип как часть правила авторизации
ну так это на уровне инфраструктуры все

Андрэ
08.10.2017
17:07:05
Судя по всему, регистрация чего-либо. так как сложно представить, что при логине проверяется поле на уникальность

Google
Sergey
08.10.2017
17:07:15
просто представь

ты пользователь

ты просто кликнул кнопку

вся эта инфа типа ip адрес или там юзер агент браузера - это он не должен контролировать

Max
08.10.2017
17:07:42
давай так. В какой ситуации пользователь тебе булшит пришлет?
Он может попытаться зарегаться по реф коду, который не существует. Может с одного ip пытаться зарегаться со своими реф кодами. И тд

Sergey
08.10.2017
17:07:43
и сообщать ему что "чел ты походу браузер сменил" как-то ну такое

Андрэ
08.10.2017
17:07:58
ты так говоришь, будто я с тоббой о чем-то спорю)

Sergey
08.10.2017
17:08:08
он делает нехорошие вещи - просто не давай ему делать и говори что он не хороший человек

заботиться надо только если ты хочешь что бы человек попробовал еще раз

Max
08.10.2017
17:08:56
ну так зачем заботиться что бы он просто и понятно понял что хочет наипать систему?
Мне это надо логировать. И сказать как-то что он нехороший человек

Sergey
08.10.2017
17:08:59
скажем чел неверно чето ввел при оформлении заказа

доменные ивенты тут хорошо работают

EventStore::remember(IncorrectReferralInfo::occurred(data))

и записываешь ивенты

это наиболее универсальный но более сложный способ

Андрэ
08.10.2017
17:10:50
@fes0r , пока ты тут, хочу спросить о другом. Ты же, если не ошибаюсь, докер используешь сейчас активно? Есть желание поспрашивать разные штуки, но где бы это удобнее сделать?) Тут чат все не про деплой

Google
Андрэ
08.10.2017
17:11:32
Ну там я асбтракно спросил в никуда, так же абстрактно и молчат пока. Ну ок, я тебя понял

Max
08.10.2017
17:13:57
ивенты
логирование всегда только ивентами реализуется?

заворачиваешь в объект Identity и спрашиваешь один раз)
можешь ткнуть носом в какой-нибудь пример с Identity?

Sergey
08.10.2017
17:15:03
логирование всегда только ивентами реализуется?
нет конечно, можешь исключения логать, доступ к данным используемым у тебя ж есть

просто с ивентами было б неплохо тогда вообще все логать

и хорошее и плохое

и ответы с внешних сервисов

словом вообще все что бы можно было данные по этим ивентам восстановить

Max
08.10.2017
17:16:04
нет конечно, можешь исключения логать, доступ к данным используемым у тебя ж есть
Собственно, это и был мой изначальный вопрос - если юзер пытается меня наепать и бизнес-логика нарушается, то вываливается эксепшн. Который удобно логировать.

Max
08.10.2017
17:19:16
ну прикинь плюсы минусы)
Для меня это однозначно плюс, т.к. я вообще пишу на питоне и простом фреймворке, тут нет мощного ООП каркаса типа как у Laravel, мне всё это с нуля реализовывать - большая трата времени. А сколько не глянь проектов с django\flask на гитхабе, люди вообще лепят всю бизнес-логику в контроллер и считают что это ок.

Vlad
09.10.2017
13:06:43
Привет! Подскажите пожалуйста, какой путь лучше выбрать в следующей ситуации? Пишу на TypeScript класс хранилища каких-то данных одного типа - не вдаваясь в детали - он должен уметь принимать функцию-загрузчик данных и иметь метод subscribe, который возвращает observable, выдающий загруженные данные. class ObservableList<T> { setLoader(loader: (...args: Array<any>) => /*вопрос тут*/): void {} subscribe(): Observable<Array<T>> {} // другие служебные методы типа merge/remove/reload/reset } Дело в том, что функции-загрузчики могут возвращать либо promise с массивом, либо Observable с таким же массивом(ангуляр у нас). Собственно, вопрос: как поступить с этим знанием того, что загрузчики бывают двух типов? 1) Сперва думал унаследоваться от этого класса и переопределять в новом метод setLoader, не трогая остальное. Например class ObservableListFromPromise<T> extends ObservableList<T> { setLoader(loader: (...args: Array<any>) => Promise<Array<T>>) } и такой же с Observable 2) Обойтись без наследования и ограничиться тем, что вызывать внутри загрузчик и проверять что он вернул - promise или observable - и от этого дальше танцевать. А может быть ни один из этих вариантов не хорош? Объясню зачем мне это - заметил, что часто в проекте встречается одинаковая работа по загрузке/обновлению/удалению данных в списках, и у таких списков несколько представлений в интерфейсе - сам список, фильтры над ним, аггрегаторы типа "100500 позиций, из них over9K таких и чуть-чуть вот таких". Поэтому захотел максимально унифицировать работу с ними и не писать каждый раз одно и то же

Dmitriy
09.10.2017
13:12:49
Ребята подскажите пожалуйста по Symfony 3, если кто в нем силен. Не работают роутинги на проде. Допустим localhost/app_dev.php - маршруты работают. localhost/app.php - тоже работают. а вот localhost/ - страница отображается, но при попытке перейти куда-то получаю 404. Кеш чистил, не помогает

Dmitriy
09.10.2017
13:14:13
@symfony_php
cпасибо

Aleh
09.10.2017
13:22:20
Привет! Подскажите пожалуйста, какой путь лучше выбрать в следующей ситуации? Пишу на TypeScript класс хранилища каких-то данных одного типа - не вдаваясь в детали - он должен уметь принимать функцию-загрузчик данных и иметь метод subscribe, который возвращает observable, выдающий загруженные данные. class ObservableList<T> { setLoader(loader: (...args: Array<any>) => /*вопрос тут*/): void {} subscribe(): Observable<Array<T>> {} // другие служебные методы типа merge/remove/reload/reset } Дело в том, что функции-загрузчики могут возвращать либо promise с массивом, либо Observable с таким же массивом(ангуляр у нас). Собственно, вопрос: как поступить с этим знанием того, что загрузчики бывают двух типов? 1) Сперва думал унаследоваться от этого класса и переопределять в новом метод setLoader, не трогая остальное. Например class ObservableListFromPromise<T> extends ObservableList<T> { setLoader(loader: (...args: Array<any>) => Promise<Array<T>>) } и такой же с Observable 2) Обойтись без наследования и ограничиться тем, что вызывать внутри загрузчик и проверять что он вернул - promise или observable - и от этого дальше танцевать. А может быть ни один из этих вариантов не хорош? Объясню зачем мне это - заметил, что часто в проекте встречается одинаковая работа по загрузке/обновлению/удалению данных в списках, и у таких списков несколько представлений в интерфейсе - сам список, фильтры над ним, аггрегаторы типа "100500 позиций, из них over9K таких и чуть-чуть вот таких". Поэтому захотел максимально унифицировать работу с ними и не писать каждый раз одно и то же
loader: () => Promise<T> | Observable<T>?

Google
Vlad
09.10.2017
13:23:14
loader: () => Promise<T> | Observable<T>?
Ага, это тот самый второй вариант, который я описал. Ну т.е. наследование тут излишне ? Спасибо )

Aleh
09.10.2017
13:23:46
ну я не понял зачем вам наследование, вроде как проблему не решает

Vlad
09.10.2017
13:28:36
Было сомнение на тему как реализовать - унаследоваться два раза(ObservableListFromPromise и ObservableListFromRx) и переопределить один метод в них(setLoader), или написать if (loader instanceof Promise) { ... } else { ... } Сейчас прикидываю - наследование внесло бы путаницу - в какой части проекта какой класс использовать - от promise или от observable. А тут универсально - спрячу if и всем хорошо одинаково ?

andretshurotshka?❄️кде
09.10.2017
13:31:33
Either ))

Aleh
09.10.2017
13:32:06
я не понимаю как наследование избавит от if (loader instanceof)

Vlad
09.10.2017
13:41:46
Точно ) Сперва спрашиваю, потом думаю ? От этого if никак не избавиться ) Вот как-то так предполагалось: class ObservableList<T> { private loaderType: 'promise' | 'rx'; private loadPromise() { this.loader().then().catch(); } private loadRx() { this.loader().subscribe()...; } private load() { this.loaderType === 'promise' ? this.loadPromise() : this.loadRx() } } } class ObservableListFromPromise<T> extends ObservableList<T> { setLoader(loader: (...args: Array<any>) => Promise<Array<T>>) { this.loaderType = 'promise'; ... } } и class ObservableListFromRx<T> extends ObservableList<T> { setLoader(loader: (...args: Array<any>) => Observer) { this.loaderType = 'rx'; ... } }

Sergei
09.10.2017
20:26:36
Всем добрый день. Возник вопрос[наброс]: в какой мере прнципы ООП применимы при проектировании REST API в микросервисной архитектуре? В моём представлении - SOLID он везде SOLID, но практика может отличаться от теории.

Sergey
09.10.2017
20:27:27
во вторых - микросервисы можно воспринимать как эктор модел

в третьих... это обмен сообщениями между экторами

то есть между модулями

ну а далее все вещи просто становятся менее явными

Sergei
09.10.2017
20:29:00
Sergey
09.10.2017
20:29:46
В этом месте немного неясно. Отчего "не REST"?
мне лень. Не переживай просто, ну нет у тебя rest, и раньше небыло и не будет никогда (нет гипертекста ж)

многие так живут и ничего

ты лучше другую мысль подумай

Sergey
09.10.2017
20:30:27
у тебя разница только в том что "поведение" описывается протоколом взаимодействия микросервисов

то есть менее явно с одной стороны (скажем ты можешь LSP сломать если у тебя есть несколько реализаций одного микросервиса которые ты подменяешь)

Страница 356 из 785