Пока цена портирования и поддержка платформы выше, чем выручка с нее — можно и не начинать. Для игры имеет смысл рассматривать iOS и iPadOS как платформу для жизни, где много денег и пользователей. Может быть даже больше, чем в windows. И для indie игры в первую очередь стремиться туда. С выходом Catalina портировать игру на macOS большого труда не составит. И будет сразу одним релизом будет закрыто три платформы.
Разумно было бы до идентификации разрешить оплачивать услуги со своей банковской карты, а кошелек пополнять не давать. И услуга оплачена и денег лишних на счету не зависнет.
Я сам попал в ту же ситуацию лет 5 назад. Хотел кому-то денег перевести на ЯД, к себе на кошелек кинул, а перевести уже не смог. Хотя пополнить чужой кошелек со своей карточки можно без проблем. А казалось бы это равноценные операции.
5 лет прошло, а воз и ныне там.
Все хорошо. Но как быть если интернет пропал? Сразу говорить пользователю чтобы шел к машине? Или вы зашли в здание и GPS уплыл в соседний район. У вас ломается предсказание, сколько идти обратно и не ясно в какую сторону. Может начать думать, что машина рядом, а может наоборот.
Расскажу свою историю: Мы делаем фреймворки для офлайн карт, навигации, поиска на iOS и Android. Код максимально шарится между платфомами. Приведу пример: Для того чтобы показать вьюху с картой на стороне ОС мы обрабатываем касания, реализуем API для взаимодействия с компонентом и создаем surface для рендера. Весь остальной код пишется на C++. И там его очень много. Парсинг данных, парсинг стиля, применение стиля к данным, подготовка данных для OpenGL/Metal, весь сетевой стек, очереди фоновых задач, обработка данных пользователя. API, которое видит разработчик — это просто верхушка айсберга. Это с одной стороны. Много сложного кода, его лучше писать один раз. И ошибки ловить один раз.
При этом мы делаем приложения Guru Maps на своих же фреймворках. И тут ситуация обратная весь интерфейс и большинство кода этих приложений пишутся так, как это принято на конкретной архитектуре. Общий код на C++ тоже есть, но его мало. Это работа с данными и конверсия между бинарным форматом,GPX,KML в любую сторону.
Категоричный вывод о том что общий код на C++ вреден — я бы не делал. Он сильно облегчает жизнь. Но это должно быть что-то такое, в чем нужна скорость и нет зависимости от специфичных для платформы плюшек.
И не только номера. Любопытно будет посмотреть на проверку атаки. Кто возьмет валидное пространство номеров телефонов для страны и попробует найти там номер по 3 байтам 32 байтного хэша. Интересно сколько там будет коллизий.
Так у большинства стоит настройка. «Принимать файлы только от знакомых». Все остальные запросы с мусором даже появляться не будут. Без превью, без соблазнительных картинок и т.д.
А в чем собственно проблема? Вы же сейчас прочитали абстрактный кусок кода, сделали какие-то выводы и спрашиваете у меня верны ли эти выводы.
Да я считаю, что конверсию типов надо проверять. Да, все ошибки, которые возвращает api надо проверять. Да, если что-то может пойти не так, надо проверить, все ли хорошо. И если произошло что-то нештатное, действовать по обстоятельствам: отправлять ошибку выше по стеку, обрабатывать, пробовать снова или что-то еще.
Но это все риторика о том как обрабатывать ошибки.
Усложнение концепции языка не защитит от ошибок, а наоборот сделает код сложнее и ошибок станет больше. Несмотря на благие намерения. Стандартные библиотеки go показали, как на нем можно решать прикладные задачи и без дженериков.
Может быть я не работал на сложных проектах на Go. Но работал на сложных проектах на C++. Где стрелять себе в ногу проще по многим причинам. И если есть возможность не писать хреновый код, его не надо писать. Могу понять студенческие поделки, но в продакшене такого быть не должно. Язык сам дает инструменты, чтобы проверять, что все норм. Почему бы ими не воспользоваться?
Тут у вас есть возможность проверить, успешный ли каст или нет. Добавили проверку — все работает.
В каком случае может возникнуть необходимость делать касты без проверки я не могу представить.
Для меня golang прекрасен именно отсутствием генериков и гибкими интерфейсами. Эти два подхода замечательно заменяют друг друга. Ты хочешь обязать какой-то объект обладать какими-то свойствами. Опиши это в интерфейсе и передавай в функцию свой интерфейс. Все. Не надо шаблон. Функция будет работать одинаково для всех типов, которые подходят под интерфейс. Я пишу часто на C++ и в моей жизни хватает шаблонов. Пожалуй их даже слишком много и Golang как глоток свежего воздуха с подохдом интерфейсов.
Если реализовывать два подохда одновременно. Будет каша и путаница.
Пишут они все понятно. И рассказывают и показывают на примерах и когда дают реджект там тоже в тексте указывают что не так. Да бывает тяжело найти, среди всего текста тот заветный абзац. Если сейчас перечитаете изначальный реджект, неужели там не было ничего о описании и иконке?
У некоторых весь трафик пишется. А вы говорите что доступ к приватной информации не логируют. Это можно объяснить только безалаберностью. Для мобильных приложений логируется каждый чих, чтобы смотреть тенденции в поведении пользователей. Так и своих работников надо мониторить и смотреть каждый чих и запрос. И если будут подозрения в сливе инфы, это будет явно видно.
Ну можно не в суд идти, а на хабр и показывать конкретику. Какой скрипт куда встраивается и что делает. И для каких User-Agent это срабатывает. Любопытные проверяют все у себя и возможно, подают в суд коллективный иск. Шумиха и репутационные потери будут и без суда.
Я так понимаю, что вмешиваться в трафик своих клиентов они начали уже давно и не прекращали с тех пор. Теперь аппетиты несколько выросли и они начали уже в транзитном трафике копаться.
Я сам попал в ту же ситуацию лет 5 назад. Хотел кому-то денег перевести на ЯД, к себе на кошелек кинул, а перевести уже не смог. Хотя пополнить чужой кошелек со своей карточки можно без проблем. А казалось бы это равноценные операции.
5 лет прошло, а воз и ныне там.
Офлайн навигация не так сложна, как может показаться. Но пользователю надо будет предварительно качать навигационные данные для своего города.
При этом мы делаем приложения Guru Maps на своих же фреймворках. И тут ситуация обратная весь интерфейс и большинство кода этих приложений пишутся так, как это принято на конкретной архитектуре. Общий код на C++ тоже есть, но его мало. Это работа с данными и конверсия между бинарным форматом,GPX,KML в любую сторону.
Категоричный вывод о том что общий код на C++ вреден — я бы не делал. Он сильно облегчает жизнь. Но это должно быть что-то такое, в чем нужна скорость и нет зависимости от специфичных для платформы плюшек.
Да я считаю, что конверсию типов надо проверять. Да, все ошибки, которые возвращает api надо проверять. Да, если что-то может пойти не так, надо проверить, все ли хорошо. И если произошло что-то нештатное, действовать по обстоятельствам: отправлять ошибку выше по стеку, обрабатывать, пробовать снова или что-то еще.
Но это все риторика о том как обрабатывать ошибки.
Усложнение концепции языка не защитит от ошибок, а наоборот сделает код сложнее и ошибок станет больше. Несмотря на благие намерения. Стандартные библиотеки go показали, как на нем можно решать прикладные задачи и без дженериков.
Тут у вас есть возможность проверить, успешный ли каст или нет. Добавили проверку — все работает.
В каком случае может возникнуть необходимость делать касты без проверки я не могу представить.
Компилятор возвращает ошибку:
Научите, как сделать панику в рантайме.
Если реализовывать два подохда одновременно. Будет каша и путаница.
Я так понимаю, что вмешиваться в трафик своих клиентов они начали уже давно и не прекращали с тех пор. Теперь аппетиты несколько выросли и они начали уже в транзитном трафике копаться.