コンテンツ

avoid_implementing_value_types

コンテンツ

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

このルールは Dart 2.1 から利用可能です。

詳細

#

しないこと == をオーバーライドするクラスを実装すること。

== 演算子は、契約上、同値関係である必要があります。つまり、すべてのオブジェクト 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;
}

BAD

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

  int get inKilobytes => inBytes ~/ 1000;
}

BAD

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);
  });
}

GOOD

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

  int get inKilobytes => inBytes ~/ 1000;
}

GOOD

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 > rulesavoid_implementing_value_types を追加します。

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_implementing_value_types