👀
и код бизнес-логики получится простой как три копейки
👀
а ради этого все и делается, чтобы бизнес-логика была простой
👀
потому, что именно она представляет собой ценность, а не кишки технического обеспечения, которое все одинаковое
👀
разработчики кишечных библиотек часто этим грешат, но это и понятно - техническое обеспечение это и есть их бизнес-логика
👀
но этим они портят прикладной код и умы тех кто изучает их творения
Denis
Это ты о моем коде или о коде другого собеседника?
👀
это он о моем
👀
Contacts map[ContactPriority][]*NetworkContact - вот это вынесло
👀
но человек же не читал после чего это появилось, а код сложный, как тут не выступить в защиту ООП, надо понять и принять 😂
Denis
но человек же не читал после чего это появилось, а код сложный, как тут не выступить в защиту ООП, надо понять и принять 😂
Я думаю он читал, мапа действительно усложнение. Ты добавил в системе знаний не только о конкретных провайдерах, а также и о приоритетах доставки и возможно этой доставки Contacts map
👀
да, но это очень удобно, просто неоценимо а для edge case который Вы описали - одна простая функция, тоже выше, скорее всего в коде отправки даже заглядывать туда не придется даже в этом edge case
👀
а в логах как удобно будет смотреть почему пользователю такому-то сообщение не пришло - просто ппц, прямо залоггировать целиком и рассматривать, что там было, как прошел вызов и т.д.
👀
и все из коробки, и без лишнего кода
👀
но самое главное все же прямо в документации по языку: Interfaces can be composed together. The composition is one of the most important concepts in software development. When multiple interfaces are implemented then the type has performed composition. This is really helpful where polymorphism is needed. я же говорил, что мое пояснение явно хуже, они вот как кратко все сказали
👀
Uses of an interface Interfaces are used in Go where polymorphism is needed. In a function where multiple types can be passed an interface can be used. Interfaces allow Go to have polymorphism. Interfaces are a great feature in Go and should be used wisely.
Denis
Uses of an interface Interfaces are used in Go where polymorphism is needed. In a function where multiple types can be passed an interface can be used. Interfaces allow Go to have polymorphism. Interfaces are a great feature in Go and should be used wisely.
Да, это именно то о чем я писал выше, в кейсе с отправкой сообщений как раз и нужен полиморфизм. Чтобы работать с разными провайдерами сообщений как с простой сущностью SendProvider
👀
ну я же сдался сразу, как Вы сказали, что сообщения имеют принципиально различную структуру, которая не может и не должна быть сведена к одному типу...
👀
и просто хочется отправлять разные типы данных в разные по природе функции)
Denis
и просто хочется отправлять разные типы данных в разные по природе функции)
В моем кейсе я описывал отправку похожих сообщений (например уведомлений) через разные провайдеры, не логично ли в таком случае все свести к одному интерфейсу?
👀
будем писать тогда так: if user.HasTelegramAccount { msg, err := tgsender.NewTelegramMessage(....) _, err := telegramMessageSender.Send(msg) } else if ...
👀
что поделаешь))
👀
во всех 100 местах, где надо сообщение отправить
👀
не знаю.. я предлагал, вообще просто unified_notifications.Send(...)
👀
Откуда взялся NewTelegramMessage?
Вы сказали, что типы разные и не могут быть сведены - выше в переписке
Denis
Вы сказали, что типы разные и не могут быть сведены - выше в переписке
Давай я напишу код с интерфейсами на плейграунде, а ты перепишешь его без интерфейсов и мы сравним че получится?
👀
ну можно, конечно, но я вроде бы уже все написал прямо тут в чате, не думаю, что еще какие-то внешние объявления нужны для этого случая, может пара функций
Denis
ну можно, конечно, но я вроде бы уже все написал прямо тут в чате, не думаю, что еще какие-то внешние объявления нужны для этого случая, может пара функций
Да, ты писал, то там в итоге упускаются важные нюансы, я их вижу, но писать долго, потому мы можем рассмотреть просто конкретный пример программы
👀
говорите загадками, мой друг!)
👀
но я понимаю, что спать пора)
Denis
но я понимаю, что спать пора)
Ну с утра посмотришь, у меня просто уже утро
👀
Ну с утра посмотришь, у меня просто уже утро
будет интересно, спасибо! 🙏 Я даже не думал, что в этом чате могут быть настолько конструктивные люди)
👀
https://github.com/gorgonia/agogo - смотрите, какие классные штуки пилят на Go:)
🅞leksiy
Denis
Использовать структуру? В чем вопрос?
У нас там выше дискуссия про целесообразность интрефейсов, это к ней.
🅞leksiy
У нас там выше дискуссия про целесообразность интрефейсов, это к ней.
Целесообразно использовать интерфейс, для того, чтобы передавать в функцию объект независимо от реализации, который удовлетворяет по методам. В данном случае вообще не вижу смысла
🅞leksiy
То есть, было бы у тебя множество объектов, типа Telegram, SMS и тд
🅞leksiy
У каждого из них метод Send
🅞leksiy
Переписать сложно, тк с телефона выходные, но смысл должен быть понятен
Denis
У каждого из них метод Send
Мы уже решили, что без примера кода, нам не понятно, потому сорян, нужен пример кода
Denis
Переписать сложно, тк с телефона выходные, но смысл должен быть понятен
Я потому и написал пример кода, в котором есть интерфейс, от которого как бы надо избавиться, вот
🅞leksiy
Я потому и написал пример кода, в котором есть интерфейс, от которого как бы надо избавиться, вот
В этом случае вместо интерфейса может быть структура с этими же полями и методом, так-что да, смысла нет
🅞leksiy
Denis
Ну ок, тогда жди код)
Окей, это не к спеху
Denis
будет интересно, спасибо! 🙏 Я даже не думал, что в этом чате могут быть настолько конструктивные люди)
https://play.golang.org/p/4ILp0ZvIoQ1 Вот тот же пример, но я в нем допилил проверку на то что пользователь зареган в соц сети и туда можно отправлять сообщения.
👀
с 26 по 29
👀
и то, что в 32-й строке - лучше делать "enum"
👀
прямо целыми числами
Denis
и то, что в 32-й строке - лучше делать "enum"
Не не не, пиши код на плейграунде=)
👀
Не не не, пиши код на плейграунде=)
а... понял, не смотрю, сорри.
👀
u1 := User{"Васян", []string{"sms", "telegram"}}
👀
не могу удержаться)))
👀
это выше моих сил
👀
вот если не делать строчками, а сделать enum - программист, который пользуется не должен будет строки тут пихать
👀
это же дичь
Denis
а... понял, не смотрю, сорри.
Я просто хочу увидеть код на плейграунде, если тебе не нравятся строки и т.п. можешь тоже переписать как тебе хочется, самое главное чтобы interface ты убрал
👀
пусть лучше константа будет - никаких опечаток никогда
Denis
пусть лучше константа будет - никаких опечаток никогда
Да, да, это понятно, просто в конкретном примере мы говорим об интерфейсе, потому я не стал писать константы и т.п.
👀
Да, да, это понятно, просто в конкретном примере мы говорим об интерфейсе, потому я не стал писать константы и т.п.
мне кажется это раскладывается в качестве отвлекающего маневра, чтобы я залипал на это все и не смог добраться до сути))
👀
но это - против правил, обсуждали тут красоту кода, давайте уже идти по этому пути до конца.
👀
иначе как сравнить потом?
👀
и я не знал, что уже можно писать, кстати.
👀
было сказано - утром.
Denis
но это - против правил, обсуждали тут красоту кода, давайте уже идти по этому пути до конца.
Ладно, твоя главная задача написать код с таким же поведением, но без type SendProvider interface { Можешь вообще хоть с ноля написать(с константами, енумами и т.п.), я все равно прочитаю.
Denis
было сказано - утром.
Как тебе удобно, у меня просто уже 11:37, я из Владивостока
👀
какой именно?
👀
type UnifiedMessage struct { Text string Media []*MediaFiles Entities []*Entities Author *UnifiedContact Receivers []*UnifiedContact } type ContactPriority uint8 type UnifiedContact struct { OurDbId uint64 Contacts map[ContactPriority][]*NetworkContact } type NetworkContact struct { Network NetworkType NetworkContactId uint64 } func Send(msg *UnifiedMessage)
Denis
Что какой именно?
👀
CanSend к этому дописать?)
👀
или чтобы это вот стало проще:
👀
func main() { // Представим что получили пользователей из БД u1 := User{"Васян", []string{"sms", "telegram"}} u2 := User{"Джеки Чан", []string{"sms", "whatsapp"}} sender := Sender{} fmt.Println("Посылаем пользователю u1, u2 сообщение во все доступные соц сети") sender.SendTo(u1, u1.nets, "Приветики u1") sender.SendTo(u2, u2.nets, "Приветики u2") fmt.Println("\nПосылаем пользователю u1, u2 только смс") sender.SendTo(u1, []string{"sms"}, "Привет u1 только смс") sender.SendTo(u2, []string{"sms"}, "Привет u2 только смс") fmt.Println("\nПосылаем пользователю u1, u2 только telegram ВНИМАНИЕ у u2 нету telegram") sender.SendTo(u1, []string{"telegram"}, "Привет u1 только смс") sender.SendTo(u2, []string{"telegram"}, "Привет u2 только смс") }
👀
?
Denis
CanSend к этому дописать?)
https://play.golang.org/p/4ILp0ZvIoQ1 Нет, перепиши код на плейграунде, чтобы результат его работы был такой же как Но при этом не используй interface