Flutter Temiz Kod Prensipleri: Bölüm 1 💫 🌌 ✨
Tags: flutter, dart, cleancodeprinciples, fluttertest
Published: 2022-02-19 13:15:51

_It doesn’t require an awful lot of skill to write a program that a computer understands.
The skill is writing programs that human understand.
— Robert C. Martin_

## Bölüm 1 : İsimlendirme Kuralları ✨

**UpperCamelCase kullanılması gereken durumlar:**

Class isimleri, enum tipleri, typedef'ler ve tip parametreleri UpperCamelCase olmalıdır.

örnek: 

```
class SliderMenu { ... }

class HttpRequest { ... }

typedef Predicate<T> = bool Function(T value);
```

```
class Foo {
  const Foo([Object? arg]);
}

@Foo(anArg)
class A { ... }

@Foo()
class B { ... }
```

Extension (uzantı) adlarında da UpperCamelCase kullanılır.


```
extension MyFancyList<T> on List<T> { ... }
extension SmartIterable<T> on Iterable<T> { ... }
```


**lowercase_with_underscores kullanılması gereken durumlar:**

Kütüphane, paket, dizin ve kaynak dosyaları isimlendirirken lowercase_with_underscores biçimini kullanın.

Bazı dosya isimleri büyük/küçük harf duyarlı olmadığı için dosya adlarının tamamının küçük harf olması gerekir. Kelimeleri ayırmak içinse _ alt çizgi kullanabilirsiniz.

```
library peg_parser.source_scanner;

import 'file_system.dart';
import 'slider_menu.dart';
```

Kitaplık öneki belirtirken de lowercase_with_underscores kullanın.

```
import 'dart:math' as math;
import 'package:angular_components/angular_components' as angular_components;
import 'package:js/js.dart' as js;
```


**lowerCamelCase kullanılması gereken durumlar:**

Class üyeleri, üst düzey tanımlar, değişkenler, parametreler ve adlandırılmış parametreler isimlendirilirken ilk kelime dışındaki her kelimenin ilk harfini büyük olmalıdır.

```
var count = 3;

HttpRequest httpRequest;

void align(bool clearItems) {
  // ...
}
```

Costant'larınızı isimlendirirken de lowerCamelCase kullanın.


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

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


**SCREAMING_CAPS:**

Zaten kullanan bir dosyaya veya kitaplığa kod eklerken SCREAMING_CAPS biçimlendirmesini kullanın.


**İki harften uzun olan kısaltmaları büyük harfle yazın.**

```
class HttpConnection {}
class DBIOPort {}
class TVVcr {}
class MrRogers {}

var httpRequest = ...
var uiHandler = ...
var userId = ...
Id id;
```

**Kullanılmayan geri arama parametreleri için _, __, vb. kullanmayı tercih edin.**

Bu size bir değerin iletildiği ancak onu kullanmanız gerekmediği geri aramalarda (callbacks) yaygın bir kullanımdır.
Bu durumda, kullanılmayan parametreyi _ olarak adlandırmak iyi bir yoldur.
Fonksiyonda birden fazla kullanılmayan parametre varsa, ad çakışmalarını önlemek için ek alt çizgi kullanın: __, ___, vb.


```
futureOfVoid.then((_) {
  print('Operation complete.');
});
```

Bir diğer örnek:

`[1,2,3].map((_) => print('Hello'));`


Not: Bu yönerge yalnızca local ve anonim fonksiyonlar için geçerlidir.

Üst düzey fonksiyonlar ve method bildirimleri (method declarations) bu  bağlama sahip değildir, bu nedenle parametreleri kullanılmasa bile, her bir parametrenin ne için olduğu açık bir şekilde belirtilmelidir.


**Private olmayan tanımlayıcıları adlandırıken ismin başında alt çizgiyi kullanmayın:**

Dart, üyeleri ve üst düzey bildirimleri private olarak işaretlemek için bir tanımlayıcıda (identifier) önde gelen bir alt çizgi kullanır.

Kullanıcılar böylece bir _ alt çizgi gördüklerinde bunun bir private elaman olduğunu bilirler.

Local değişkenler, parametreler, local fonksiyonlar veya kitaplık önekleri için private kavramı yoktur. Bunlardan birinin alt çizgi ile başlayan bir adı olduğunda, okuyucuya kafa karıştırıcı bir sinyal gönderir. Bunu önlemek için, bu isimlerin başında alt çizgi kullanmayın.

Yanlış kullanım: `import 'dart:core' as _core;`

Doğru kullanım: `import 'dart:core' as core;`


Yanlış kullanım:

```
void print(String _name) {
  var _size = _name.length;
  ...
}
```

Doğru kullanım:

```
void print(String name) {
  var size = name.length;
  ...
}
```

**Ön ek harfleri kullanmayın**

Hungarian notasyonu ve diğer şemalar, derleyicinin kodunuzu anlamanıza yardımcı olmak için fazla bir şey yapmadığı BCPL zamanında ortaya çıkmıştır. Dart size bildirimlerinizin türünü, kapsamını, değişebilirliğini ve diğer özelliklerini söyleyebileceğinden, bu özellikleri tanımlayıcı adlarında belirtmenize gerek yoktur.

kullanın:  `defaultTimeout`

kullanmayın:  `kDefaultTimeout`


**Her bölüm'ü (section) boş bir satırla ayırın.**


**paket importlarını relative importlarından önce yapın**

Yanlış kullanım: 

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

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

Yanlış kullanım: 

```
import 'dart:html';  // OK
import 'package:bar/bar.dart';

import 'dart:async';  // LINT
import 'package:foo/foo.dart';
```


Doğru kullanım:

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

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

**Export'ları tüm import işlemlerinizden sonra ayrı bir bölümde belirtin (bir satır boşluk bırakarak)**

Yanlış kullanım:

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

Doğru kullanım:

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

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

**Bölümleri alfabetik olarak sıralayın**

Yanlış kullanım:

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

import 'foo/foo.dart';
import 'foo.dart';
```


Doğru kullanım:

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

import 'foo.dart';
import 'foo/foo.dart';
```


**Dart format kullanarak kodunuzu biçimlendirin**

**Tüm akış kontrol ifadeleri için küme parantezleri kullanın.**


Doğru kullanım:

```
if (isWeekDay) {
  print('Bike to work!');
} else {
  print('Go dancing or read a book!');
}
```

Tek satırlık sorgularda isterseniz küme parantezlerini atlayabilirsiniz.

`if (arg == null) return defaultValue;`


References:
https://dart.dev/tools/linter-rules#directives_ordering
https://dart.dev/guides/language/effective-dart/style
https://medium.com/upday-devs/basics-of-clean-code-flutter-project-ui-part-b7fa93c31775