
Denis
10.10.2016
13:43:37
не хотим )
но у тебя в ответе XML потому что ты передал в Accept: xml так?

Mikhail
10.10.2016
13:44:01
ничего личного, просто просто)

Alex
10.10.2016
13:44:37
короч я всё равно по фрагменту алгебры не понял бы до конца что это и зачем, нужно увидеть или интерпретатор, или пример доменного кода

Google

Alex
10.10.2016
13:45:30
вырвано из контекста™

Mikhail
10.10.2016
13:46:10
> @notxcain
но у тебя в ответе XML потому что ты передал в Accept: xml так?
как там в твиттере - не помню, но сигнализировать можно как угодно. вплоть до того что и вовсе сервер решит что отдаст и не будет слушать что у него попросят) это как раз детали не важные, но легко заменяемые)

Denis
10.10.2016
13:46:26
ну нафиг такое API )

Mikhail
10.10.2016
13:46:34
это уже другой вопрос)

Denis
10.10.2016
13:46:52
но даже в примере с Accept у тебя ответ зависит от запроса

Mikhail
10.10.2016
13:46:58
нет
это побочка

Denis
10.10.2016
13:47:01
это уровень HTTP
в уровне приложения так же

Mikhail
10.10.2016
13:47:20
нет
ибо в параметры запроса это не входит. ( и даже если бы входило в http body - все равно не входит)
потому что это обрабатывается обработчиком http servera, а не обработчиком "запроса"
есть запрос "хттп", а есть запрос "апи метода"

Google

Mikhail
10.10.2016
13:48:13
и это разные уровни
и на уровне апи метода - реквест ни в коем случае не должен влиять на вид респонза - это должно определяться самой сигнатурой апи метода

Denis
10.10.2016
13:49:48
HttpRequest -> DTO -> method involation -> DTO -> HttpResponse это все разные уровни.

Mikhail
10.10.2016
13:49:53
если у тебя def x2(v:Int):String = то, какое бы значение инта ты не передал - на выходе будет всегда одна структура стринга

Denis
10.10.2016
13:50:02
ок
но никто же не мешает побольше в типы заложить
если можно

Alex
10.10.2016
13:50:25
так а в чем проблема всандалить копроизведение?

Denis
10.10.2016
13:51:23
откуда мы вообще начали про запросы и опустились до HTTP я кстати не понимаю

Alex
10.10.2016
13:51:34
я ж говорю у чела чтото личное :)

Mikhail
10.10.2016
13:51:55
ошибаешься)
это я к тому, что вместо Command[Response] - на практике гораздо выгоднее иметь Executor[Request,Response]

Denis
10.10.2016
13:52:38
Это все способо закодировать вызов метода в структуру данных, чтобы отложить реальный эффект на момент интерпретации
sealed trait Service[A]
final case class GetTweets(userId: UserId) extends Service[List[Tweet]]
final case class GetUserName(userId: UserId) extends Service[UserName]
final case class GetUserPhoto(userId: UserId) extends Service[UserPhoto]
результат зависит от того что ты хочешь )
GetTweets получи список List[Tweet]
GetUserPhoto - UserPhoto
как тут может не зависить?
http://underscore.io/blog/posts/2015/04/14/free-monads-are-simple.html
Вы знали что так можно писать?

Google

Denis
10.10.2016
13:58:27
val foo =
if (true) "1"
if (false) "0"
else "42"
без else if
у меня тут джуниор написал я офигел )
а не нельзя
вру )
foo будет типа Any

Alex
10.10.2016
14:04:14
ну да оно же partial

Mikhail
10.10.2016
14:05:21
с силдами опять не лучший пример годной архитектуры( как всегда - имхо). но видимо для того, чтобы показать что есть другие способы (а именно использование шаблона executor: UserId => UserPhoto - тут завист от задачи чем будет экзекутор, функцией или классом - не суть важно - главное разделяй и влавствуй) и показать их преимущества - необходимо взять реал ворлд примеры и уже на них показывать по существу) иначе сейчас высказывание собственного мнения превращается в демагогию)

Denis
10.10.2016
14:07:17
что за шаблон executor?

Mikhail
10.10.2016
14:07:20
но здесь есть один нюанс, когда final case class GetUserPhoto(userId: UserId) extends Service[UserPhoto] - (по крайней мере вариация данного случая) имеет место быть - а именно с точки зрения клиента
я конечно же не обратил внимание на то, что рассматривал все это именно с точки зрения хоста который обрабатывает данные запросы

Alex
10.10.2016
14:08:53
лётчик.жпг

Mikhail
10.10.2016
14:08:54
я это образно называл шаблоном
баунды - шаблоны. var method = Request => Response

Denis
10.10.2016
14:12:59
method: GetUserPhoto => UserPhoto это тоже самое что final case class GetUserPhoto(userId: UserId) extends Service[UserPhoto]

Alex
10.10.2016
14:13:20
ну нет

Denis
10.10.2016
14:13:36
ну если интерпретировать в Id[_]
я образно, для объяснения
тогда можно этот метод обобщить вот так def method[R](request: ServiceOp[R]): R
а уж откуда ты взял этот ServiceOp и что потом сделал с R это неважно

Google

Mikhail
10.10.2016
14:17:33
я это применяю именно в виде def get_user_photo[UserPhoto]( id:UserId):UserPhoto = // утрировано
без создания доп прослойки request:ServiceOp[UserId] - ибо не пониманию зачем это нужно. ведь Method ( def get_user_photo: UserId => R) - уже достаточно
я что хочу сказать то - что такая вещь как java.lang.reflect.Method - коим является метод конкретного класса с известной сигнатурой - уже вполне может выполнять роль ServiceOp - без создания промежуточных носителей

Denis
10.10.2016
14:20:14
зачем get_user_photo (sic) параметризирован по UserPhoto?

Mikhail
10.10.2016
14:20:36
для наглядности

Denis
10.10.2016
14:20:42
не хочу знать ничего про java.lang.reflect :)

Mikhail
10.10.2016
14:20:53
def get_user_photo[R]( id:UserId):R // R - UserPhoto

Denis
10.10.2016
14:21:08
def get_user_photo[R]( id:UserId):R // R - UserPhoto это как понять?
зачем тут R?
он что вернет любой R который я запрошу?

Admin
ERROR: S client not available

Mikhail
10.10.2016
14:21:43
я же говорю, что я просто для наглядности написал юзерфото и там и там

Alex
10.10.2016
14:22:01
как бы весь огород городится в том числе и для того, чтобы выкинуть рефлекшн нахреф
вместе с его друзьями asInstanceOf и isInstanceOf

Denis
10.10.2016
14:23:12
def get_user_photo( id:UserId): UserPhoto - так есть смысл

Mikhail
10.10.2016
14:23:41
естественно, что так и будет)

Denis
10.10.2016
14:23:57
ок
ты правда пишешь снейккейсом в скале?
это же не руби/питон

Google

Mikhail
10.10.2016
14:25:08
нет конечно. camel case наше все. но в отдельных случаях - именно так и пишу.

Viacheslav
10.10.2016
14:25:20
code convention Для неудачников

Denis
10.10.2016
14:25:25
в каких?

Mikhail
10.10.2016
14:27:52
у меня есть конкретный набор правил где я использую снейк кейс. в частности тот же пример с обработкой апи команд по хттп. в апи методах гораздо легче читается user.get_some_dlinniy_method (имхо естественно) нежели user.getSomeDlinniyMethod. и именно для этих методов я использую снейк кейс. иногда экспериментирую с другими частями, но должен быть серьезный аргумент)

Alex
10.10.2016
14:28:07
я помню пару месяцев назад тут (или в скалачате) какой-то чел натурально негодовал, что в примере кто-то посмел назвать переменную одной буквой

Mikhail
10.10.2016
14:28:20
естественно я не позволяю себе писать var id:Int = 0, var id_user:Int = 0 рядышком)

Alex
10.10.2016
14:28:22
типа нагло растоптал читабельность

Mikhail
10.10.2016
14:28:41
плохой пример)
idUser, some_var ))

Viacheslav
10.10.2016
14:28:57

Mikhail
10.10.2016
14:29:35
https://dev.twitter.com/rest/reference/post/account/remove_profile_banner

Denis
10.10.2016
14:29:39
я бы начал нескольк раз вчитываться и очень бы напрягся увидев такое

Mikhail
10.10.2016
14:29:56
где же тут велосипед, если повсеместно принято в хттп апи использовать снейк кейс)

Denis
10.10.2016
14:30:04
причем тут хттп
ты же на скале пишешь
и это название Scala метода

Mikhail
10.10.2016
14:30:31
и что? оно же является методом хттп апи
или ты мне предлагаешь делать отдельный маппинг remove_profile_banner => removeProfileBanner ?

Nikolay
10.10.2016
14:31:04
кстати, вспомните в spray/akka-http headers и прочие сущности. они там пишут как ``Content-Type``

Mikhail
10.10.2016
14:31:04
вот этого я как раз таки избегаю

Denis
10.10.2016
14:31:26
Это во благо DSL

Nikolay
10.10.2016
14:31:40
в общем в кавычках они пишут