Продолжаю серию статей об основных терминах в распределенных системах, которые стоит знать и понимать Senior разработчику. Часть 1 👉 тут.
Поехали!
Первое определение, которое интуитивно понятно, но нужно нам для понимания "тривиальных" вещей:
Согласованность данных (консистентность данных, англ. data consistency) — согласованность данных друг с другом, целостность данных, а также внутренняя непротиворечивость.
Отсюда нам важно два пункта: согласованные данные - целостны и непротиворечивы.
Теперь дадим определение модели согласованности:
Модель согласованности — подход, используемый в той или иной распределённой системе (пример: распределённой общей памяти, СУБД, файловой системе, микросервисы, ...) для обеспечения гарантий согласованности данных.
Поэтому модель согласованности актуальна на аппаратном уровне, на программном уровне и на архитектурном уровне.
Основные модели согласованности:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3❤🔥1
СТРОГАЯ СОГЛАСОВАННОСТЬ
Моделью строгой согласованности, называется модель удовлетворяющая условию:
Операция чтения переменной X должна возвращать значение, записанное самой последней операцией записи переменной X,
Все однопроцессорные системы обеспечивают строгую согласованность, но в распределенных многопроцессорных системах ситуация намного сложнее…
Предположим, что переменная
Однако, если между разница между
Строгая консистентность представляет собой идеальную модель для программирования, но ее, к сожалению программистов, невозможно реализовать для распределенных систем...
——————
Ставьте🔥 если хотите узнать подробнее про остальные модели согласованности данных, 🗿 — новая тема.
Моделью строгой согласованности, называется модель удовлетворяющая условию:
Операция чтения переменной X должна возвращать значение, записанное самой последней операцией записи переменной X,
Все однопроцессорные системы обеспечивают строгую согласованность, но в распределенных многопроцессорных системах ситуация намного сложнее…
Предположим, что переменная
Х = 1 расположена в памяти/ на диске нашей базы данных (БД), и процесс, который выполняется в нашем сервисе Р1, пытается прочитать значение этой переменной в момент времени T1. Для этого сервис посылается запрос чтения переменной X. Немного позже, в момент времени T2 > T1, другой процесс P2, производит операцию записи нового значения в переменную X = 2. Для обеспечения строгой консистентности операция чтения должна возвратить в процесс P1 старое значение переменной (X = 1) вне зависимости от того, где расположен наш сервис (P1) и насколько близки между собой два момента времени T1 и T2. Однако, если между разница между
T1 и T2 мала, и по каким-то причинам процесс P2 смог быстрее выполнить операцию (за счет меньших сетевых издержек, или P2 этот локальный процесс в БД), P1 получит результат X = 2. Строгая консистентность представляет собой идеальную модель для программирования, но ее, к сожалению программистов, невозможно реализовать для распределенных систем...
——————
Ставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤2👍1👏1🙏1
Forwarded from Ozon Tech
Ozon Tech Community Go Meetup 🧑💻
31 июля | 18:30 мск | офлайн + онлайн
📍Москва, Нижняя Сыромятническая 11, к1, 3 этаж
Собираемся в новой локации — в уютном лофте. Комфортно нетворкать, играть и, конечно, слушать полезное.
Ускорим автобиддеры, минимизируем ошибки в бизнес-логике и подискутируем о надёжности микросервисов — будет интересно, присоединяйтесь!
Подробнее о докладах:
➡️ «Кэш на кэш: как ускоряли автобиддеры»
— поговорим о подходах к выбору In-memory кэша, сравним технические реализации в Go-библиотеках In-memory кэширования, поделимся опытом эксплуатации кэшей в наших сервисах.
➡️ «Снижение ошибок в бизнес-логике»
— разберёмся в видах и источниках ошибок, обсудим, какое влияние они оказывают на наши системы и пользователей. А потом поговорим про инструменты Go, которые повышают надёжность релизов.
➡️ А ещё готовим для вас панельную дискуссию с приглашёнными экспертами по теме обеспечения стабильности микросервисов.
Регистрируйтесь на офлайн или онлайн на нашем сайте.
#ozontech_meetup #golang
31 июля | 18:30 мск | офлайн + онлайн
📍Москва, Нижняя Сыромятническая 11, к1, 3 этаж
Собираемся в новой локации — в уютном лофте. Комфортно нетворкать, играть и, конечно, слушать полезное.
Ускорим автобиддеры, минимизируем ошибки в бизнес-логике и подискутируем о надёжности микросервисов — будет интересно, присоединяйтесь!
Подробнее о докладах:
➡️ «Кэш на кэш: как ускоряли автобиддеры»
— поговорим о подходах к выбору In-memory кэша, сравним технические реализации в Go-библиотеках In-memory кэширования, поделимся опытом эксплуатации кэшей в наших сервисах.
➡️ «Снижение ошибок в бизнес-логике»
— разберёмся в видах и источниках ошибок, обсудим, какое влияние они оказывают на наши системы и пользователей. А потом поговорим про инструменты Go, которые повышают надёжность релизов.
➡️ А ещё готовим для вас панельную дискуссию с приглашёнными экспертами по теме обеспечения стабильности микросервисов.
Регистрируйтесь на офлайн или онлайн на нашем сайте.
#ozontech_meetup #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6❤5👏2
Уже завтра состоится конференция Ural Digital Weekend! До встречи в Перми!
👍5❤🔥3⚡2🔥2❤1😱1
Forwarded from Ozon Tech
Какие люди на Ural Digital Weekend!
Ждите их на докладах, ловите в кулуарах, наслаждайтесь общением.
↪ Как создавать идеальные фичи и избегать багов, объединяя тестировщиков и разработчиков.
Олег Пендрак, техлид SDET, поделится нюансами синхронизации коллег, инструментами для совместной работы и процессом создания культуры безопасности.
↪ gRPC-стримы на практике: к чему готовиться и где применять.
Сергей Антоничев, ведущий разработчик информационных систем, расскажет, как работают gRPC-стримы, когда запросы нужны асинхронно, много и постоянно.
↪ 50 оттенков кэширования: от in memory к многоуровневому Redis-кластеру.
Леонид Ченский, руководитель группы разработки, покажет, как адаптировали архитектуру к кратному росту нагрузки год от года.
А ещё весь день на связи Виктор Корейша, руководитель направления Managed Services. Витя будет модерировать секцию «Разработка».
Подключайтесь онлайн тут, если вы не там📱
Ждите их на докладах, ловите в кулуарах, наслаждайтесь общением.
Олег Пендрак, техлид SDET, поделится нюансами синхронизации коллег, инструментами для совместной работы и процессом создания культуры безопасности.
Сергей Антоничев, ведущий разработчик информационных систем, расскажет, как работают gRPC-стримы, когда запросы нужны асинхронно, много и постоянно.
Леонид Ченский, руководитель группы разработки, покажет, как адаптировали архитектуру к кратному росту нагрузки год от года.
А ещё весь день на связи Виктор Корейша, руководитель направления Managed Services. Витя будет модерировать секцию «Разработка».
Подключайтесь онлайн тут, если вы не там
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥5😱2⚡1❤🔥1
На днях вышел подкаст со мной от «Разрабы.Подкаст» ▶️
На подкасте обсуждали зачем нужна платформа в BigTech компаниях, чем занимаются разработчики в платформенных командах и конечно много жизненных историй из IT!
Приятного просмотра❤️
На подкасте обсуждали зачем нужна платформа в BigTech компаниях, чем занимаются разработчики в платформенных командах и конечно много жизненных историй из IT!
Приятного просмотра
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Как настраивать БД под НЕСМЕТНЫЕ УЙМЫ данных – Леонид Ченский – Ozon Tech
Сайт Ozon Tech – https://ozon.tech
Хабр Ozon Tech – https://habr.com/ru/companies/ozontech/profile/
Telegram Ozon Tech – https://news.1rj.ru/str/ozon_tech
YouTube – https://www.youtube.com/channel/UCCqNFXg3NRbRA6qNKFRecdw
Telegram-канал Леонида – https://news.1rj.ru/str/leoscode…
Хабр Ozon Tech – https://habr.com/ru/companies/ozontech/profile/
Telegram Ozon Tech – https://news.1rj.ru/str/ozon_tech
YouTube – https://www.youtube.com/channel/UCCqNFXg3NRbRA6qNKFRecdw
Telegram-канал Леонида – https://news.1rj.ru/str/leoscode…
👍7❤4🔥3❤🔥1
Вносить правки в презентацию за пару часов до выступления - это база 😅
Для тех, кто не сможет сегодня присутствовать очно на конференции Ural Digital Weekend в Перми, делюсь ссылкой на трансляцию📺
Для тех, кто не сможет сегодня присутствовать очно на конференции Ural Digital Weekend в Перми, делюсь ссылкой на трансляцию
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9😁4❤1🗿1🆒1
Где-то в закладках уже давно лежит полезная и до сих пор актуальная статья о способах реализации пагинации в Postgres.
Обязательно к прочтению backend-разработчикам)
#postgres
Обязательно к прочтению backend-разработчикам)
#postgres
Хабр
Пять способов пагинации в Postgres, от базовых до диковинных
Вас может удивить тот факт, что пагинация, распространенная, как таковая, в веб приложениях, с легкостью может быть реализована нерационально. В этой статье мы испробуем различные способы пагинации на...
👍5❤3🔥2🙏1🤝1
Media is too big
VIEW IN TELEGRAM
Для тех, кто не смог посмотреть мой доклад на конференции Ural Digital Weekend и у кого YouTube не хочет работать
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9 3❤2🎉2 1 1
ЧТО МЕНЯ УДИВИЛО, КОГДА Я СТАЛ TEAMLEAD-ом?
Когда я стал Teamlead-ом, меня отправили на внутреннее обучение, где учили таких же как и я «зеленых» лидов, быть настоящими руководителями. Много инсайдов узнал я на том обучении. Был очень классный оффлайн формат, отличный преподаватель и вообще тот курс я вспоминаю с ностальгией🥲
Один из инсайдов, который я узнал: есть простая модель DISC, согласно которой человека, в зависимости от его поведенческого стиля, можно отнести к одной из 4-х групп:
D (Доминирующий)
I (Влиятельный)
S (Устойчивый)
C (Добросовестный)
На самом деле у человека редко бывает четко выражен только один стиль поведения. Чаще всего это пара, где преобладает больше 1 (например C и D стили, это не тоже самое что и D и С)
И какого было мое удивление, что при формировании команды, распределению задач и прочих менеджерских ситуаций стоит учитывать, какой тип поведения свойственнее человеку.
При погружении в эту модель, со временем можно быстро понять по общению с человеком, какой стиль у него преобладает. Оставлю тут тест, если будет желание пройти и узнать, кто вы по DISC. Пишите в комментариях, что у вас вышло!
Когда я стал Teamlead-ом, меня отправили на внутреннее обучение, где учили таких же как и я «зеленых» лидов, быть настоящими руководителями. Много инсайдов узнал я на том обучении. Был очень классный оффлайн формат, отличный преподаватель и вообще тот курс я вспоминаю с ностальгией
Один из инсайдов, который я узнал: есть простая модель DISC, согласно которой человека, в зависимости от его поведенческого стиля, можно отнести к одной из 4-х групп:
D (Доминирующий)
I (Влиятельный)
S (Устойчивый)
C (Добросовестный)
На самом деле у человека редко бывает четко выражен только один стиль поведения. Чаще всего это пара, где преобладает больше 1 (например C и D стили, это не тоже самое что и D и С)
И какого было мое удивление, что при формировании команды, распределению задач и прочих менеджерских ситуаций стоит учитывать, какой тип поведения свойственнее человеку.
При погружении в эту модель, со временем можно быстро понять по общению с человеком, какой стиль у него преобладает. Оставлю тут тест, если будет желание пройти и узнать, кто вы по DISC. Пишите в комментариях, что у вас вышло!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1👀1🆒1
СОВЕТ ДЛЯ УСПЕШНОГО ПРОХОЖДЕНИЯ СЕКЦИИ SYSTEM DESIGN НА СОБЕСЕДОВАНИИ
Одна из моих любимых секций в собеседовании разработчиков - System Design. Что мне в ней нравится? Тут нет правильного ответа, который можно заучить. Тут важно именно рассуждения кандидата, его опыт, знания технологий, то как он подходит к задаче.
Ошибка большинства разработчиков при выборе технологий/СУБД: взять что-то универсальное или только то, с чем работал на работе.
Пример: проектируется социальная сеть aka VK/Facebook. Нужно выбрать БД для сообщений, пользователей, друзей. Большинство разработчиков выбирают для этой задачи Postgres/MySQL объясняя это тем, что данные хорошо ложатся в реляционную модель. Действительно, фишка Postgres/MySQL в том, что это СУБД универсальные, позволяющие решать многие задачи (но не всегда эффективно).
В 2024 году важно не то, как данные можно представить, а то как вы их используете! Т.е. необходимо отталкиваться от кейсов использования данных, от нагрузок и т д. Пример: какой смысл использовать реляционную БД для хранения чатов и сообщений, если 99% процентов запросов будут по первичному ключу чата? Для этого больше подойдут NoSQL решения (KV/WideColumn/Column).
К тому же очень важно понимать как та или иная технология может масштабироваться. Это очень важно при проектировании системы. Лучше выбрать 1 раз хорошую технологию и горизонтально ее масштабировать, чем каждый раз внедрять костыли и переходить с одной технологии на другую.
Оставил шпаргалку с СУБД и их классификацией:)
Всем хороших выходных!
Одна из моих любимых секций в собеседовании разработчиков - System Design. Что мне в ней нравится? Тут нет правильного ответа, который можно заучить. Тут важно именно рассуждения кандидата, его опыт, знания технологий, то как он подходит к задаче.
Ошибка большинства разработчиков при выборе технологий/СУБД: взять что-то универсальное или только то, с чем работал на работе.
Пример: проектируется социальная сеть aka VK/Facebook. Нужно выбрать БД для сообщений, пользователей, друзей. Большинство разработчиков выбирают для этой задачи Postgres/MySQL объясняя это тем, что данные хорошо ложатся в реляционную модель. Действительно, фишка Postgres/MySQL в том, что это СУБД универсальные, позволяющие решать многие задачи (но не всегда эффективно).
В 2024 году важно не то, как данные можно представить, а то как вы их используете! Т.е. необходимо отталкиваться от кейсов использования данных, от нагрузок и т д. Пример: какой смысл использовать реляционную БД для хранения чатов и сообщений, если 99% процентов запросов будут по первичному ключу чата? Для этого больше подойдут NoSQL решения (KV/WideColumn/Column).
К тому же очень важно понимать как та или иная технология может масштабироваться. Это очень важно при проектировании системы. Лучше выбрать 1 раз хорошую технологию и горизонтально ее масштабировать, чем каждый раз внедрять костыли и переходить с одной технологии на другую.
Оставил шпаргалку с СУБД и их классификацией:)
Всем хороших выходных!
👍9❤4🔥2❤🔥1🙏1
РАЗБИРАЕМСЯ С ИТЕРАЦИЯМИ ПО СЛАЙСАМ В GO
В Go есть всеми знакомая конструкция для итерации по всем элементам слайса/массива:
И индекс, и значение мы можем опускать если не используем, с помощью
Рассмотрим пример:
Данный код выведет нам в консоль
Обратный пример:
Здесь уже программа нам выведет
Ага, значит если нам надо менять содержимое элементов слайса, то тогда нужно использовать итерацию по индексу, а в остальных случаях по значению? - Не совсем так.
Допустим у нас элементы слайса не
Попробуем проитерироваться по слайсу больших структур по индексу и по значению, сравнив оба подхода в бенчмарке:
Результат бенчмарка будет следующий:
Тут мы видим, что в данном случае итерация по индексу в РАЗЫ быстрее. Почему? Потому что Go при итерации по значению вынужден при каждой итерации копировать большую структуру в переменную. Чем больше объект, тем больше стоит его копирование. Если посмотреть такой код в профилировщике, то вы увидите, что работает
А если у нас слайс указателей?
Тогда при итерации по значению будет происходить только копирование указателя, что довольно дешево. В этом случае особой разницы в итерации по индексу или по значению нет.
В итоге для себя я сформировал следующие правила:
1. Если у нас слайс указателей - итерируюсь всегда по значению (если только нам не нужно проинициализировать пустой указатель).
2. Если у нас слайс структур - итерируюсь всегда по индексу (ни к чему нам лишние копирования).
3. Если у нас слайс чисел: нужно менять элементы - индекс, не нужно - значение.
Надеюсь эти правила помогут вам с code review 😉
#golang
В Go есть всеми знакомая конструкция для итерации по всем элементам слайса/массива:
for i, v := range slice {
// ...
}
i - текущий индекс элементаv - копия текущего элемента слайса (slice[i])И индекс, и значение мы можем опускать если не используем, с помощью
_. Но зачем разработчики языка Go дали нам 2 разные возможности итерации по слайсам? И какой способ в итоге лучше использовать?Рассмотрим пример:
s := []int{1, 2, 3}
for _, v := range s {
v++
}
fmt.Println(s)
Данный код выведет нам в консоль
[1, 2, 3]. Почему так? В переменную v кладется копия элемента слайса и v никак не ссылается на элемент. В итоге изменение переменной v не приводит к изменению элементов слайса.Обратный пример:
s := []int{1, 2, 3}
for i := range s {
s[i]++
}
fmt.Println(s)
Здесь уже программа нам выведет
[2, 3, 4], поскольку конструкция s[i] получается неявной ссылкой на элемент слайса и тут уже нет никакого копирования, мы применяем оператор инкремента (++) непосредственно к самому элементу.Ага, значит если нам надо менять содержимое элементов слайса, то тогда нужно использовать итерацию по индексу, а в остальных случаях по значению? - Не совсем так.
Допустим у нас элементы слайса не
int, а большая структура:type BigStruct struct { // size=1032 bytes
_ [1024]byte
Field int64
}
Попробуем проитерироваться по слайсу больших структур по индексу и по значению, сравнив оба подхода в бенчмарке:
func Benchmark(b *testing.B) {
const elems = 1000
s := make([]BigStruct, elems)
tmps := make([]int64, elems) // need to avoid compiler optimizations for loops
b.ResetTimer()
b.Run("iterate slice of structs by index", func(b *testing.B) {
for i := 0; i < b.N; i++ {
for idx := range s {
tmps[idx] += s[idx].Field
}
}
})
b.Run("iterate slice of structs by value", func(b *testing.B) {
for i := 0; i < b.N; i++ {
for idx, v := range s {
tmps[idx] += v.Field
}
}
})
}
Результат бенчмарка будет следующий:
Benchmark/iterate_slice_of_structs_by_index-10 1626810 735.2 ns/op 0 B/op 0 allocs/op
Benchmark/iterate_slice_of_structs_by_value-10 60226 19841 ns/op 0 B/op 0 allocs/op
Тут мы видим, что в данном случае итерация по индексу в РАЗЫ быстрее. Почему? Потому что Go при итерации по значению вынужден при каждой итерации копировать большую структуру в переменную. Чем больше объект, тем больше стоит его копирование. Если посмотреть такой код в профилировщике, то вы увидите, что работает
runtime.duffcopy. Если такое встретится у вас, смело переходите на итерацию по индексу.А если у нас слайс указателей?
s := make([]*BigStruct, elems)
Тогда при итерации по значению будет происходить только копирование указателя, что довольно дешево. В этом случае особой разницы в итерации по индексу или по значению нет.
В итоге для себя я сформировал следующие правила:
1. Если у нас слайс указателей - итерируюсь всегда по значению (если только нам не нужно проинициализировать пустой указатель).
2. Если у нас слайс структур - итерируюсь всегда по индексу (ни к чему нам лишние копирования).
3. Если у нас слайс чисел: нужно менять элементы - индекс, не нужно - значение.
Надеюсь эти правила помогут вам с code review 😉
#golang
🔥11❤7👍2❤🔥1👏1 1
Ozon Tech Community TeamLead Meetup
21 августа | 18:30 мск | офлайн и трансляция
Такое событие в календаре — первый тимлидский митап в Ozon! Прокачай софты в компании экспертов Ozon комьюнити и других бигтехов.
В программе: два доклада, панельная дискуссия, угощения и время для неформального нетворкинга.
📌 Доклад 1: «Как окунуться в новую предметную область и не утонуть»
Юлия Лукина, старший менеджер проектов, поможет сориентироваться на новом месте — погрузиться в неизведанную область и справиться с синдромом самозванца.
📌 Доклад 2: «(Хороший_инженер) != (Хороший_тимлид)»
Иван Миронов, руководитель отдела разработки, объяснит, на какие характеристики будущих руководителей нужно опираться при найме.
🗯 Дискуссия: «Быть или не быть: тимлид или эксперт?»
Обсудим горизонтальное и вертикальное развитие, метрики эффективности и подходы к принятию технологических вызовов.
Если вкратце, научимся принимать верные решения. Попрактикуйте прямо сейчас, чтобы успеть занять место офлайн или получить ссылку на трансляцию.
21 августа | 18:30 мск | офлайн и трансляция
Такое событие в календаре — первый тимлидский митап в Ozon! Прокачай софты в компании экспертов Ozon комьюнити и других бигтехов.
В программе: два доклада, панельная дискуссия, угощения и время для неформального нетворкинга.
📌 Доклад 1: «Как окунуться в новую предметную область и не утонуть»
Юлия Лукина, старший менеджер проектов, поможет сориентироваться на новом месте — погрузиться в неизведанную область и справиться с синдромом самозванца.
📌 Доклад 2: «(Хороший_инженер) != (Хороший_тимлид)»
Иван Миронов, руководитель отдела разработки, объяснит, на какие характеристики будущих руководителей нужно опираться при найме.
🗯 Дискуссия: «Быть или не быть: тимлид или эксперт?»
Обсудим горизонтальное и вертикальное развитие, метрики эффективности и подходы к принятию технологических вызовов.
Если вкратце, научимся принимать верные решения. Попрактикуйте прямо сейчас, чтобы успеть занять место офлайн или получить ссылку на трансляцию.
❤5👍2🔥2
Приветствую, гоферы! Хочу поделиться с вами шаблонами, которые я часто использую в своих проектах. Они помогают мне писать более структурированный, поддерживаемый и читабельный код.
1. Функциональные возможности (Functional Options)
Этот шаблон позволяет удобно настраивать параметры структуры или функции с помощью опциональных аргументов. Особенно полезно при создании конструкций с большим количеством настроек (например соединение с БД, брокером и т.д.)
Пример:
// Непубличная конфигурируемая структура опций.
type connectionOptions struct {
maxPoolSize int
readTimeout time.Duration
// ...
}
// Опции как функции
//
// Из-за того, что connectionOptions - не экспортируемая структура, потребители не смогут реализовать данный тип.
type Option func(*connectionOptions)
// Реализация функциональных возможностей
func WithMaxPoolSize(s int) Option {
return func(o *connectionOptions) {
o.maxPoolSize = s
}
}
// Реализация функциональных возможностей
func WithReadTimeout(d time.Duration) Option {
return func(o *connectionOptions) {
o.readTimeout = d
}
}
// Функция инициализации
func NewConnection(address string, opts ...Option) *Connection {
cfg := &connectionOptions {
readTimeout: 60 * time.Second, // значения по-умолчанию
maxPoolSize: 10, // значения по-умолчанию
}
// Тут изящно применяются все наши опции
for _, opt := range opts {
opt(cfg)
}
return &Connection{
address: address,
config: cfg,
}
}
func main() {
conn := NewConnection("127.0.0.1:5432",
WithMaxPoolSize(20),
WithReadTimeout(5*time.Second),
)
// ...
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4❤2👀1
2. Билдеры (Builder Pattern)
Билдеры позволяют создать сложные объекты пошагово, обеспечивая читаемость и облегчая управление объектами с множеством параметров.
Билдеры позволяют создать сложные объекты пошагово, обеспечивая читаемость и облегчая управление объектами с множеством параметров.
type House struct {
floors int
color string
garage bool
}
type HouseBuilder struct {
house *House
}
func NewHouseBuilder() *HouseBuilder {
return &HouseBuilder{house: &House{}}
}
func (b *HouseBuilder) SetFloors(floors int) *HouseBuilder {
b.house.floors = floors
return b
}
func (b *HouseBuilder) SetColor(color string) *HouseBuilder {
b.house.color = color
return b
}
func (b *HouseBuilder) SetGarage(garage bool) *HouseBuilder {
b.house.garage = garage
return b
}
func (b *HouseBuilder) Build() *House {
return b.house
}
func main() {
builder := NewHouseBuilder().
SetFloors(2).
SetColor("blue").
SetGarage(true)
house := builder.Build()
fmt.Printf("House: %+v\n", house)
}🔥8👍5❤2👏1
3. Неявное внедрение зависимостей (Dependency Injection)
Этот шаблон позволяет легко управлять зависимостями между компонентами, повышая модульность и упрощая тестирование.
Пример:
За счет гибкого расширения структуры зависимостей, не приходится менять API конструктора
Эти шаблоны помогают мне писать гибкий, легко поддерживаемый код, который можно адаптировать под различные нужды проекта.
А какие шаблоны используете вы? Делитесь своими любимыми в комментариях!⬇️ ⬇️ ⬇️
#golang #шаблоны
Этот шаблон позволяет легко управлять зависимостями между компонентами, повышая модульность и упрощая тестирование.
Пример:
type Database interface {
Query(query string) string
}
type Deps atruct {
Database
// other interfaces...
}
type Service struct {
Deps
}
func NewService(deps Deps) *Service {
return &Service{Deps: deps}
}
func (s *Service) GetData() string {
return s.Database.Query("SELECT * FROM data")
}
type MySQL struct{}
func (db MySQL) Query(query string) string {
return "MySQL query result"
}
func main() {
service := NewService(Deps{
Database: MySQL{}
})
fmt.Println(service.GetData())
}
За счет гибкого расширения структуры зависимостей, не приходится менять API конструктора
NewService, следовательно сохраняется обратная совместимость и не требуется редактировать старые тесты.Эти шаблоны помогают мне писать гибкий, легко поддерживаемый код, который можно адаптировать под различные нужды проекта.
А какие шаблоны используете вы? Делитесь своими любимыми в комментариях!
#golang #шаблоны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4❤2🤩1 1
На каком языке вы разрабатываете?
Anonymous Poll
15%
Python
11%
C/C++
63%
Go
14%
Java/Kotlin
6%
C#
4%
Swift
13%
Javanoscript/Typenoscript
5%
Rust
7%
Я не разработчик
3%
Другой (в комментариях)
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥14 11❤4👍3⚡1🆒1 1
Сегодня закончил четырехдневный курс ораторского мастерства (естественно с отличием, а как иначе). Теперь мои доклады должны стать еще лучше!😅
А вообще словил невероятный кайф от оффлайн обучения, знакомств и курса в целом.
Поделитесь в комментариях, какой последний курс проходили, или какую книгу читали, для прокачивания своих скилов?
А вообще словил невероятный кайф от оффлайн обучения, знакомств и курса в целом.
Поделитесь в комментариях, какой последний курс проходили, или какую книгу читали, для прокачивания своих скилов?
🎉7❤🔥3👍3🔥2🆒2❤1
Друзья, сегодня отмечается день программиста (256 день года). И в честь этого приглашаю всех вас на свой открытый урок:
На открытом уроке расскажу о самых важных паттернах, которые позволят вам создавать стабильные и надежные микросеврисные системы!
Жду всех вас, до встречи!
🔗 Регистрация по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8⚡4👍4❤2🆒2