👀
иными словами - нужно чтобы функция main из примера продолжала выглядеть так же или лучше, но при этом весь демо-функционал мог работать?
👀
при этом обязательно должны быть функции Send к трем разным сетям?
Denis
иными словами - нужно чтобы функция main из примера продолжала выглядеть так же или лучше, но при этом весь демо-функционал мог работать?
Если необходимо можешь внести изменения в функцию main и в любые другие сущности, на свое исмотрение, самое главное, это чтобы ты избавился от интерфейса SendProvider type SendProvider interface { Send(u User, msg string) }
👀
я хочу задачу понять, интерфейс тут просто не причем. верно ли я понимаю, что надо, чтобы функция main из примера продолжала выглядеть так же или лучше, но при этом весь демо-функционал мог работать? при этом обязательно должны быть функции Send к трем разным сетям?
👀
ок
Denis
я хочу задачу понять, интерфейс тут просто не причем. верно ли я понимаю, что надо, чтобы функция main из примера продолжала выглядеть так же или лучше, но при этом весь демо-функционал мог работать? при этом обязательно должны быть функции Send к трем разным сетям?
Мы же все это время обсуждали что интерфейсы избыточны, вот я написал пример в котором по моему мнению интерфейс необходим, вот. Нужен теперь контрпример кода написанный без интерфейса в котором достигается тот же уровень абстракции
👀
мне надо это прочитать, или я могу дописать - важно, понимать - условия задачи, которые я изложил выше - я понял правильно?
👀
https://play.golang.org/p/jWiB3GY4IrI
👀
строчек получилось меньше, но еще один вариант ошибки обработал, которого не было в оригинальном коде, уже слишком бредово этого не сделать, но можно удалить - две строчки
👀
func main() { u1 := UnifiedContact{ Name: "Васян", Networks: []NetworkType{Telegram, SMS}, } u2 := UnifiedContact{ Name: "Джеки Чан", Networks: []NetworkType{SMS, WhatsApp}, } sender := &Sender{} sender.Send(u1, "Приветики u1") sender.Send(u2, "Приветики u2") sender.SendTo(u1,"just sms", SMS) sender.SendTo(u2,"just sms", SMS) sender.SendTo(u1,"just telegram", Telegram) sender.SendTo(u2,"just telegram", Telegram) }
👀
ну и "enum" для сетей - просто строки - это жесть жесточайшая)))
Alexander
https://github.com/gorgonia/agogo - смотрите, какие классные штуки пилят на Go:)
какое-то машинное обучение? тут как бы не получилось, что такая штука "написанная" на Питоне, используящая tensorflow не оказалось в несколько раз быстрее
👀
какое-то машинное обучение? тут как бы не получилось, что такая штука "написанная" на Питоне, используящая tensorflow не оказалось в несколько раз быстрее
там есть видео от автора, где он strangeloop рассказывает, как они размазали tensorflow и теперь их финансирует google)
👀
alpha go - штука, которая победила человека в Go
👀
поэтому он и переписал, как так игра Go, а ИИ, который ее победил - на python))
Alexander
))
Denis
https://play.golang.org/p/jWiB3GY4IrI
Этот код хуже расширяется и нарушает Open/Close Чем больше провайдеров у нас будет, тем страшнее будет выглядеть твой свитч, и тем сложнее будет ориентироваться в множестве функций отправки. Об этом кстати Фаулер писал https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html Давай представим что в нашем проекте требуется логика отправки картинок. Можешь пожалуйста добавить её в свой пример для каждого провайдера. Вызов в main должен выглядеть примерно так sender.SendTo(u2,"just telegram", Telegram) // сообщение в телегу sender.SendImage(u2, image{}, Telegram) //картинка в телегу image это просто пустая структура пусть будет
👀
Этот код хуже расширяется и нарушает Open/Close Чем больше провайдеров у нас будет, тем страшнее будет выглядеть твой свитч, и тем сложнее будет ориентироваться в множестве функций отправки. Об этом кстати Фаулер писал https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html Давай представим что в нашем проекте требуется логика отправки картинок. Можешь пожалуйста добавить её в свой пример для каждого провайдера. Вызов в main должен выглядеть примерно так sender.SendTo(u2,"just telegram", Telegram) // сообщение в телегу sender.SendImage(u2, image{}, Telegram) //картинка в телегу image это просто пустая структура пусть будет
расширяется он прекрасно, это станет очевидно, когда будет создаваться полноценное решение, в котором будет столько boilerplate на тему представления сетей и проч, что скорее всего даже switch не будет... будет что-то иное, м.б. visitor pattern, но пока messengers меньше 10 - так будет ок
👀
что касается, логики отправки картинок - следует определить тип для самого сообщения и логика такая же
👀
здесь не изменится просто ничего
👀
просто еще один леер вырастет про сообщение
👀
собственно, можно взять тип, который я писал еще вечером - где была поддержка различных медиа и клиентского парсинга сообщений
👀
чтобы гипертекст можно было передавать
Denis
просто еще один леер вырастет про сообщение
func telegramImage(u UnifiedContact, img image) { log.Printf("telegram image: %s, %s\n", u.Name, img.size) }
👀
в любом случае, задача была написать, чтобы работало так же
👀
сообщение должно быть единое
👀
картинка внутри или текст - это не важно
Denis
сообщение должно быть единое
Ну напиши как ты считаешь нужным, только не забывай что картинка это не текст
👀
рекомендую глянуть описание tdlib telegram - тип сообщения там сделан весьма недурно
Denis
А я после того как ты реализуешь, прочитаю твой код и добавлю тот же функционал в свой пример с интерфейсами и мы сможем сравнить
👀
если огромный код написанный ровно по этому принципу - это tdlib telegram, раз уж мы про сообщения - welcome
Denis
Просто в методе отправки картинки будет наверное какая-то логика еще по переводу этой картинки в какой-нибудь бинаркный фортат или base64 в зависимости от провайдера, может быть ватсап принимает base64, а телега в другом, но все это писать мы не будет, а нам достаточно будет просто log.Printf("telegram image: %s, %s\n", u.Name, img.size), то мы будем понимать что это как бы отправка картинка
Denis
type image struct { size string } картинку можно просто вот так сделать
👀
https://github.com/tdlib/td/blob/master/example/java/org/drinkless/tdlib/example/Example.java#L101 - вот читать отсюда)
👀
type image struct { size string } картинку можно просто вот так сделать
не надо так делать, потому, что потом надо будет расширять протокол, и это должно быть очень просто
👀
надо делать один тип-коверт, и в нем разворачивать логику
Denis
не надо так делать, потому, что потом надо будет расширять протокол, и это должно быть очень просто
Ладно, ты можешь в своем примере просто написать как считаешь нужным? Просто чтобы провайдеры стали поддерживать отправку картинок?
👀
я считаю, что достаточно заменить у msg тип string на тип приведенный мною выше
👀
а в случае с telegram оно еще и будет mapиться на их API просто один-в-один
Denis
я считаю, что достаточно заменить у msg тип string на тип приведенный мною выше
Ну напиши реализацию, я не совсем понимаю что ты имеешь ввиду
👀
type UnifiedMessage struct { Text string Media []*MediaFiles Entities []*Entities Author *UnifiedContact Receivers []*UnifiedContact } func (s* Sender) SendTo(u UnifiedContact, msg UnifiedMessage, targets... NetworkType) error {
👀
https://play.golang.org/p/owry8QuZQHu
Denis
https://play.golang.org/p/owry8QuZQHu
А где отправка картинки? log.Printf("telegram image: %s, %s\n", u.Name, img.size)? Представь что там разные эндпоинты апи, ну даже если у телеги один, то у ватсапа или смс провайдера будет другой
👀
это детали реализации конкретного messenger
👀
и к обсуждаемому вопросу вообще не имеет отношения
👀
и там в каждом будет своя какая-то история
👀
которая ну никак не связана с тем, что тут творится
👀
где-то так, где-т иначе, где-то еще каким-то способом
Denis
и к обсуждаемому вопросу вообще не имеет отношения
Имеет, я тебе покажу на примере, когда код для отправки картинок реализуешь
👀
могу дать доступ в приватный репозиторий с боевым внутрикорпоративным messenger, просто не готов для opensource - но по почте добавлю к в экспорт серверного проекта
👀
там правда отправка файлов и текстов, но сути это совершенно не меняет
👀
так или иначе, я все же хочу заметить, что задача Ваша решена, без interface, я понимаю, что это больно, но по-моему, уже было бы честно согласиться с этим:)
👀
ну хотя бы потому, что доказывать - обязанность утверждающего, Ваша милость говорить, что потом будут какие-то проблемы, весьма мутно описанные, и в качестве подтверждения просит меня написать что-то:)
👀
это как-то уже не по-братски)
👀
https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA_%D0%A0%D0%B0%D1%81%D1%81%D0%B5%D0%BB%D0%B0 - здесь подробнее почему именно так)
Denis
там правда отправка файлов и текстов, но сути это совершенно не меняет
Ладно, окей, представь что у каждого провайдера, есть метод отправки сообщения, а есть еще специальный метод для проверки не удалился ли пользователь из телеграма/ватсапа или что его номер обслуживается у оператора связи. И нам надо перед отправкой сообщения через провайдера проверить можно ли отправить ему сообщение. примерно так ``` func aaa() bool { log.Printf("check user exists in telegram: %s\n", u.Name) return true } ```
👀
я предлагаю так, если хочется посмотреть на реализации этого принципа: tdlib - telegram, ссылка выше мой проект - жду почту
Denis
https://play.golang.org/p/owry8QuZQHu
Я бы посмотрел, как изменится код, если кроме sendTo нужна будет ещё одна функция, какая-нибудь типа editMessage
Denis
там правда отправка файлов и текстов, но сути это совершенно не меняет
Пусть всегда возвращает true. Представим что проблем у нас нет. Но надо дописать код проверки такой.
👀
если очевидное-невероятное - то все же придется Вам написать контр-пример, и, конечно, я обязуюсь также серьезно подойти к ответу.
👀
достаточно отправлять не сообщение сообщение, а сообщение - NewMessage, Delete, Update, ... - опять же призываю глянуть на tdlib
Denis
так или иначе, я все же хочу заметить, что задача Ваша решена, без interface, я понимаю, что это больно, но по-моему, уже было бы честно согласиться с этим:)
Да, код работает также, я согласен, но мы сейчас как раз на той грани, где будет видна разница между кодом с интерфейсами или без, но для этого надо допилить логику отправки картинок (либо локигу с проверкой, что я в предыдущем сообщении отправил)
Denis
ну хотя бы потому, что доказывать - обязанность утверждающего, Ваша милость говорить, что потом будут какие-то проблемы, весьма мутно описанные, и в качестве подтверждения просит меня написать что-то:)
Я не прошу тебя написать в качестве подтверждения, я хочу просто чтобы у меня был пример, на основе которого я тебе смогу показать(и ты сможешь сам посмотреть), в каком случае интерфейс тебе поможет организовать код
👀
дал ссылку на один пример и предложил показать другой
👀
интерфейс уже около 10 лет не помогает мне организовать код, так что - если преследуется благая цель научить меня ООП, то я бы воздержался, выкинуть из головы эту шляпу было непросто, но совершенно необходимо, чтобы разрабатывать большие и сложные системы
👀
и на это я тоже ответил, мои сообщения не проходят?)
Denis
вот же)
Ладно, можно тогда вот логику с проверкой возможности доставки от провайдера? https://t.me/golangl/13637 ну вот это И в плейграунде
Denis
это тоже легко -
Вопрос был именно к этому коду