This media is not supported in your browser
VIEW IN TELEGRAM
Версия 1.0 (10)
Как говорится побеждает не сильнейший, а самый стабильный. Наша сборка по понедельникам стабильней некуда.
В этой сборке для бета-тестеров как всегда новая продуктовая функциональность, фиксы багов и обязательно куча новых. В новом функционале у нас пришли достижения и стрики за ежедневный вход.
На экране достижений можно посмотреть текущие открытые и еще не полученные.
В чате бета-тестеров накидывают много идей. Из новых почти реализовали графики с прогрессом обучения и фильтрацию материалов по разным критериям.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
Структуры данных: Связанный список
Связанный список — это та самая структура данных, которую почти все спрашивают на собесах, но никогда не применяют в жизни. Даже один из ее создателей признавался, что почти никогда не юзал эту структуру в жизни.
Связанный список представляет собой объект, который обычно называют node. Она содержит все данные и ссылку на другую ноду.
В примере выше 2 реализации:
- через класс
- через enum
Связанный список — это та самая структура данных, которую почти все спрашивают на собесах, но никогда не применяют в жизни. Даже один из ее создателей признавался, что почти никогда не юзал эту структуру в жизни.
Связанный список представляет собой объект, который обычно называют node. Она содержит все данные и ссылку на другую ноду.
В примере выше 2 реализации:
- через класс
- через enum
👍7
Фреймворки — фреймят мышление.
Почему-то в мобилке все чаще юзаются архитектурные фреймворки. Люди выбирают шаблоны не по решению проблем, а по шаблонизации проекта. Маскируя плохой дизайн аргументом единообразия.
Архитектор. Как много в этом слове загадочного и неопределенного. В каждой компании эту должность занимает какой-то старый опытный дед, а его функцию никто не понимает.
Не знаю как вы, но я часто задаю вопрос какой паттерн заюзать в решении разных проблем. Здесь лучше маршрутизатор или координатор? А тут может мультиделегат или обсервер? Билдер или фабрику?
Каждый паттерн — это решение под конкретную проблему. Хороший паттерн понятен по названию, описывает мотивацию и результаты. Но к любой проблеме можно подойти с разных сторон и нет однозначного ответа. Есть только ресурсы и время.
Этим сложным вопросом часто и занимается архитектор: как выдержать баланс между качеством и стоимостью? В знаменитой книге банды четырех есть советы по выбору паттернов проектирования:
Как выбирать паттерн проектирования?
1. Подумать, как паттерн решает проблему. Это самое сложное. Иногда хочется запихнуть какой-то паттерн или архитектуру только потому, что прочитал чей-то доклад или статью. Или так модно.
2. Лучше изучить их назначение. Первые связаны с процессом создания объектов. Вторые имеют отношение к композиции объек тов и классов. Паттерны поведения характеризуют то, как классы или объекты взаимодействуют между собой.
3. Изучить взаимосвязи паттернов. Какие-то паттерны лучше работают вместе, а какие-то вызывают лишние трудности
4. Проанализируйте паттерны со сходными целями. Каждый паттерн принадлежит к одной из трех частей: порождающие паттерны, структурные паттерны и паттерны поведе ния
5. Разберитесь в причинах, вызывающих перепроектирование.
Правила кажутся очень просто, но очень часто нарушаются.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6⚡2
Кто запустит хкоде — тот андроид разраб
Anonymous Quiz
47%
in closure we live, 1, deinit call
5%
deinit call, in closure we live, 1
7%
deinit call
29%
in closure we live, 1
1%
in closure we live, 2
12%
Я хз
😁1
Как сравнить классы?
Пишу этот пост тем, кто так же забывает о других способах и помнит только о Hashable. В литкоде часто требуется решить задачи с минимальным использованием функций языка. Все на примитивах. Продакшен код избаловал меня и заставил забыть о многих вещах, которые нужно делать самому.
Банальные рекомендованные решения не всегда сделаешь из-за "гениального" дизайна swift'a. А юзать функции, которые за тебя делают 99% задачи, противоречит самой философии решения задач.
Для сравнения классов необязательно иметь хэшвалуе. Прикиньте? Вау. Если вы, как и я, забыли об этом, то вот пару советов:
1. оператор === . Он помогает сравнить лежит ли экземпляр класса в одной и той же ячейки памяти. Идеально для всех классов.
2. Класс ObjectIdentifier. Это уже дополнение, где мы можем быстро идентифицировать класс подручными средствами. Класс больше компенсирует ту кастрацию и плохой дизайн нашего языка. Помогает совмещать Set, HashMap без подписки класса на Hashable
Кстати, кому интересно, то вот видос, как с помощью этого класса делают свой DI.
Пишу этот пост тем, кто так же забывает о других способах и помнит только о Hashable. В литкоде часто требуется решить задачи с минимальным использованием функций языка. Все на примитивах. Продакшен код избаловал меня и заставил забыть о многих вещах, которые нужно делать самому.
Банальные рекомендованные решения не всегда сделаешь из-за "гениального" дизайна swift'a. А юзать функции, которые за тебя делают 99% задачи, противоречит самой философии решения задач.
Для сравнения классов необязательно иметь хэшвалуе. Прикиньте? Вау. Если вы, как и я, забыли об этом, то вот пару советов:
1. оператор === . Он помогает сравнить лежит ли экземпляр класса в одной и той же ячейки памяти. Идеально для всех классов.
2. Класс ObjectIdentifier. Это уже дополнение, где мы можем быстро идентифицировать класс подручными средствами. Класс больше компенсирует ту кастрацию и плохой дизайн нашего языка. Помогает совмещать Set, HashMap без подписки класса на Hashable
Кстати, кому интересно, то вот видос, как с помощью этого класса делают свой DI.
YouTube
Object IDs: Dependency Injection Fundamentals (iOS) – 2022
In this video we will learn about object identifiers in swift and Xcode. Object identifiers can be used to form the foundation of dependency injection with resolve and register patterns. We will do some examples in a playground using the latest version of…
👌6👍2🔥1
Одно из главных правил хорошего проектирования гласит: предпочитайте композицию наследованию класса
Два самых популярных приема переиспользования функциональности. С наследованием все понятно и мы юзаем его в каждом классе, а вот с композицией не всегда. Частично можно сказать, что отказ от наследования в структурах должен был приблизить разработчиков к хорошему проектированию. Так ли это? Давайте разбираться.
Композиция сводится к объединению нескольких частей для создания нового. Можно увидеть апку, которая юзает много фреймворков, как результат совместного создания фреймворков.
В идеале, чтобы добиться повторного использования, вообще не следовало бы создавать новые компоненты. Хорошо бы, чтобы можно было получить всю нужную функциональность, просто собирая вместе уже существующие компоненты. На практике так получается редко, поскольку набор имеющихся компонентов все же недостаточно широк.
Повторное использование за счет на следования упрощает создание новых компонентов, которые можно было бы применять со старыми. Поэтому наследование и композиция часто используются вместе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3❤🔥2
Вернемся обратно к самым популярным и легким паттернам.
Назначение
Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Стратегия позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
Мотивация
Частый на практике пример — форматирование строки. Мало сказать, что мы усложним код, оставив там преобразования строк. Так еще создадим дублирование, если код скопирован 1 в 1 из другого места. А если придется еще расширять, то проблем не избежать.
Тут мы можем инкапсулировать логику в отдельный паттерн.
Применимость
- Когда нужно сконфигурировать поведение классов
- Нужно иметь несколько разных вариантов конфигурации
- Нужно скрыть детали и данные от клиентов
- Разветвления в поведении
Прейдем к практике
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Паттерн Coordinator
Один из важных паттернов для навигации. В нашей команде авито мы даже заюзали его для создание флоу одного из типов аккаунтов.🤍
Суть координатора — в инкапсуляции логики навигации. В отличие от Router'а, который сильнее пригвозден к модулю или экрану, координатор может жить более независимой жизнью. С ним легко манипулировать общим флоу и последовательностью текущих и следующих модулей.
Мотивация
Решение проблем с координатором — множественное.
- У нас есть диплинки и нам нужно выстроить глубокую последовательность из разных экранов.
- Кнопка назад требует отмены сразу нескольких модулей
- Результат текущего выбора данных может повлиять на предыдущие или следующие экраны
Применимость:
- Когда хотим лучше контролировать флоу из последовательностей экранов
- Хотим сделать модули более реюзабельными
- Нужен общий результат от последовательностей контролеров
- Лучше контролируем логику навигации
Интресные ссылки:
- Кнопка назад и координаторы
- Как юзать паттерн координатор в iOS
- Что такое паттерн коордианатор
- Router vs Coordinator
Один из важных паттернов для навигации. В нашей команде авито мы даже заюзали его для создание флоу одного из типов аккаунтов.
Суть координатора — в инкапсуляции логики навигации. В отличие от Router'а, который сильнее пригвозден к модулю или экрану, координатор может жить более независимой жизнью. С ним легко манипулировать общим флоу и последовательностью текущих и следующих модулей.
Мотивация
Решение проблем с координатором — множественное.
- У нас есть диплинки и нам нужно выстроить глубокую последовательность из разных экранов.
- Кнопка назад требует отмены сразу нескольких модулей
- Результат текущего выбора данных может повлиять на предыдущие или следующие экраны
Применимость:
- Когда хотим лучше контролировать флоу из последовательностей экранов
- Хотим сделать модули более реюзабельными
- Нужен общий результат от последовательностей контролеров
- Лучше контролируем логику навигации
Интресные ссылки:
- Кнопка назад и координаторы
- Как юзать паттерн координатор в iOS
- Что такое паттерн коордианатор
- Router vs Coordinator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17⚡1
365 дней богу Алгоритмов: Отчет за четвертую неделю
Месяц решаю ежедневно задачи. Полет отличный.
30 день и четвертый недельный отчет. На этой недели авито оплатило литкод премиум и теперь я полноценный человек.😬
Впервые встретил орду читеров: индусов, славян, американцев и азиатов. Сначала ты даже не веришь, что такие индивиды есть, но потом находишь общий паттерн. Некоторых даже видел в чатах, некоторые даже писали мне.
Не понимаю, на что надеются эти люди и кому хотят что-то доказать? Накручивая готовыми решениями репутацию и рейтинги. Приглашают в свой гитхаб с закрашенными плитками, которые красятся раз в день скриптом изменяя только файл Readme. Может кого-то вызову даже на литкод батл онли офлайн лицом к лицу без вариантов списать.
Но о моей горящей жопе и как ловить самоубийственных самозванцев будет отдельный пост. Перейдем к скучному.
24. Поиск среднего узла в списке. Признаюсь, сначала я перемудрил, а потом подумал о тупом решении запихнуть все в массив и просто его поделить🤡
25. Поиск цикла в связанном списке. Тут я пошел по решению из учебников — создать флаг isVisited через хэшмапу
26. Палиндром ли связанный список. Опять все через массив. Складываем значения и реверсим
27. Анаграмы ли две строки. Тут супер изи. Я сделал через 2 хэшмапы с подсчетом кол-ва символов (можно лучше да)
28. Поиск цикла в списке 2. Тут сделал почти такое же решение, как и в задаче изи
29. Перемешать значения. Изи задача которую даже чатбот в нашем чате решил за 3 секунды таким же образом
30. Палиндром ли строка со спец. символами. Тут я решил с функциями языка по реплейсу символов и просто зареверсал
Говорят, 30 дней ежедневных действий уже формируют привычку. Хорошо, что моя привычка — не читерство.
#365_дней_богу_алгоритмов
Месяц решаю ежедневно задачи. Полет отличный.
30 день и четвертый недельный отчет. На этой недели авито оплатило литкод премиум и теперь я полноценный человек.
Впервые встретил орду читеров: индусов, славян, американцев и азиатов. Сначала ты даже не веришь, что такие индивиды есть, но потом находишь общий паттерн. Некоторых даже видел в чатах, некоторые даже писали мне.
Не понимаю, на что надеются эти люди и кому хотят что-то доказать? Накручивая готовыми решениями репутацию и рейтинги. Приглашают в свой гитхаб с закрашенными плитками, которые красятся раз в день скриптом изменяя только файл Readme. Может кого-то вызову даже на литкод батл онли офлайн лицом к лицу без вариантов списать.
Но о моей горящей жопе и как ловить самоубийственных самозванцев будет отдельный пост. Перейдем к скучному.
24. Поиск среднего узла в списке. Признаюсь, сначала я перемудрил, а потом подумал о тупом решении запихнуть все в массив и просто его поделить
25. Поиск цикла в связанном списке. Тут я пошел по решению из учебников — создать флаг isVisited через хэшмапу
26. Палиндром ли связанный список. Опять все через массив. Складываем значения и реверсим
27. Анаграмы ли две строки. Тут супер изи. Я сделал через 2 хэшмапы с подсчетом кол-ва символов (можно лучше да)
28. Поиск цикла в списке 2. Тут сделал почти такое же решение, как и в задаче изи
29. Перемешать значения. Изи задача которую даже чатбот в нашем чате решил за 3 секунды таким же образом
30. Палиндром ли строка со спец. символами. Тут я решил с функциями языка по реплейсу символов и просто зареверсал
Говорят, 30 дней ежедневных действий уже формируют привычку. Хорошо, что моя привычка — не читерство.
#365_дней_богу_алгоритмов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🏆2⚡1🔥1