👀
и код бизнес-логики получится простой как три копейки
👀
а ради этого все и делается, чтобы бизнес-логика была простой
👀
потому, что именно она представляет собой ценность, а не кишки технического обеспечения, которое все одинаковое
👀
разработчики кишечных библиотек часто этим грешат, но это и понятно - техническое обеспечение это и есть их бизнес-логика
👀
но этим они портят прикладной код и умы тех кто изучает их творения
Denis
Это ты о моем коде или о коде другого собеседника?
👀
это он о моем
👀
Contacts map[ContactPriority][]*NetworkContact - вот это вынесло
👀
но человек же не читал после чего это появилось, а код сложный, как тут не выступить в защиту ООП, надо понять и принять 😂
👀
да, но это очень удобно, просто неоценимо
а для 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
👀
ну я же сдался сразу, как Вы сказали, что сообщения имеют принципиально различную структуру, которая не может и не должна быть сведена к одному типу...
👀
и просто хочется отправлять разные типы данных в разные по природе функции)
👀
будем писать тогда так:
if user.HasTelegramAccount {
msg, err := tgsender.NewTelegramMessage(....)
_, err := telegramMessageSender.Send(msg)
} else if ...
👀
что поделаешь))
👀
во всех 100 местах, где надо сообщение отправить
Denis
Denis
👀
не знаю.. я предлагал, вообще просто unified_notifications.Send(...)
👀
👀
ну можно, конечно, но я вроде бы уже все написал прямо тут в чате, не думаю, что еще какие-то внешние объявления нужны для этого случая, может пара функций
Denis
ну можно, конечно, но я вроде бы уже все написал прямо тут в чате, не думаю, что еще какие-то внешние объявления нужны для этого случая, может пара функций
Да, ты писал, то там в итоге упускаются важные нюансы, я их вижу, но писать долго, потому мы можем рассмотреть просто конкретный пример программы
👀
говорите загадками, мой друг!)
👀
но я понимаю, что спать пора)
👀
https://github.com/gorgonia/agogo - смотрите, какие классные штуки пилят на Go:)
Denis
🅞leksiy
Denis
🅞leksiy
То есть, было бы у тебя множество объектов, типа Telegram, SMS и тд
🅞leksiy
У каждого из них метод Send
🅞leksiy
Переписать сложно, тк с телефона выходные, но смысл должен быть понятен
🅞leksiy
Denis
🅞leksiy
👀
👀
с 26 по 29
👀
и то, что в 32-й строке - лучше делать "enum"
👀
прямо целыми числами
Denis
👀
👀
u1 := User{"Васян", []string{"sms", "telegram"}}
👀
не могу удержаться)))
👀
это выше моих сил
👀
вот если не делать строчками, а сделать enum - программист, который пользуется не должен будет строки тут пихать
👀
это же дичь
Denis
а... понял, не смотрю, сорри.
Я просто хочу увидеть код на плейграунде, если тебе не нравятся строки и т.п. можешь тоже переписать как тебе хочется, самое главное чтобы interface ты убрал
👀
пусть лучше константа будет - никаких опечаток никогда
👀
но это - против правил, обсуждали тут красоту кода, давайте уже идти по этому пути до конца.
👀
иначе как сравнить потом?
👀
и я не знал, что уже можно писать, кстати.
👀
было сказано - утром.
👀
какой именно?
👀
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