Pull to refresh

Как часто вы сталкивались с проблемой изменения данных, переданных в качестве параметра? Иллюстрация:

int getCountBagel(List<String> list) {
  list.retainWhere((e) => e == '?');
  return list.length;
}

main() {
  final basket = ['?', '?', '?', '?', '?'];
  final countBagel = getCountBagel(basket); // 2
  print(basket); // [?, ?]
}

Выполнив копирование getCountBagel([...basket]), вы обезопасите себя. Да, это ужасный способ посчитать количество элементов. Но представьте, что вы зависите от стороннего api, к которому у вас нет непосредственного доступа.

Обратная задача: в Dart примитивные типы всегда передаются по значению. Это означает, что если вы передаёте экземпляр примитивного типа в качестве параметра в функцию (или класс) и внутри его изменяете, то оригинальный экземпляр останется неизменным:

void increase(int i) => i++;

main() {
  int i = 0;
  increase(i);
  print(i); // 0
}

Если вы хотите передать что-то по ссылке, то заверните это в класс:

class Wrapper {
  Wrapper(this.i);
  int i;
}

void increase(Wrapper w) => w.i++;

main() {
  final w = Wrapper(0);
  increase(w);
  print(w.i); // 1
}

но такой способ ухудшит SRP (принцип единой ответственности) и усложнит тестирование функции increase... Ответ в комментарии ?

Tags:
Total votes 1: ↑1 and ↓0+1
Comments1

Articles