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

Gauloran

Global Moderatör
7 Tem 2013
8,127
619
64r6iny.png




Merhaba 0'dan İleri Seviyeye Mobil Uygulama Geliştirme Eğitimi serimizin 4.konusundayız. Serinin önceki konularını incelemek için:

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

Bu konuda Sınıf ve Constructor kavramından bahsedeceğiz devamında da bir şeylerden bahsederiz muhtemelen şu anda tam kestiremiyorum çalışırken aklımıza gelir. Seriden başlayalım. Sınıflara başlamadan önce bir önceki konularda yaptığımız örnekleri hatırlayacak olursak sınıf kullanmadan bu tarz örnekleri yapmak işkenceydi.

Kod:
//müşterimizin adı var parası var yaşı var örneğin
  final int customerMoney = 50;
  final String customerName = "veli";
  final int customerAge = 13;
  //müşterimizin yaşı 10 dan büyükse bir işlem yapalım
  if(customerAge>10){
    print("alışveriş yapabilirsiniz");
  } else{
    print("alışveriş yapamazsınız");
  }

SINIFLAR
yeni bir müşteri geldi diyelim yine aynı kontrol isteniyor diyelim e yukarıdaki kodları tekrar kopyala yapıştır mı yapacağız?
hayır dediğinizi duyar gibiyim peki ne yapmalıyız? şu ana kadar serimizi takip edenler fonksiyon kullanarak basit bir şekilde çözebiliriz diyebilirsiniz evet haklısınız ama
çok daha efektif bir yöntem var. çözüm üretmek yazılımda her şeydir. çözümü ürettikten sonra bu yaptığım çözüm gelişebilir mi bunları tartışmamız gerekli.
diyelim yaptık kontrolleri kodları falan fakat müşterilerin şehirlerini unutmuşuz şehir ekleyip ona göre kontrol etmemiz lazım mesela hop bütün kodlar gitti şimdi oraya tek tek ekle falan özetle çok uğraşırız ve buna gerek yok çünkü bugün o büyük gün geldi ve sınıflara giriş yapacağız.
yani bu müşterileri gruplayıp kümelesek aynı özellikleri aynı şekilde gösterebilse diyoruz yani SINIFLAMA sayesinde yazılımlarımız harika hale gelmiş oluyor
mesela biz değişken tanımlarken int yas = 15; diyoruz buradaki int dediğimiz şey de bir class yani bir sınıftır aslında, bir sınıf oluşturduğumuzda çok daha iyi anlayacaksınız

Bir sınıf oluşturalım:

ana fonksiyonumuzun tabii ki dışına çıkıyoruz bir sınıf oluşturmak için:

Kod:
class User{
  //User isminde bir sınıf oluşturduk
  late final String name;
  late final int money;
  late final int age;
  String? city;

sonradan değeri gelecek manasına gelen late kullanımı önemli.
eğer late final dersek final son dakkadaki değerini aldığı için constructorda kullanmamız gerekiyor.
değer üretildi --> değeri alıyor ve bir daha değeri değişmiyor. mantığında olduğu için

CONSTRUCTOR NEDİR?

Constructor nedir daha pratik yazabilirdik ama mantığını anlamamız açısından bakalım
şimdi biz bir sınıf oluşturduk ve bu sınıfın özelliklerini yukarıda verdik. late yazmamızın sebebi bunlar ilk başta null ama sonradan değer alacak bunlar diye darta belirtmiş oluyourz
late yazmazsak hata verirdi ama late yazmak yerine örneğin name = ""; de yapabilirdik yani ilk değerini verirdik null olmaması için ama o da doğru bir çözüm yöntemi değil
Bu sınıftan bir nesne oluşturulduğunda yani bu ne demek? örneğin User sınıfına ait bir nesne oluştuğunda bu nesnenin adı da user1 olsun
user1 nesnesinin özellikleri user1.name, user1.money, user1.age, user1.city diyerek erişebileceğiz. İşte constructor kavramı da bu sınıftan bir nesne oluşturulduğunda
constructor çalışır ve aşağıda yazmışız constructorımızın ne yaptığını.

Kod:
User(String name, int money, int age, String city){
    this.name = name;
    this.money = money;
    this.age= age;
    this.city = city;
  }

Default constructorımız bu sınıfla aynı adı alan bir fonksiyon ve parametrelerine bakacak olursak name, money, age ve city parametreleri var
ve this.name = name; demişiz yani User sınıfından bir nesne oluşturulduğunda örneğin user1 nesnesi oluştuğunda user1 nesnesini oluştururken biz name ini vereceğiz String olarak
ve bu constructor çalışacak ve bizim verdiğimiz o Stringi user1.name özelliğine atayacak işte constructor buna yarıyor.

yukarıdaki constructorda String city i {} içerisine alırsak opsiyonel parametre vermiş oluruz istersek onun değerini koymadan nesne oluşturabiliriz yani
ama öyle yapıp soluna required yazarsak kesinlikle vermemiz gerekli olur ve ismini de verirken : koyup yazmamız gerekir

Constructorımızı anlayalım diye detaylı yazdık normalde pratik olsun diye şöyle yazarız:

Kod:
User(this.name, this.money, {this.age, this.city}); //diyerek de pratik bir constructor yazımı yapabilirdik.

NULL SAFETY ?

her sınıfın içerisinde özellikleri olur onları tanımlamalıyız öncelikle.
dart dili baştan sona oop bir dildir nesneleri koruyan bir dildir bu ne demek?
biz sürekli bir değişken tanımladık ve değerine göre çeşitli çalışmalar yaptık. misal değer atamadığımız bir değişken oluşturduğumuzda
int newMoney;
dart dilinde bir değişkene herhangi bir değer atamazsak null olarak kabul eder. yani dart bizi kontrol ediyor aslında hiçbir nesneyi başıboş tanımlayamazsın
adam akıllı yazacaksın diyor bize. ilk değerini ata başlangıç değerini ver ya da oluşturduğun değişkene ? at ki dart dilinde bunun anlamı bu değişkenin null olabileceğini dart diline belirtmiş oluyoruz
bak bu null dönebilir diye olabilitesi var demiş oluyoruz darta. null neden önemli peki? null safety zaten farklı yerlerde değişeceğiz buna. ilerde servis kodlarımızda datalar çekeceğiz vs çeşitli işlemler yapacağız
api katmanlarıyla çalışırken diyelim bir servise istek attık ve servisten her zaman cevap gelmeyebilir belki de işte biz burada gelmeyebilir derken ? koyduğumuzda bunu hatırlayın null olabilir demiş oluyoruz
! işaretinin de anlamı darta biz allah çarpsın bu nesne gelecek demiş oluyoruz yani bu değer gelecek null olmayacak sıkıntı yok diyoruz darta. olay tamamen bu bunlar ne ya böyle diyorsanız devam edin takılmayın devam anlayacaksınız

Kod:
int? yeniPara;
  if(yeniPara != null){
    print(yeniPara+5);
  }else{
    print(10+10);
  }

yani yaptığımız şey yeniPara diye bir değişken oluşturduk ve darta ? diyerek bu null olabilir dedik
ardından bir if else kontrol yapısını kullandık yeniPara null değilse yeniPara+5 i ekrana bas dedik yok eğer nullsa 10+10 yap iki türlü de patlamıyoruz program çalışacak yani
ama eğer biz else kısmına da yeniPara yazsaydık değer null olduğu için program patlayacaktı
yani bir nesnein nullable durumu bunları kontrol edersek projelerimiz ve yazılımlarımız güçlü olur.

Kod:
List <int?> listee = [100, null, 200,300, null];
  //bir listee adında list oluşturduk ve bunun elemanlarının null olabilirliğini ? diyerek söylemiş olduk

  //sınıfımızdan nesne oluşturallım
  User user1 = User("mehmet", 15, 18, "Kocaeli");

  //kontrol yapalım kafamıza gore ornek olsun diye

  if(user1.city == null){
    print("müşteri bu bilgiyi vermemiş");
  }else{
    if(user1.city =="Kocaeli"){
      print("kullanıcı 1 ${user1.city}");
    }
  }

Şimdi farklı bir dart dosyası açalım temiz bir şekilde baştan bakalım olaya:

Kod:
void main(){

  User user1 = User("ali", 15, id: "ilkMusteri", age: 15, city: "Kocaeli");


}

class User{
  late final String name;
  late final int money;
  late final int? age;
  late final String? city;
  final String id;

  User(this.name,this.money,{required this.id, this.age, this.city});

}

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.

Güncellediğimiz hal şöyle _ olayıyla ilgili:

Kod:
class User{
  late final String name;
  late final 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;
  }

Şimdi ayrı bir dosyaya aldık sınıfımızı sonra main fonksiyonumuzun üstüne şöyle import ettik ki kullanabilelim

Kod:
import '2_models/2_class_2_user_sinifi.dart';
//buraya import ettik ki o sinfitan nesne uretebilelim.

void main(){

  User user1 = User("ali", 15, id: "12", age: 15, city: "Kocaeli");

  //diyelim ki burada id değişkenine sadece ilgili sınıf içerisinden erişilebilsin.

  /*müşteri idsi 12 olana indirim yap diye bir senaryo olsun
  iyi hoş yaparız bir if else kontrolüyle ama id degiskeni private tanımlandı. id ye erişimimiz yok. ne yapacağız?
*/

}

Peki gelelim şöyle bir şey yapmaya

Kod:
class User{
  late final String name;
  late final 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;
  }

/*
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.
*/

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

}

ana dosyamıza da gidiyoruz şimdi orada da şöyle bir şey yapıyoruz:

Kod:
import '2_models/2_class_2_user_sinifi.dart';
//buraya import ettik ki o sinfitan nesne uretebilelim.

void main(){

  User user1 = User("ali", 15, id: "12", age: 15, city: "Kocaeli");

  //diyelim ki burada id değişkenine sadece ilgili sınıf içerisinden erişilebilsin.

  /*müşteri idsi 12 olana indirim yap diye bir senaryo olsun
  iyi hoş yaparız bir if else kontrolüyle ama id degiskeni private tanımlandı. id ye erişimimiz yok. ne yapacağız?
*/

if(user1.isSpecialUser("12")){
  user1.money +=5; //peki bunu yapabilir miyim?
  print("para eklendi özel user");

}

}

peki money'e orada 5 ekleyebilir miyiz. ekleyemeyiz çünkü final olarak tanımladık zaten değeri verilmiş diyecektir bize. Sınıfımıza şöyle bir ekleme yapalım mesela iki tane fonksiyon oluşturalım ikisi de aynı işlevi görecek ama birisi pratik yazım olacak

Kod:
bool isEmtpyId(){
    return _id.isEmpty;
  }

  bool isEmptyId() => _id.isEmpty;

Burada aslında bu pratik olarak yazdığımız fonksiyon bir parametre de almıyor o zaman şöyle yapalım

Kod:
bool get isEmptyId => _id.isEmpty;

Evet serimize şu anda vscode üzerinde olduğumuz aşamayı göstereyim:

Screenshot-2.png

Şu ana kadar condition, switch case operatörler listler mapler sınıflar fonksiyonları temel de olsa gördük inceledik. Şimdi devam edelim.

şöyle azıcık yukarıdaki gibi kodda gösterdiğim gibi get yazarak bu değer computed value anlamına gelir yani bu değer çağrıldığında hesaplanır her defasında. Bu değer hesaplanıp sana geriye sonucu döndürür. Şimdi burada da değinmem gereken encapsulation olayı var. Bu olay aslında şöyle açıklanabilir. Diyelim sizin bir değişkeniniz var ve bu değişkenin kolay kolay değişmesini dışarıdan gelen durumlar karşısında etkilenmemesini veya bir koşula bağlanmasını istiyorsak bunun getter ve setter'larını yazmamız gerekir. Bir sonraki konumuzda devam edeceğiz.

International-Teambd62f7e7ad9a640b.png


Seriyi inceleyen ve takip eden arkadaşlar beğenilerinizi ve yorumlarınızı bekliyorum.

<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.