Как исключить отладочный код
Допустим, у меня есть простой регистратор:
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");
}
Таким образом, ничего не выпирает.