169 похожих чатов

Всем привет. Нужен совет очень умного архитектора. С некоторых пор

для простых и незацепленных компонентов, которые в приложении гарантированно будут синглтонами, я стал использовать статику. Упрощает синтаксис, не нужно постоянно извлекать объект из DI или писать .instance. Вот пример такого компонента - детектирует состояние сети путем периодического пинга сервера. Вопрос - насколько приемлемо использовать статику, какие грабли могут быть? Слышал, что статика - это зло, но до сих пор не понял почему. Спасибо.

import 'dart:async';
import 'package:get/get.dart';

import '/config/app_settings.dart';
import '/core/state/app_auth_state.dart';
import '/data/remote/ping_remote_client.dart';

class NetworkStatusObserver {
static bool _isConnected = true;
static bool _exit = false;
static final _streamController = StreamController<bool>.broadcast();
static late final _pingRemoteClient;

static bool get isOffline => !_isConnected;
static Stream<bool> get stream => _streamController.stream;

NetworkStatusObserver._();

static Future<void> init() async {
_pingRemoteClient = PingRemoteClient();
await _detect();
() async {
while (!_exit) {
await Future.delayed((_isConnected) ? AppSettings.pingIntervalOnline : AppSettings.pingIntervalOffline);
await _detect();
}
}();
}

static Future<void> _detect() async {
bool connected;
try {
final start = DateTime.now();
await _pingRemoteClient.ping();
final diff = DateTime.now().difference(start);
print('ping delay: $diff');
connected = true;
if (AppSettings.detectSlowNetwork &&
DateTime.now().difference(start) > Get.find<AppAuthState>().maxPingDelay.value) {
connected = false;
}
} catch (_) {
print('ping failed');
connected = false;
}
if (connected != _isConnected) {
_isConnected = connected;
_streamController.add(_isConnected);
}
}

// Если сетевая ошибка пришла по действию пользователя раньше, чем по пингу
static void forceTurnOffline() {
_isConnected = false;
_streamController.add(_isConnected);
}

static void dispose() {
_exit = true;
_streamController.close();
}
}

9 ответов

22 просмотра

Будешь делать тесты - придется рефакторить.

Юджин Флаттер
объясни

Статику не замокаешь. Статика существует не в контексте объекта, а в контексте класса

Юджин Флаттер- Автор вопроса

Ну, принимается. Хотя у нас нет автотестов и не будет.

Юджин Флаттер
Ну, принимается. Хотя у нас нет автотестов и не бу...

Такие проекты или учебные, или потом будет попоболь и слезы.

Юджин Флаттер- Автор вопроса
Amir Niyazov
Такие проекты или учебные, или потом будет попобол...

Ты шутишь. У меня в проде одна социальная сеть и один корпоративный апп. Никаких автотестов, только интеграционные по экрану.

Юджин Флаттер- Автор вопроса
Amir Niyazov
Такие проекты или учебные, или потом будет попобол...

Для автотестов нужен двойной бюджет проекта и специальный тестировщик. Которых никогда не дают.

Юджин Флаттер- Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта