
- Главная
- Каталог
- Интернет технологии
- Мобильная разработка #1
Мобильная разработка #1
Разработка мобильных приложений (app) под Android, iOS.
Подборки с полезной информацией, книги, статьи.
Статистика канала
./gradlew ktlintFormat). Больше никаких споров о пробелах.
2. Detekt: Это уже тяжелая артиллерия. Он ищет не просто кривые отступы, а потенциальные баги: слишком сложные функции, магические числа, пустые блоки catch.
🍏 iOS (Swift):
1. SwiftLint: Стандарт индустрии. Настраивается через .swiftlint.yml. Может кидать Warning (желтое) или Error (красное), если код не соответствует правилам команды.
force_cast (запрет на использование as!), line_length (длина строки).
🚀 Уровень Pro (Git Hooks):
Настройте Pre-commit hook.
Это скрипт, который запускает линтер до того, как коммит вообще создастся.
Если линтер найдет ошибку - Git просто не даст сделать коммит.
Итог: В репозиторий физически невозможно запушить «грязный» код.
count++ (увеличение счетчика) для процессора - это три действия:
1. Считать текущее значение (100).
2. Прибавить единицу (101).
3. Записать новое значение (101).
Если два потока начнут выполнять шаг 1 одновременно, они оба "увидят" 100. Оба прибавят 1 и запишут 101. Одно действие потеряется навсегда.
🐛 Heisenbug (Гейзенбаг):
Самое страшное в гонках то, что они часто исчезают, когда вы начинаете дебажить (добавляете print или брейкпоинты), так как это меняет тайминги выполнения потоков.
🛡 Как защититься (Инструменты Мидла):
🤖 Android (Kotlin):
AtomicInteger или AtomicBoolean. Они гарантируют атомарность операций.
val mutex = Mutex()
mutex.withLock {
// Код здесь выполняется только одним потоком за раз
count++
}
{}
• StateFlow: Позволяет безопасно обновлять состояние UI, избегая гонок.
🍏 iOS (Swift):
• Actors (Swift 5.5+): В 2026 году это стандарт. Акторы автоматически защищают свое изменяемое состояние. Вам не нужны ручные блокировки.
actor BankAccount {
var balance = 100
func withdraw(amount: Int) { balance -= amount }
}
{}
• Serial Queues (GCD): Старая добрая очередь, где задачи выполняются строго по одной.
💡 Совет: Если у вас в приложении есть переменная var, которую меняют из разных фоновых потоков, это бомба замедленного действия. Заверните её в Atomic, Mutex или Actor.
Сталкивались с багами, которые невозможно повторить на устройстве разработчика? 👇
#concurrency #multithreading #android #ios #kotlin #swift #bugs
👉 @developer_mobilanew?
Когда новичок видит код с кучей аннотаций @Inject или модулей, у него возникает вопрос: "Зачем всё это? Я же могу просто создать объект внутри класса!"
❌ Код Джуна (Hard dependency):
class UserRepository {
// Мы "приварили" конкретную базу данных к репозиторию
private val database = SQLiteDatabase()
fun getUser() { ... }
}
{}
В чем проблема?
Представьте, что вы строите дом. Этот код как если бы вы вмуровали кофемашину прямо в стену кухни.
1. Хотите заменить кофемашину на новую? Придется ломать стену (переписывать код класса).
2. Хотите протестировать кухню, не варя кофе? Не получится, машина там намертво.
✅ Код Мидла (Dependency Injection):
class UserRepository(private val database: Database) {
// Мы просим дать нам ЛЮБУЮ базу данных через конструктор
}
{}
В чем суть?
Вы говорите: "Мне для работы нужна база данных. Дайте мне её, я не хочу сам её создавать".
Это как розетка. Вы не вмуровываете технику в стену, вы просто втыкаете вилку. Сегодня это дешевый чайник (тестовая база), завтра мощная кофемашина (реальный сервер).
🛠 Инструменты (Что учить):
🤖 Android:
• Hilt (Dagger): Стандарт от Google. Мощный, проверяет ошибки при компиляции, но сложный в настройке.
• Koin: Service Locator (технически не совсем DI, но решает те же задачи). Простой, пишется на чистом Kotlin, но ошибки могут вылезти в рантайме. Идеально для старта.
🍏 iOS:
• Swinject: Классика DI контейнеров.
• Swift Native: В современных проектах часто используют просто Factory Pattern или передачу зависимостей через init, без сторонних библиотек. Это самый чистый путь.
💡 Совет:
На собеседовании на вопрос "Что такое DI?" не начинайте рассказывать про даггер.
Скажите просто: "Это принцип, когда объекты не создают свои зависимости сами, а получают их извне. Это нужно для тестируемости и гибкости кода". Это ответ уровня Senior.
А что используете вы в своих проектах? 👇
#architecture #di #hilt #koin #ios #android #middle #patterns
👉 @developer_mobilaval apiKey = "sk-proj-12345..."
Потом git push, и вы идете спать.
А утром ваш ключ заблокирован, или с карты списали деньги за чужой трафик.
🤖 Реальность: Боты сканируют публичные репозитории GitHub на наличие строк, похожих на ключи, за секунды после публикации. Удалить коммит не поможет, он уже в кеше у злоумышленников.
Как делать правильно (Middle Way):
Секреты никогда не должны попадать в систему контроля версий (Git). Они должны жить только локально на вашем компьютере.
🤖 Android:
Используйте файл local.properties. Он по умолчанию добавлен в .gitignore.
1. Откройте local.properties и добавьте: MY_API_KEY="ваш_ключ".
2. В build.gradle (app) считайте его и прокиньте в код:
defaultConfig {
buildConfigField("String", "API_KEY", gradleLocalProperties(rootDir).getProperty("MY_API_KEY"))
}
{}
3. В коде используйте: BuildConfig.API_KEY.
🍏 iOS:
Вариантов много, но самый простой для старта:
1. Создайте файл Secrets.xcconfig (или .plist).
2. Сразу же добавьте его в .gitignore.
3. Запишите ключ туда.
4. В настройках проекта (Build Settings) подключите этот конфиг или считывайте файл программно.
🛡 Золотое правило:
Если вы клонируете свой проект на чистый ноутбук, он не должен собраться сразу. Он должен попросить вас создать локальный файл с ключами. Это не баг, это безопасность.
Признавайтесь, случалось случайно комитить пароли или токены? 👇
#security #android #ios #git #tips #middle #safety
👉 @developer_mobilainit
wip
fix crash
fix typo
aaaaa rabotay pls
А потом отправляете это в Pull Request. Тимлид открывает историю и… плачет кровавыми слезами. 🩸
Отличное правило хорошего тона: «Ветка может быть грязной, пока она локальна. Но в main должен уйти чистый и атомарный код».
Вам нужен Git Interactive Rebase. Это магия, которая позволяет переписать историю.
🛠 Как это сделать (Консоль / IDE):
Допустим, вы хотите объединить последние 5 мелких коммитов в один красивый.
1. Пишем в терминале: git rebase -i HEAD~5
2. Откроется редактор со списком ваших коммитов. Перед каждым стоит слово pick.
3. Меняем команды:
pick у самого первого (верхнего) коммита.
pick на squash (или s) - это значит «сплющить» этот коммит с предыдущим.
reword.
4. Сохраняем и закрываем. Git предложит написать одно общее сообщение для нового «супер-коммита».
5. Отправляем на сервер: git push --force (Осторожно! Делайте это только в своей ветке, пока никто другой в ней не работает).
💡 Результат:
Вместо 5 мусорных записей у вас одна красивая: Feature: Added dark mode implementation.
Коллеги на ревью скажут спасибо:
✅ Проще читать изменения.
✅ Если баг - проще откатить один коммит, чем искать в куче мелких.
А вы используете Rebase или предпочитаете честную историю со всеми «фиксами»? 👇
#git #teamwork #middle #tips #tools #bestpractices
👉 @developer_mobilaMainActivity или ProfileViewController, а там... 1500 строк кода. 😱
Там и работа с сетью, и валидация полей, и анимации, и сохранение в базу, и даже форматирование даты. В мире разработки это называется God Object (или Massive View Controller).
Почему это плохо?
1. Невозможно тестировать. Как написать юнит-тест на класс, который делает всё?
2. Сложно менять. Поправил верстку — сломалась база данных.
3. Конфликты при слиянии. В команде двое разработчиков полезли в этот файл — здравствуй, merge conflict на полдня.
🚀 Как лечить (Гайд для перехода в Middle):
Если видишь класс больше 300-400 строк, начинай «резню»:
1. ✂️ Всю логику сети - в Repository.
Во View/Activity не должно быть http-клиентов и JSON-парсинга. Она должна просто сказать: repository.getUsers() и показать спиннер.
2. ✂️ Всю бизнес-логику - в UseCases (Интеракторы).
Валидация пароля, подсчет корзины, фильтрация списков - это чистая логика. Выносите её в отдельные классы (PasswordValidator, CartCalculator).
3. ✂️ Сложный UI - в Custom Views / Child ViewControllers.
Если у вас в адаптере списка 500 строк кода настройки ячеек - вынесите ячейку в отдельный класс с методом bind(data).
💡 Правило одной ответственности (SRP):
Класс должен иметь только одну причину для изменения.
.minimumInteractiveComponentSize(). Он сам добавит невидимые отступы, чтобы дотянуть размер до 48dp.
padding="12dp" к самому ImageView или оберните его в прозрачный контейнер, на который повесьте клик. Не используйте TouchDelegate без крайней нужды, это больно.
🍏 iOS (SwiftUI & UIKit):
.onTapGesture на маленькую иконку.
Image("close").onTapGesture { ... }
Image("close").frame(width: 44, height: 44).contentShape(Rectangle()).onTapGesture { ... } (мы делаем прозрачную рамку вокруг).
point(inside:with:) в кнопке, чтобы она ловила касания за своими пределами.
💡 Лайфхак:
Включите в настройках разработчика на телефоне «Показывать границы элементов» (Show layout bounds). Если вы видите маленькие прямоугольники вокруг кнопок, это повод для рефакторинга.
Заботьтесь о пальцах своих пользователей! А вы спорите с дизайнерами, когда они рисуют слишком мелкие элементы? 👇
#ux #ui #android #ios #tips #mobile #design
👉 @developer_mobilaLog.d("TAG", "Я тут")
Log.d("TAG", "А теперь тут, значение i = $i")
Есть способ элегантнее, который отличает опытного разработчика от новичка - Conditional Breakpoints (Условные точки останова).
Они останавливают выполнение программы только тогда, когда выполняется определенное условие.
Как это сделать за 5 секунд:
🤖 Android Studio (IntelliJ IDEA):
1. Поставьте обычный красный брейкпоинт.
2. Нажмите на него правой кнопкой мыши.
3. В поле "Condition" напишите условие на языке Kotlin/Java.
Пример: item.id == 87 или user.name.contains("Test") && i > 50
4. Готово! Студия проигнорирует первые 86 итераций и остановится точно там, где нужно.
🍎 Xcode:
1. Поставьте синий брейкпоинт.
2. Нажмите на него правой кнопкой (или двойной клик) -> "Edit Breakpoint".
3. В поле "Condition" пишите условие на Swift.
Пример: indexPath.row == 87
💡 Бонус-фича для тех, кто не любит останавливаться:
В настройках брейкпоинта уберите галочку Suspend (Остановить) и поставьте галочку Log Message (Evaluate and log).
Теперь IDE будет сама писать в консоль значения переменных при прохождении этой точки, не останавливая приложение. Это те же принты, только вам не нужно пачкать ими код и пересобирать проект!
Какая ваша любимая фишка дебаггера, о которой мало кто знает? Делитесь в комментариях 👇
#productivity #androidstudio #xcode #debug #tips #middle
👉 @developer_mobilaViewModel (Android) или в переменной контроллера (iOS), они же живут долго!»
Реальность: ViewModel переживает поворот экрана, но умирает вместе с процессом. Синглтоны тоже сбрасываются.
✅ Как делать правильно (Level Up):
🤖 Android:
Перестаньте полагаться только на поля класса. Используйте SavedStateHandle.
Это специальный механизм внутри ViewModel, который сохраняет небольшие кусочки данных (ID, поисковый запрос, ввод пользователя) в системный бандл. Система бережно восстановит его даже после смерти процесса.
Гуглить: SavedStateHandle, Parcelable.
🍏 iOS (SwiftUI/UIKit):
В SwiftUI для простых данных (например, выбранная вкладка или текст) используйте обертку @SceneStorage. Она автоматически сохраняет и восстанавливает состояние.
Для сложных данных — сохраняйте их в локальную БД (CoreData/Realm/SwiftData) при каждом изменении, а не при закрытии экрана.
🛠 Как проверить себя (Челлендж на 5 минут):
Не верьте эмулятору. Проверьте свой текущий проект прямо сейчас:
1. Запустите приложение и введите данные в любое поле.
2. Сверните приложение (Home).
3. Android: В настройках разработчика включите опцию «Don't keep activities» (Не сохранять действия).
4. iOS: В Xcode нажмите Debug -> Simulate Memory Warning или остановите дебаг и запустите другое тяжелое приложение.
5. Вернитесь в свое приложение.
Если данные исчезли или случился краш, поздравляю, вы нашли критический баг. Время фиксить!
Знали про SavedStateHandle или по старинке сохраняли всё в базу данных? 👇
#android #ios #bugs #middle #architecture #обучение
👉 @developer_mobilabuildSrc и простое перечисление в build.gradle уступают место TOML-файлам.
🍎 iOS (Swift)
async/await и Actors. Понимание потокобезопасности отличает Мидла от Джуна.
Отзывы канала
всего 10 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Мобильная разработка #1 — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 4.0K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.2, количество отзывов – 10, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 1678.32 ₽, а за 49 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий