6

Flutter Linter Kuralları Bölüm 2: Stil Kuralları 💫 🌌 ✨

 2 years ago
source link: https://dev.to/gulsenkeskin/flutter-linter-kurallari-bolum-2-stil-kurallari-3b16
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Bir önceki bölümde Linter kurallarının ilk grubu olan hata kurallarını öğrenmiştik. Bu bölümde ikinci grupta yer alan stil kurallarına değineceğiz.

Stil Kuralları:

always_declare_return_types

Fonksiyon veya method dönüş türlerini(return type) belirtin:

Bir method veya function oluştururken her zaman bir dönüş türü belirtin. Fonksiyonlar için dönüş türleri bildirmek, analyzer'ın çalışma zamanı sırasında oluşabilecek hatalar için kodunuzu daha iyi bir şekilde kontrol etmesine izin vererek kod tabanınızı iyileştirmeye yardımcı olur.

Yanlış kullanım:

main() { }

_bar() => _Foo();

class _Foo {
  _foo() => 42;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

void main() { }

_Foo _bar() => _Foo();

class _Foo {
  int _foo() => 42;
}

typedef predicate = bool Function(Object o);

Enter fullscreen mode

Exit fullscreen mode

always_put_control_body_on_new_line

Kontrol yapısını expression ifadesinden ayırın.

Bir if, for, while do'nun statement(ifade) kısmını kısa olsa bile expression ile aynı satıra koymayın. Bunu yapmak, orada ilgili kodun olduğunu netleştirmez. Bu, özellikle erken dönüşler (return'ler) için önemlidir.

Yanlış kullanım:

if (notReady) return;

if (notReady)
  return;
else print('ok')

while (condition) i += 1;

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

if (notReady)
  return;

if (notReady)
  return;
else
  print('ok')

while (condition)
  i += 1;

Enter fullscreen mode

Exit fullscreen mode

always_put_required_named_parameters_first

Required parametrelerinizi her zaman en başa koyun:

Yanlış kullanım: m({b, c, required a}) ;
Doğru kullanım: m({required a, b, c}) ;

Yanlış kullanım: m({b, c, @required a}) ;
Doğru kullanım: m({@required a, b, c}) ;

always_specify_types

Tip açıklamalarını belirtin. Mümkün olduğunca var kullanmaktan kaçının.
Türün bilinmediğini açıkça belirtmek istiyorsanız dynamic kullanın.

Yanlış kullanım:

var foo = 10;
final bar = Bar();
const quux = 20;

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

int foo = 10;
final Bar bar = Bar();
String baz = 'hello';
const int quux = 20;

Enter fullscreen mode

Exit fullscreen mode

annotate_overrides

Override edilen medhod ve field'lara açıklama ekleyin.

Yanlış kullanım:

class Cat {
  int get lives => 9;
}

class Lucky extends Cat {
  final int lives = 14;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

abstract class Dog {
  String get breed;
  void bark() {}
}

class Husky extends Dog {
  @override
  final String breed = 'Husky';
  @override
  void bark() {}
}

Enter fullscreen mode

Exit fullscreen mode

avoid_annotating_with_dynamic

Gerekli olmadığı durumlarda dynamic ile açıklama eklemekten kaçının.

Dinamik, bir fonksiyonun veya methodun varsayılan dönüş değeri olduğundan, genellikle buna açıklama eklemek gerekli değildir.

Yanlış kullanım:

dynamic lookUpOrDefault(String name, Map map, dynamic defaultValue) {
  var value = map[name];
  if (value != null) return value;
  return defaultValue;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

lookUpOrDefault(String name, Map map, defaultValue) {
  var value = map[name];
  if (value != null) return value;
  return defaultValue;
}

Enter fullscreen mode

Exit fullscreen mode

avoid_bool_literals_in_conditional_expressions

Koşullu ifadelerde (conditional expressions) bool kullanımından kaçının.

Yanlış kullanım:

condition ? true : boolExpression
condition ? false : boolExpression
condition ? boolExpression : true
condition ? boolExpression : false

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

condition || boolExpression
!condition && boolExpression
!condition || boolExpression
condition && boolExpression

Enter fullscreen mode

Exit fullscreen mode

avoid_catches_without_on_clauses

Yan tümce olmadan catch kullanımından kaçının.

Ön yan tümceleri olmadan catch kullanmak, kodunuzu atılamayan(thrown) (ve dolayısıyla fark edilmeyecek) beklenmedik hatalarla karşılaşmaya yatkın hale getirir.

Yanlış kullanım:

try {
 somethingRisky()
}
catch(e) {
  doSomething(e);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

 somethingRisky()
}
catch(e) {
  doSomething(e);
}
İYİ:

try {
 somethingRisky()
}
on Exception catch(e) {
  doSomething(e);
}

Enter fullscreen mode

Exit fullscreen mode

avoid_catching_errors

Hatayı veya onu implement eden türleri açıkça yakalamayın.

Hatalar, Exception'lardan farklıdır, çünkü Hatalar çalışma zamanından önce analiz edilebilir ve önlenebilir. Çalışma zamanında bir hatayı yakalamak (catch) neredeyse hiçbir zaman gerekmez.

Yanlış kullanım:

try {
  somethingRisky();
} on Error catch(e) {
  doSomething(e);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

try {
  somethingRisky();
} on Exception catch(e) {
  doSomething(e);
}

Enter fullscreen mode

Exit fullscreen mode

avoid_classes_with_only_static_members

Yalnızca statik üyeler içeren bir sınıf tanımlamaktan kaçının.

Yanlış kullanım:

class DateUtils {
  static DateTime mostRecent(List<DateTime> dates) {
    return dates.reduce((a, b) => a.isAfter(b) ? a : b);
  }
}

class _Favorites {
  static const mammal = 'weasel';
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

DateTime mostRecent(List<DateTime> dates) {
  return dates.reduce((a, b) => a.isAfter(b) ? a : b);
}

const _favoriteMammal = 'weasel';

Enter fullscreen mode

Exit fullscreen mode

avoid_double_and_int_checks

Double ve int kontrollerinden kaçoının.

JS'ye derlendiğinde integer değerler float olarak temsil edilir. Bu durum türün int veya double olduğu yerlerde, is or is'i kullanırken bazı beklenmedik davranışlara yol açabilir.

Yanlış kullanım:

f(num x) {
  if (x is double) {
    ...
  } else if (x is int) {
    ...
  }
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

f(dynamic x) {
  if (x is num) {
    ...
  } else {
    ...
  }
}

Enter fullscreen mode

Exit fullscreen mode

avoid_equals_and_hash_code_on_mutable_classes

@immutable olarak işaretlenmemiş sınıflarda aşırı yükleme operatörü (overloading) == ve hashCode kullanımından kaçının.

Bir sınıf immutable (değişmez) değilse, overloading operator (aşırı yükleme operatörü) == ve hashCode, koleksiyonlarda kullanıldığında öngörülemeyen ve istenmeyen davranışlara yol açabilir.

Yanlış kullanım:

class B {
  String key;
  const B(this.key);
  @override
  operator ==(other) => other is B && other.key == key;
  @override
  int hashCode() => key.hashCode;
}

Enter fullscreen mode

Exit fullscreen mode

Lint, @immutable notunun kullanımını kontrol eder ve sınıf başka türlü değiştirilemez olsa bile tetiklenir. Böylece:

Yanlış kullanım:

class C {
  final String key;
  const C(this.key);
  @override
  operator ==(other) => other is B && other.key == key;
  @override
  int hashCode() => key.hashCode;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

@immutable
class A {
  final String key;
  const A(this.key);
  @override
  operator ==(other) => other is A && other.key == key;
  @override
  int hashCode() => key.hashCode;
}

Enter fullscreen mode

Exit fullscreen mode

avoid_escaping_inner_quotes

Kesme işareti kullanmanız gerekiyorsa string ifadenizi " çift tırnak içerisinde yazın. Tek tırnak kullanmayın.

Yanlış kullanım: var s = 'It\'s not fun';
Doğru kullanım: var s = "It's not fun";

avoid_field_initializers_in_const_classes

Const sınıflarında field başlatıcılarını kullanmaktan kaçının.

Yanlış kullanım:

class A {
  final a = const [];
  const A();
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class A {
  get a => const [];
  const A();
}

Enter fullscreen mode

Exit fullscreen mode

avoid_final_parameters

Parametre bildirimlerinde final kullanmaktan kaçının.

Parametreleri final olarak bildirmek, özellikle “parameter_assignments” kuralı kullanılırken gereksiz şekilde ayrıntılı koda yol açabilir.

Yanlış kullanım:

void goodParameter(final String label) { // LINT
  print(label);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

void badParameter(String label) { // OK
  print(label);
}

Enter fullscreen mode

Exit fullscreen mode

Yanlış kullanım: void goodExpression(final int value) => print(value); // LINT

Doğru kullanım:void badExpression(int value) => print(value); // OK

Yanlış kullanım:void badExpression(int value) => print(value); // OK

Doğru kullanım:[1, 4, 6, 8].forEach((value) => print(value + 2)); // OK

avoid_function_literals_in_foreach_calls

Function literal ile forEach kullanımından kaçının.

Yanlış kullanım:

people.forEach((person) {
  ...
});

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

for (var person in people) {
  ...
}

people.forEach(print);

Enter fullscreen mode

Exit fullscreen mode

avoid_init_to_null

Değişkenleri null ataması yaparak başlatmaktan kaçının.

Dart'ta değer ataması yapılmayan bir değişken otomatik olarak null olarak başlatılır. Bu sebeple null ataması yapmak gereksizdir.

Yanlış kullanım:

int _nextId = null;

class LazyId {
  int _id = null;

  int get id {
    if (_nextId == null) _nextId = 0;
    if (_id == null) _id = _nextId++;

    return _id;
  }
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

int _nextId;

class LazyId {
  int _id;

  int get id {
    if (_nextId == null) _nextId = 0;
    if (_id == null) _id = _nextId++;

    return _id;
  }
}

Enter fullscreen mode

Exit fullscreen mode

avoid_js_rounded_ints

Yanlış kullanım: int value = 9007199254740995;

Doğru kullanım: BigInt value = BigInt.parse('9007199254740995');

avoid_multiple_declarations_per_line

Tek bir satırda birden çok değişken tanımlamayın.

Yanlış kullanım: String? foo, bar, baz;

Doğru kullanım:

String? foo;
String? bar;
String? baz;

Enter fullscreen mode

Exit fullscreen mode

avoid_null_checks_in_equality_operators

Null özel bir tür olduğundan, hiçbir sınıf ona eşdeğer olamaz. Bu nedenle, diğer örneğin boş olup olmadığını kontrol etmek gereksizdir.

Yanlış kullanım:

class Person {
  final String name;

  @override
  operator ==(other) =>
      other != null && other is Person && name == other.name;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class Person {
  final String name;

  @override
  operator ==(other) => other is Person && name == other.name;
}

Enter fullscreen mode

Exit fullscreen mode

avoid_positional_boolean_parameters

Konumsal bool parametrelerini kullanmaktan kaçının.

Konumsal boole parametreleri, çok belirsiz oldukları için kötü bir uygulamadır. Adlandırılmış boole parametrelerinin kullanılması, boole değerinin neyi temsil ettiğini tanımladığı için çok daha okunabilirdir.

Yanlış kullanım:

Task(true);
Task(false);
ListBox(false, true, true);
Button(false);

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

Task.oneShot();
Task.repeating();
ListBox(scroll: true, showScrollbars: true);
Button(ButtonState.enabled);

Enter fullscreen mode

Exit fullscreen mode

avoid_private_typedef_functions

Yalnızca bir kez kullanılan özel typedef fonksiyonlarından kaçının. Satır içi işlev sözdizimini (inline function syntax) tercih edin.

Yanlış kullanım:

typedef void _F();
m(_F f);

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:m(void Function() f);

avoid_redundant_argument_values

Gereksiz argüman değerlerinden kaçının.

Fonksiyon parametresinin default değerine karşılık gelen argümanlar göndermekten kaçının.

Yanlış kullanım:

void f({bool valWithDefault = true, bool? val}) {
  ...
}

void main() {
  f(valWithDefault: true);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

void f({bool valWithDefault = true, bool? val}) {
  ...
}

void main() {
  f(valWithDefault: false);
  f();
}

Enter fullscreen mode

Exit fullscreen mode

avoid_renaming_method_parameters

Override edilen methodların parametrelerini yeniden adlandırmayın.

Yanlış kullanım:

abstract class A {
  m(a);
}

abstract class B extends A {
  m(b);  <---
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

abstract class A {
  m(a);
}

abstract class B extends A {
  m(a);  <----
}

Enter fullscreen mode

Exit fullscreen mode

avoid_return_types_on_setters

Setter'larda dönüş türü belirtmekten kaçının.

Setter'lar bir değer döndürmediğinden, dönüş türü belirtmek gereksizdir.

Yanlış kullanım: void set speed(int ms);

Doğru kullanım: set speed(int ms);

avoid_returning_null

Dönüş türü bool, double, int veya num olan üyelerden null döndürmekten kaçının.

bool, double, int ve num gibi primitive (ilkel) türleri döndüren işlevlerin genellikle null olmayan değerler döndürmesi beklenir. Bu nedenle, primitive bir türün beklendiği yerde null döndürmek, runtime exception'larına (çalışma zamanı istisnalarına) yol açabilir.

Yanlış kullanım:

bool getBool() => null;
num getNum() => null;
int getInt() => null;
double getDouble() => null;

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

bool getBool() => false;
num getNum() => -1;
int getInt() => -1;
double getDouble() => -1.0;

Enter fullscreen mode

Exit fullscreen mode

avoid_returning_null_for_void

Void için null döndürmekten kaçının.

Yanlış kullanım:

void f1() {
  return null;
}
Future<void> f2() async {
  return null;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

void f1() {
  return;
}
Future<void> f2() async {
  return;
}

Enter fullscreen mode

Exit fullscreen mode

avoid_returning_this

this yerine cascade operator'ünü kullanın.

Yanlış kullanım:

var buffer = StringBuffer()
  .write('one')
  .write('two')
  .write('three');

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

var buffer = StringBuffer()
  ..write('one')
  ..write('two')
  ..write('three');

Enter fullscreen mode

Exit fullscreen mode

avoid_setters_without_getters

Karşılık gelen bir getter değeri olmadan bir setter tanımlamayın.

Yanlış kullanım:

class Bad {
  int l, r;

  set length(int newLength) {
    r = l + newLength;
  }
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class Good {
  int l, r;

  int get length => r - l;

  set length(int newLength) {
    r = l + newLength;
  }
}

Enter fullscreen mode

Exit fullscreen mode

avoid_shadowing_type_parameters

Shadowing tip parametrelerinden kaçının.

Yanlış kullanım:

class A<T> {
  void fn<T>() {}
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class A<T> {
  void fn<U>() {}
}

Enter fullscreen mode

Exit fullscreen mode

avoid_types_on_closure_parameters

Function expression parametreleri için açıklama türlerinden kaçının.
Function expression parametreleri için tür belirmek gereksizdir.

Yanlış kullanım:

var names = people.map((Person person) => person.name);

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

var names = people.map((person) => person.name);

Enter fullscreen mode

Exit fullscreen mode

avoid_unnecessary_containers

Gereksiz Contaimner kullanımından kaçının.

Bir Widget öğesini başka hiçbir parametre seti olmadan Container ile sarmanın hiçbir etkisi yoktur ve kodu gereksiz yere daha karmaşık hale getirir.

Yanlış kullanım:

Widget buildRow() {
  return Container(
      child: Row(
        children: <Widget>[
          const MyLogo(),
          const Expanded(
            child: Text('...'),
          ),
        ],
      )
  );
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

Widget buildRow() {
  return Row(
    children: <Widget>[
      const MyLogo(),
      const Expanded(
        child: Text('...'),
      ),
    ],
  );
}

Enter fullscreen mode

Exit fullscreen mode

avoid_unused_constructor_parameters

Constructor'larda kullanılmayan parametre tanımlamaktan kaçının.

Yanlış kullanım:

class BadOne {
  BadOne(int unusedParameter, [String unusedPositional]);
}

class BadTwo {
  int c;

  BadTwo(int a, int b, int x) {
    c = a + b;
  }
}

Enter fullscreen mode

Exit fullscreen mode

avoid_void_async

Void döndüren asenkron fonksiyonlardan kaçının.

Asenkron fonksiyonlarda geriye Future döndürün.

Yanlış kullanım:

void f() async {}
void f2() async => null;

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

Future<void> f() async {}
Future<void> f2() async => null;

Enter fullscreen mode

Exit fullscreen mode

await_only_futures

Await'e şu türlerde izin verilir: Future, FutureOr, Future?, FutureOr? ve dynamic.

Yanlış kullanım:

main() async {
  print(await 23);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kulllanım:

main() async {
  await null; // If a delay is really intended.
  print(23);
}

Enter fullscreen mode

Exit fullscreen mode

camel_case_extensions

Uzantıları UpperCamelCase kullanarak adlandırın.
Uzantılar adlandırılırken, her kelimenin ilk harfin büyük yazmalı (ilk kelime dahil) ve seperator (ayırıcı) kullanmamalıdır.

Doğru kullanım:

extension MyFancyList<T> on List<T> { 
  // ... 
}

extension SmartIterable<T> on Iterable<T> {
  // ...
}

Enter fullscreen mode

Exit fullscreen mode

camel_case_types

Sınıflar ve typedef'ler isimlendirilirken her kelimenin ilk harfin (ilk kelime dahil) büyük yazmalı ve seperator kullanmamalıdır.

Doğru kullanım:

class SliderMenu {
  // ...
}

class HttpRequest {
  // ...
}

typedef num Adder(num x, num y);

Enter fullscreen mode

Exit fullscreen mode

cascade_invocations

Aynı referans üzerinde art arda methodlar çağırırken cascading (basamaklı) stili kullanın.

Yanlış kullanım:

SomeClass someReference = SomeClass();
someReference.firstMethod();
someReference.secondMethod();

Enter fullscreen mode

Exit fullscreen mode

Yanlış kullanım:

SomeClass someReference = SomeClass();
...
someReference.firstMethod();
someReference.aProperty = value;
someReference.secondMethod();

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

SomeClass someReference = SomeClass()
    ..firstMethod()
    ..aProperty = value
    ..secondMethod();

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

SomeClass someReference = SomeClass();
...
someReference
    ..firstMethod()
    ..aProperty = value
    ..secondMethod();

Enter fullscreen mode

Exit fullscreen mode

cast_nullable_to_non_nullable

Nullable olmayan bir türe nullable bir değer atamayın.

Yanlış kullanım:

class A {}
class B extends A {}

A? a;
var v = a as B;
var v = a as A;

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class A {}
class B extends A {}

A? a;
var v = a! as B;
var v = a!;

Enter fullscreen mode

Exit fullscreen mode

constant_identifier_names

Constant isimlerinde lowerCamelCase kullanın.

Yanlış kullanım:

const PI = 3.14;
const kDefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');

class Dice {
  static final NUMBER_GENERATOR = Random();
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');

class Dice {
  static final numberGenerator = Random();
}

Enter fullscreen mode

Exit fullscreen mode

deprecated_consistency

@deprecated()'ı Tutarlı bir şekilde uygulayın :

bir sınıf kullanımdan kaldırılmışsa (deprecated), constructor'ları da kullanımdan kaldırılmalıdır.
Bir field kullanımdan kaldırılmışsa, ona işaret eden constructor parametresi de kullanımdan kaldırılmalıdır.
Bir field'a işaret eden bir constructor parametresi kullanımdan kaldırılmışsa, field da kullanımdan kaldırılmalıdır.

Yanlış kullanım:

@deprecated
class A {
  A();
}

class B {
  B({this.field});
  @deprecated
  Object field;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

@deprecated
class A {
  @deprecated
  A();
}

class B {
  B({@deprecated this.field});
  @deprecated
  Object field;
}

Enter fullscreen mode

Exit fullscreen mode

directives_ordering

dart: importlarını diğer importlardan önce yapın.

Yanlış kullanım:

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'dart:async';  // LINT
import 'dart:html';  // LINT

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

import 'dart:async';  // OK
import 'dart:html';  // OK

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

Enter fullscreen mode

Exit fullscreen mode

package: importlarını relative importlarından önce yapın.

Yanlış kullanım:

import 'a.dart';
import 'b.dart';

import 'package:bar/bar.dart';  // LINT
import 'package:foo/foo.dart';  // LINT

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

import 'package:bar/bar.dart';  // OK
import 'package:foo/foo.dart';  // OK

import 'a.dart';
import 'b.dart';

Enter fullscreen mode

Exit fullscreen mode

Tüm import 'lardan sonra export 'ları ayrı bir bölümde belirtin.

Yanlış kullanım:

import 'src/error.dart';
export 'src/error.dart'; // LINT
import 'src/string_source.dart';

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

import 'src/error.dart';
import 'src/string_source.dart';

export 'src/error.dart'; // OK

Enter fullscreen mode

Exit fullscreen mode

Alfabetik sıralamayı kullanın.

Yanlış kullanım:

import 'package:foo/bar.dart'; // OK
import 'package:bar/bar.dart'; // LINT

import 'a/b.dart'; // OK
import 'a.dart'; // LINT

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

import 'package:bar/bar.dart'; // OK
import 'package:foo/bar.dart'; // OK

import 'a.dart'; // OK
import 'a/b.dart'; // OK

Enter fullscreen mode

Exit fullscreen mode

do_not_use_environment

Environment tarafından bildirilen değişkenleri kullanmayın.

Derleme zamanında environment'dan türetilen değerlerin kullanılması, gizli global durum yaratır ve uygulamaların anlaşılmasını ve sürdürülmesini zorlaştırır.

fromEnvironment veya hasEnvironment factory constructor'larını kullanmayın.

Yanlış kullanım:

const loggingLevel =
  bool.hasEnvironment('logging') ? String.fromEnvironment('logging') : null;

Enter fullscreen mode

Exit fullscreen mode

empty_catches

Boş catch bloklarını kullanmaktan kaçının.

Genel olarak, boş catch bloklarını kullanmaktan kaçının. Bunun gerektiği durumlarda exception'ların neden yakalanıp bastırıldığını açıklamak için bir yorum yapılmalıdır. Alternatif olarak, exception tanımlayıcı (exception identifier), onu atlamak istediğimizi belirtmek için alt çizgilerle (örneğin, _) adlandırılabilir.

Yanlış kullanım:

try {
  ...
} catch(exception) { }

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

try {
  ...
} catch(e) {
  // ignored, really.
}

// Alternatively:
try {
  ...
} catch(_) { }

// Better still:
try {
  ...
} catch(e) {
  doSomething(e);
}

Enter fullscreen mode

Exit fullscreen mode

empty_constructor_bodies

Boş constructor gövdeleri yerine {} kullanın.

Dart'ta, boş bir gövdeye sahip bir constructor yalnızca noktalı virgülle sonlandırılabilir. Bu const constructor'ları için gereklidir. Tutarlılık ve kısalık için diğer constructor'lar da bunu yapmalıdır.

Doğru kullanım:

class Point {
  int x, y;
  Point(this.x, this.y);
}

Enter fullscreen mode

Exit fullscreen mode

Yanlış kullanım:

class Point {
  int x, y;
  Point(this.x, this.y) {}
}

Enter fullscreen mode

Exit fullscreen mode

eol_at_end_of_file

Dosya sonlarına yeni bir satır koyun.
Boş olmayan dosyaların sonuna tek bir yeni satır koyun.

Yanlış kullanım:

a {
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

b {
}
    <-- newline

Enter fullscreen mode

Exit fullscreen mode

exhaustive_cases

Enum benzeri sınıflardaki tüm constant'lar için durum yan tümceleri (case clauses) tanımlayın.

Yanlış kullanım:

class EnumLike {
  final int i;
  const EnumLike._(this.i);

  static const e = EnumLike._(1);
  static const f = EnumLike._(2);
  static const g = EnumLike._(3);
}

void bad(EnumLike e) {
  // Missing case.
  switch(e) { // LINT
    case EnumLike.e :
      print('e');
      break;
    case EnumLike.f :
      print('f');
      break;
  }
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class EnumLike {
  final int i;
  const EnumLike._(this.i);

  static const e = EnumLike._(1);
  static const f = EnumLike._(2);
  static const g = EnumLike._(3);
}

void ok(EnumLike e) {
  // All cases covered.
  switch(e) { // OK
    case EnumLike.e :
      print('e');
      break;
    case EnumLike.f :
      print('f');
      break;
    case EnumLike.g :
      print('g');
      break;
  }
}

Enter fullscreen mode

Exit fullscreen mode

file_names
Bu makalede ayrıntılı olarak açıklandı.

implementation_imports

Uygulama dosyalarını başka bir paketten import etmeyin.

lib içindeki kitaplıklar herkese açıktır: diğer paketler bunları import etmekte serbesttir. Ancak bir paketin kodunun çoğu, yalnızca paketin kendisi tarafından import edilip kullanılması gereken dahili uygulama kitaplıklarıdır. Bunlar, lib'nin src adlı bir alt dizinine girer. İşleri düzenlemenize yardımcı olacaksa, orada alt dizinler oluşturabilirsiniz.

Aynı paketteki diğer Dart kodunun içinden lib/src'de yaşayan kitaplıkları içe aktarmakta özgürsünüz (lib'deki diğer kitaplıklar, bin içindeki komut dosyaları ve testler gibi) ancak asla başka bir paketin lib/src dizininden içe aktarmamalısınız. Bu dosyalar paketin genel API'sinin bir parçası değildir ve kodunuzu bozabilecek şekillerde değişebilirler.

Yanlış kullanım:

// In 'road_runner'
import 'package:acme/lib/src/internals.dart;

Enter fullscreen mode

Exit fullscreen mode

join_return_with_assignment

Mümkün olduğunda return deyimini atama ile birleştirin.

Yanlış kullanım:

class A {
  B _lazyInstance;
  static B get instance {
    _lazyInstance ??= B(); // LINT
    return _lazyInstance;
  }
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class A {
  B _lazyInstance;
  static B get instance => _lazyInstance ??= B();
}

Enter fullscreen mode

Exit fullscreen mode

leading_newlines_in_multiline_strings

Çok satırlı dizeleri yeni satırla başlatın.

Çok satırlı dizeler, yeni bir satırla başladıklarında okunması daha kolaydır (çok satırlı bir dizeyi başlatan yeni satır yok sayılır).

Yanlış kullanım:

var s1 = '''{
  "a": 1,
  "b": 2
}''';

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

var s1 = '''
{
  "a": 1,
  "b": 2
}''';

var s2 = '''This one-liner multiline string is ok. It usually allows to escape both ' and " in the string.''';

Enter fullscreen mode

Exit fullscreen mode

library_private_types_in_public_api

Genel API'lerde özel türleri kullanmaktan kaçının.

Yanlış kullanım:

f(_Private p) { ... }
class _Private {}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

f(String s) { ... }

Enter fullscreen mode

Exit fullscreen mode

line_longer_than_80_chars

80 karakterden uzun satırlardan kaçının.

no_default_cases

Kötü kullanım:

  switch (testEnum) {
    case TestEnum.A:
      return '123';
    case TestEnum.B:
      return 'abc';
    default:
      return null;
  }

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

  switch (testEnum) {
    case TestEnum.A:
      return '123';
    case TestEnum.B:
      return 'abc';
  }
  // Default here.
  return null;

Enter fullscreen mode

Exit fullscreen mode

no_runtimeType_toString

runtimeType üzerinde "toString()" çağrısı yapmaktan kaçının.

Bir çalışma zamanı türünde toString'i çağırmak, performansı olumsuz yönde etkileyebilecek önemsiz bir işlemdir. Bundan kaçınmak daha iyidir.

Yanlış kullanım:

class A {
  String toString() => '$runtimeType()';
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class A {
  String toString() => 'A()';
}

Enter fullscreen mode

Exit fullscreen mode

Bu durumun geçerli olmadığı performansın sorun olmadığı veya real type bilgilerinin performanstan daha önemli olduğu bazı istisnalara sahiptir:

assertion
throw expressions (atma ifadelerinde)
catch clauses (yakalama cümleciklerinde)
mixin declaration
abstract class (soyut sınıfta)

null_closures

Closure (kapanmanın) beklendiği bir argüman olarak null iletmeyin.

Yanlış kullanım: [1, 3, 5].firstWhere((e) => e.isOdd, orElse: null);

Doğru kullanım: [1, 3, 5].firstWhere((e) => e.isOdd, orElse: () => null);

omit_local_variable_types

Local değişkenler için tür açıklamalarını atlayın.

Local değişkenler, özellikle fonksiyonların küçük olma eğiliminde olduğu modern kodda çok az kapsama sahiptir. Türün atlanması, okuyucunun dikkatini değişkenin ismine ve onun başlangıç ​​değerine odaklar.

Yanlış kullanım:

List<List<Ingredient>> possibleDesserts(Set<Ingredient> pantry) {
  List<List<Ingredient>> desserts = <List<Ingredient>>[];
  for (final List<Ingredient> recipe in cookbook) {
    if (pantry.containsAll(recipe)) {
      desserts.add(recipe);
    }
  }

  return desserts;
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

List<List<Ingredient>> possibleDesserts(Set<Ingredient> pantry) {
  var desserts = <List<Ingredient>>[];
  for (final recipe in cookbook) {
    if (pantry.containsAll(recipe)) {
      desserts.add(recipe);
    }
  }

  return desserts;
}

Enter fullscreen mode

Exit fullscreen mode

Bazen çıkarsanan tür, değişkenin sahip olmasını istediğiniz tür değildir. Örneğin, daha sonra başka türlerin değerlerini atamayı düşünebilirsin. Bu durumda, değişkene istediğiniz türde açıklama ekleyin.

Widget build(BuildContext context) {
  [!Widget!] result = Text('You won!');
  if (applyPadding) {
    result = Padding(padding: EdgeInsets.all(8.0), child: result);
  }
  return result;
}

Enter fullscreen mode

Exit fullscreen mode

one_member_abstracts
Basit bir fonksiyon kullanılacaksa tek üyeli bir abstract (soyut ) sınıf tanımlamaktan kaçının.

Yanlış kullanım:

abstract class Predicate {
  bool test(item);
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım: typedef Predicate = bool Function(item);

only_throw_errors

Yalnızca istisna (exception) veya Hata'yı genişleten (extending) sınıfların örneklerini atın.

Yalnızca dart.core.Error veya dart.core.Exception'ı genişleten sınıf örnekleri atın.

Hata veya istisna'yı extend etmeyen örnekler atmak kötü bir uygulamadır.

Yanlış kullanım:

void throwString() {
  throw 'hello world!'; // LINT
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

void throwArgumentError() {
  Error error = ArgumentError('oh!');
  throw error; // OK
}

Enter fullscreen mode

Exit fullscreen mode

overriden_fields

Field'ları override etmeyin.

Yanlış kullanım:

class Base {
  Object field = 'lorem';

  Object something = 'change';
}

class Bad1 extends Base {
  @override
  final field = 'ipsum'; // LINT
}

class Bad2 extends Base {
  @override
  Object something = 'done'; // LINT
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

class Base {
  Object field = 'lorem';

  Object something = 'change';
}

class Ok extends Base {
  Object newField; // OK

  final Object newFinal = 'ignore'; // OK
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

abstract class BaseLoggingHandler {
  Base transformer;
}

class LogPrintHandler implements BaseLoggingHandler {
  @override
  Derived transformer; // OK
}

Enter fullscreen mode

Exit fullscreen mode

package_api_docs
Tüm public API'ler için belge yorumları sağlayın.

Public (genel) API'ler, paketinizin lib klasöründeki her şeyden, lib/src'deki uygulama dosyalarının çıkarılmasından ve bir dışa aktarma yönergesiyle açıkça dışa aktarılan öğelerin eklenmesinden oluşur.

Örneğin lib/foo.dart:

export 'src/bar.dart' show Bar;
export 'src/baz.dart';

class Foo { }

class _Foo { }

Enter fullscreen mode

Exit fullscreen mode

Tüm public API üyeleri, ///belge-stili yorumlarla ( doc-style comments) belgelenmelidir.

Yanlış kullanım:

class Bar {
  void bar();
}

Enter fullscreen mode

Exit fullscreen mode

Doğru kullanım:

/// A Foo.
abstract class Foo {
  /// Start foo-ing.
  void start() => _start();

  _start();
}

Enter fullscreen mode

Exit fullscreen mode

References:
https://dart.dev/tools/linter-rules#style-rules


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK