メインコンテンツにスキップ

avoid_implementing_value_types

安定版

== をオーバーライドするクラスを実装しないでください。

詳細

#

実装しないでください == をオーバーライドするクラスを。

== 演算子は、すべてのオブジェクト o1o2 に対して、o1 == o2o2 == o1 の両方が真であるか、または両方が偽であるかのいずれかである、等価関係である必要があります。

注意: Dart には真の*値型*はありません。そのため、代わりに == を実装するクラスを値型の*プロキシ*と見なします。

implements を使用する場合、== のメソッド本体を継承しないため、== の契約に従うことはほぼ不可能になります。== をオーバーライドするクラスは通常、モックやフェイクを作成せずに、テストで直接使用できます。たとえば、与えられたクラス Size について

dart
class Size {
  final int inBytes;
  const Size(this.inBytes);

  @override
  bool operator ==(Object other) => other is Size && other.inBytes == inBytes;

  @override
  int get hashCode => inBytes.hashCode;
}

悪い例

dart
class CustomSize implements Size {
  final int inBytes;
  const CustomSize(this.inBytes);

  int get inKilobytes => inBytes ~/ 1000;
}

悪い例

dart
import 'package:test/test.dart';
import 'size.dart';

class FakeSize implements Size {
  int inBytes = 0;
}

void main() {
  test('should not throw on a size >1Kb', () {
    expect(() => someFunction(FakeSize()..inBytes = 1001), returnsNormally);
  });
}

良い例

dart
class ExtendedSize extends Size {
  ExtendedSize(int inBytes) : super(inBytes);

  int get inKilobytes => inBytes ~/ 1000;
}

良い例

dart
import 'package:test/test.dart';
import 'size.dart';

void main() {
  test('should not throw on a size >1Kb', () {
    expect(() => someFunction(Size(1001)), returnsNormally);
  });
}

有効にする

#

avoid_implementing_value_types ルールを有効にするには、analysis_options.yaml ファイルの linter > rules の下に avoid_implementing_value_types を追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_implementing_value_types

代わりに YAML マップ構文を使用してリンター ルールを構成している場合は、linter > rules の下に avoid_implementing_value_types: true を追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    avoid_implementing_value_types: true