Как исключить отладочный код

Допустим, у меня есть простой регистратор:

void main() {
  var logger = new MyLogger();
  logger.log("hello Dart");
}

Я хочу, чтобы этот код работал в режиме dev (режим проверки VM), но я не хочу, чтобы он был в моем рабочем коде. И я хочу, чтобы это было "расшатано деревом" с помощью компилятора dart2js. Есть какой-то стандартный способ?

2 ответа

Решение

Вы можете вставить код в assert, Утверждения игнорируются в производственном коде, и я уверен, что не построен на JS, когда pub build находится в release Режим.

class X {
  X() {
    print('x created');
  }

  void log(String m) {
    print(m);
  }
}

bool log(String m) {
  new X()..log(m);
      return true;
}

void main() {
  assert(() {
    new X()..log('in Assert');
    return true;
  });

  assert(() => log('in Assert')); // use a wrapper function
}

Когда вы создаете метод-оболочку, который возвращает true чем вам не нужно делать это явно каждый раз.

Вы также можете взглянуть на этот вопрос Как достичь директивы прекомпилятора, например, функциональности

Я положил @GünterZöchbauer "трюк с утверждением" внутри конструктора фабрики:

class _ProductionPlug implements DebugClass{
  const _ProductionPlug();
  noSuchMethod(_) {} //do nothing
}

class DebugClass{
  static final DebugClass _plug = const _ProductionPlug();
  log(msg){print(msg);}
  DebugClass._(){}
  factory DebugClass(){
    DebugClass instance;
    assert((){
    instance = new DebugClass._();
    return true;
        });
    return instance != null ?  instance :  _plug;
  }
}
void main() {
  print("hello");
  new DebugClass()
    ..log("debugging");
}

Таким образом, ничего не выпирает.

Другие вопросы по тегам