0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi Veriyorum #5

Gauloran

Kıdemli Moderatör
7 Tem 2013
8,119
599
local
Merhaba 0'dan İleri Seviyeye Mobil Uygulama geliştirme serimize 5.konu ile devam ediyoruz. Serimizin önceki konularını aşağıdaki linklerden inceleyebilirsiniz:

0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi Veriyorum #1
0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi Veriyorum #2
0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi Veriyorum #3
Dart dilinde Map Yapılarına Giriş
0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi Veriyorum #4

5.konumuzla devam edelim ve direkt olaya dalalım. En son get set falan demiştik. Bunların kullanımı sınıf içerisinde basitçe şu şekilde:
dartta herhangi bir class içerisinde _ şeklinde tanımlarsak burada id de yaptığımız gibi, evet private ama sadece file private yani bu file içerisindeki herhangi bir kişi bu id yi görebilir
peki biz bunu da göstermek istemiyorsak, ayrı bir file da yapmamız gerekirdi bu sınıfı. genelde sektörde models diye bir klasör açılır ve oraya user_model.dart diye bir file açılır orada da bu class User {} kodlarımızın hepsi komple o dosyada tutulur. böylece enkapsüle etmiş oluyoruz yani id nin erişimini kapatmış oluyoruz. bundan bahsetmiştik.


Kod:
class User{
  late final String name;
  int _money;
  late final int? age;
  late final String? city;
  late final String _id;

  User(this.name,this._money,{required String id, this.age, this.city}){
    _id=id;
  }

  bool isSpecialUser(String id){
    return _id == id; //siniftaki _id bu fonksiyona parametre olarak gelen String e eşitse true doner bu sekilde
  }

  bool isEmtpyId(){
    return _id.isEmpty;
  }

  bool isEmptyId() => _id.isEmpty;

  //get ve set mevzusuna bakalım

  int get money => money; //yani money i geri döndüreceksin demiş olduk

  set money(int money){ //bu da setimiz yani private yaptığımız _money e başka bir dosyadan erişip ona değer atamamıza yarar
    _money=money;
  }


}

yani ozetle user1.money = 5; bu sekilde atama yaptigimizda moneye otomatik olarak set money e gidecek oradaki islem yapilacak.

tabii bu tarz bir kontrol işlemi yaptığımızda her zaman aklımıza gelmesi gereken şey şu olmalı kısa pratik yazma muhabbeti
_money = money == null ? 0 : money; örneğin bunun gibi eğer _money nullsa 0 koy değilse money de ne varsa onu koy demiş oluruz misal.

getter ve setterlar önemlidir. bunların hepsi birleştiğinde kafamızda da bu mantık oturuyor. class mantığını anlamamız önemli. herhangi bir nesnede toString() noSuchMethod() benzeri metodlar görebiliriz. user1.toString(); dediğimizde instance of user1 verir bize. yani oradan bir nesne oluşturuldu anlamına geliyor. Dartta bütün objeler gözükmese de başka bir yerden türüyor. Object'ten geliyor bunlar. bu nedenle toString() i mevcut hepsinin. Şimdi o kısma gelelim burada extends ile karşılaşacağız.

Kod:
void main() {}

class User {
    final String name;
    final String money;
  
    User(this.name, this.money);
}

class BankUser {
    final String name;
    final String money;
    final int bankingCode;
  
    BankUser(this.name,this.money, this.bankingCode);
}

class SpecialUser{
    final String name;
    final String money;
    final int bankingCode;
    final int discount;
  
    SpecialUser(this.name, this.money, this.bankingCode, this.discount);
}

ABSTRACT CLASS

diyelim ki elimizde böyle sınıflarımız var. şimdi her sınıf için yukarıda yaptığımız benzer bir fonksiyon oluştursak mesela işte money'in değerini bize söylesin bu fonksiyon oluşturulan user1 nesnesi için misal. e şimdi o kadar sınıf oluşturduk bunların hepsinde money özelliği var e her sınıfa yazacak mıyız bunu tek tek sürekli aynı fonksiyonu? tabii ki de hayır. çünkü hepsinde olması gereken bir durum varsa o zaman burada bizim flutter ve dart tarafında çok kullanacağımız abstract class kavramı çıkacak. soyut sınıf oluşturmak basittir.

Kod:
abstract class IUser{
    void sayMoneyWithCompanyName(){
        print("Ahmet- $money paranız vardir");
    }
}

şimdi artık aşağıdaki örneğin user sınıfını IUser soyut sınıfından türetirsek artık şöyle bir hal olacak:

Kod:
class User extends IUser {
    final String name;
    final String money;
  
    User(this.name, this.money);
}

artık User sınıfı için IUser sınıfındaki bir metodu kullanabilir halde olacağız. Şimdi kodlarımızı biraz daha düzenlersek şöyle olacak:

Kod:
abstract class IUser {
  final String name;
  final int money;

  IUser(this.name, this.money);

  void sayMoneyWithCompanyName() {
    print("Ahmet- $money paranız vardir");
  }
}

class User extends IUser {
  final String name;
  final int money;

  User(this.name, this.money) : super(name, money);
/*
sen bir sınıftan extends etmişsin yani türetmişsin o sınıftan. ve bu sınıftan nesne oluşturulduğunda
o sınıfın constructorını çalıştırıp name ve money i alıp buraya aktarması için super kullandık
*/
}

class BankUser extends IUser {
  final String name;
  final int money;
  final int bankingCode;

  BankUser(this.name, this.money, this.bankingCode) : super(name, money);

  void bankSpecialLogic() {
    print(money);
  }
}

class SpecialUser {
  final String name;
  final String money;
  final int bankingCode;
  final int discount;

  SpecialUser(this.name, this.money, this.bankingCode, this.discount);
}

ama hala sorunlar var. kodları biraz daha düzenleyelim:

Kod:
void main() {
  final usersBank = BankUser("Özgür", 100, 321231);
  usersBank.sayMoneyWithCompanyName();
}

abstract class IUser {
  final String name;
  final int money;

  IUser(this.name, this.money);

  void sayMoneyWithCompanyName() {
    print("Ahmet- $money paranız vardir");
  }
}

class User extends IUser {
  final String name;
  final int money;

  User(this.name, this.money) : super(name, money);
/*
sen bir sınıftan extends etmişsin yani türetmişsin o sınıftan. ve bu sınıftan nesne oluşturulduğunda
o sınıfın constructorını çalıştırıp name ve money i alıp buraya aktarması için super kullandık
*/
}

class BankUser extends IUser {
  final int bankingCode;

  BankUser(String name, int money, this.bankingCode) : super(name, money);
  //yani git üst sınıftan name ve money i getir buradaki name money e at demiş olduk pratik olarak

  void bankSpecialLogic() {
    print(money);
  }
}

class SpecialUser extends IUser {
  final String name;
  final int money;
  final int bankingCode;
  late final int _discount;

  SpecialUser(this.name, this.money, this.bankingCode, this._discount)
      : super(name, money);

  int get calculateMoney => money - (money ~/ _discount);
  /*
  eğer parametre almıyorsa direkt => şeklinde yazarız tek satirlik islem zaten
  ve yine parametre almadigi icin get yazdik basina getter yapmis olduk
   */
}

EXTENDS

extends gibi olan farklı bir kavramımız daha var ona da bakalım:

Kod:
void main() {}

abstract class IStudent {
  final String name;
  final String age;

  IStudent(this.name, this.age);

  void saySomething() {
    print("something");
  }
}

class Student implements IStudent {

  @override
  // TODO: implement age
  String get age => throw UnimplementedError();

  @override
  // TODO: implement name
  String get name => throw UnimplementedError();

  @override
  void saySomething() {
    // TODO: implement saySomething
    print("farkli bir sey soyluyorumm");
  }


}

class Student2 {
  final String name;
  final String age;

  Student2(this.name, this.age);
}

yani özetle eğer extends edersek farklı özelliklere sahip olabilir ama implements edersek eksik metodun var ekle eklemek override etmek zorundasın diyor ana sınıfın alt dallarının hepsini kullansın istiyorsak implements kullanabiliriz diyebiliriz.

extends değil de implements kullandıysak bize der override etmen gereken metodlar var diye o metodları override et bakalım. yani override et derken o metodlari kullan diye düşünebilirsiniz

şimdi enum'a bakalım nedir bu ENUM?

ENUM

Kod:
void main() {
  //! ben bir mouse alacağım müşteri olarak mesela
  //! mouse un da a4 olmasını istiyorum
  final customerMouses = Mouses.a4; //! bu şekilde kullanabiliyoruz
  print(customerMouses.index); //! a4 ün indexini verir yani 3

  if (customerMouses == Mouses.a4) {
    print("bir şey bir şey");
  }

  //! enum bizim için performanslı oluyor direkt olarak "a4" şeklinde kontrol yapmak yerine kesinlikle

  switch (customerMouses) {
    case Mouses.magic:
      // TODO: Handle this case.
      break;
    case Mouses.apple:
      // TODO: Handle this case.
      break;
    case Mouses.logitech:
      // TODO: Handle this case.
      break;
    case Mouses.a4:
      // TODO: Handle this case.
      break;
  }
}

enum Mouses {
  magic,
  apple,
  logitech,
  a4,
}

artık fazla açıklamıyorum çünkü seriyi baştan buraya kadar takip edenler kodları inceleyerek anlayabilir seviyede oldunuz artık buraya kadar gelen kendini tebrik edip bir çay kahve koyabilir masaya çünkü bitti mi bitmedi Extension ile devam ediyoruz

şu enumlı kısmı biraz daha güncelleyelim muhtemelen aşağıdaki kodları incelediğinizde anlamayacaksınız ama ondan sonra verdiğim kod bloğunu inceleyip tekrar buraya gelip incelerseniz heee diyeceksiniz:

Kod:
enum Mouses {
  magic,
  apple,
  logitech,
  a4,
}

//burasi extension ile ilgili he bu arada enuma metod katamazsın
//bunun için enumlarda bu tarz bir uzantılı kullanım yapmak istiyorsak
//yapmamız gereken şey enum için bir sınıf oluşturma ki onu yaptık zaten en altta
extension MousesSelectedExtension on Mouses {
  Mouse createMouse(String name) {
    return Mouse(this, name); //ardından en alttaki sınıftan bir nesne oluşturup döndürür
  }
}

class Mouse {
  final Mouses type; //Mouse sınıfına Mouses enum türünde type adinda bir sey tanimladik.
  String name;

  Mouse(this.type, this.name);
}

şimdi biraz açıklayalım extension mevzusunu:

EXTENSION

User'a bir uzantı ekliyoruz aslında yani aslında bunun bir statik fonksiyondan farkı
çok olmasa da özellikle dartta da çok güçlü ama swift tarafında daha fazla kullanılıyor
bazı durumlarda çok iş görebiliyor şimdilik aktif kullanmayacak olsak da.

Kod:
class User {
  String? name;

  User(this.name);

  void saySomething() {
    print("hello");
  }
}

extension UserControlExtension on User {
  /*

   */

  void controlName() {
    this.saySomething(); //! bu şekilde erişilebiliyor saySomething fonksiyonuna
  }
}

daha farklı ve aynı mantık bir kullanım yapalım extension muhabbetiyle ilgili

Kod:
void main(List<String> args) {
  //şimdi normalde 'ali' diye bir string tanımlasak bu stringimizden sonra . koysak baksak aradığımız özelliği metodu bulamayabiliriz bu durumda extensionı kullanabiliriz
  //fonksiyonumu yazdıktan sonra geldim buraya bakıyorum
  "mehmet"
      .isAdmin(); //bu şekilde kullanabiliyoruz artık. yani aslında string sınıfımıza bir uzantı ekleyerek yeni bir şey kazandırdık
}

extension StringUserCheckExtension on String {
//işte String sınıfından bir uzantı oluşturduk StringUserCheckExtension adında

  bool isAdmin() {
    //bool değer döndüren isAdmin adında bir fonksiyon var burada
    return this.toLowerCase() ==
        "admin"
            .toLowerCase(); //kullanıldığı şeyin toLowerCase ini alıyor yani küçük harfe dönüştürüyor ve "admin" stringinin küçük harfe dönüştürülmüş haliyle kontrol ediyor aynı mı diye admin yazıyor mu diye
    //eğer evetse true hayırsa false döndürüyor fonksiyonumuz olayı bu kadar
  }
}

Bir sonraki konumuzda ileri seviye class yapılarıyla devam edeceğiz bu konuda soyut sınıflardan, extends, implements, enum, extension kavramlarından bahsettik. Dart tarafında çalışmamız gereken hala konular var serinin devamında da önümüzdeki konular Dart ile ilgili olmaya devam edecek henüz Flutter'a geçiş yapamadık ilerleyen konularda elbette geçeceğiz.

Değerli yorumlarınızı bekliyorum, kendinize iyi bakın
bir de iyi bayramlar <3 Gauloran​
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.