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

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

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

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


person JAre    schedule 13.06.2014    source источник


Ответы (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, вам не нужно каждый раз делать это явно.

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

person Günter Zöchbauer    schedule 13.06.2014

Я поместил @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");
}

Так ничего не торчит.

person JAre    schedule 13.06.2014
comment
Кажется, я неправильно понял ваш вопрос о фабричном конструкторе. Спасибо за публикацию вашего решения. - person Günter Zöchbauer; 13.06.2014
comment
@GünterZöchbauer GünterZöchbauer Я должен потратить некоторое время на изучение не только Дарта, но и английского языка: P Я удалил свой комментарий к Вашему ответу, и Вам, вероятно, следует немного исправить его, чтобы он был понятнее. - person JAre; 13.06.2014
comment
Извините, я не уверен, что вы подразумеваете под «сделать это яснее», сделать что яснее? - person Günter Zöchbauer; 13.06.2014
comment
@GünterZöchbauer Образец кода мог бы быть более кратким без заводского шаблона, потому что он не имеет ничего общего с исходным вопросом и существует только в результате того, что я ввел вас в заблуждение неясным комментарием. - person JAre; 13.06.2014