Merhabalar.

Sınıflar konumuza bir diğer özelliğimiz olan getter ve setter kavramlarıyla devam ediyoruz.

Bir program yazdığımızda önemli konularda biri de programların güvenliğidir. Bir sınıf içindeki değişkenler bağımsız şekilde herkesin erişimine kontrolsüz açarsak programlarımız için açıklar yaratmış ve kolayca veri manipulasyonu yapılabilir hale getirmiş oluruz. İşte bu sebepten dolayı bir sınıf içindeki propertylerimizi private hale getirip yani sadece o sınıfı yazanların sınıf içindeki metodlardan erişim sağlayabileceği şekilde düzenleyip, değişkenlere değerlerin nasıl atanacağını ve nasıl okunacağını metodlar ile ayarlarmalıyız.

İşte değişkenlerimize değer atama işlemi için set metodu, değer okumak içinde get metodu vardır. Böylece set ve get metodları içinde istersek gelen veriyi istediğimiz gibi gelmiş mi diye kontrol ettirebiliriz. İstediğimiz her işleme tabi tutabiliriz ve değişkene değerin atanmasını sağlayabiliriz.

Okuma işlemi yaparkende get metoduyla yine metod içinde istediğimiz her işlemi yapar geri bir değer gönderebiliriz.

Sınıf içinde bir değişkenin private olmasını sağlamak için başına _ (alttire) simgesi konur.

int _sayi; gibi.

Sınıf içindeki değerler private yapıldığında artık sınıftaki hangi değişkenlerin olduğunu sınıfa erişimi olanlar hariç kimse göremeyecektir.

Private yapılmış değişkenler instance ismi nokta yapıldığında kullanılabilir şekilde gözükmeyecektir.

Biz bu değişkenlere değer ataması ve okumasını yapabilecek getter ve setter fonksiyonlarını yazacağız. Kullanıcılar sadece bu metodları görecektir.

Böylelikle doğrudan değer ataması yapamamış, sistemi istedikleri gibi manipule etme şansı bulamamış olacaklar.

Şimdi sınıfımız içinde biliyorsunuz ki aşağıdaki gibi propertylerimiz mevcuttu.

Şimdi öncelikle bunları private hale getirmeden önce main fonksiyonu içinde instance isminin yanına nokta koyunca görünüp görünmediğini bir kontrol edelim.

Görüldüğü üzre özellikler erişilebilir duruyor.

Şimdi propertylerimizi private duruma getirelim. Tekrar kontrol edelim.

class Personal{

  String _name;
  String _lastName;
  String _number;
  int _age;

 /* Personal(){
    print("Yapıcı Metod Çalıştı");
  } */
/*
   Personal(String name, String lastName, String number, int age){
     this.name = name;
     this.lastName = lastName;
     this.number = number;
     this.age = age;
   }
*/
     Personal(this._name, this._lastName, this._number, this._age){

     }

     Personal.NoAge(this._name, this._lastName,this._number){

     }
}
  String _name;
  String _lastName;
  String _number;
  int _age;

Görüldüğü üzere artık özelliklerimize başka bir sınıf ve metod içinden erişim yok.

Şimdi bu propertylere basit şekilde getter ve setterlar yazalım.

Set işlemi geriye bir değer döndürmediği için set fonksiyonunu void tipli tanımlayabiliriz.

Set ve get metodlarımızı isimlendirirken propertyle benzer ya da çağrıştıracak şekilde isimlendirirsek kullanımı kolay olacaktır.

Ne işe yaradığını anlamamızı da kolaylaştıracaktır.

class Personal{

  String _name;
  String _lastName;
  String _number;
  int _age;

  void set nameSet(String name){
    this._name = name;
  }
  

 /* Personal(){
    print("Yapıcı Metod Çalıştı");
  } */
/*
   Personal(String name, String lastName, String number, int age){
     this.name = name;
     this.lastName = lastName;
     this.number = number;
     this.age = age;
   }
*/
     Personal(this._name, this._lastName, this._number, this._age){

     }

     Personal.NoAge(this._name, this._lastName,this._number){

     }
}

Yukarıda _name propertysine değer atayacak şekilde bir setter yazdık.

 void set nameSet(String name){
    this._name = name;
  }

Burada istediğimiz kontrolü sağladıktan sonra bu değer atama işlemini yapabilirdik.

Yani örneğin name ifadesi ile gelen değerin uzunluğunun 6’dan küçük olmasını istemiyorsak bunun kontrolünü yaparak uygunsa değeri atayabilirdik.

Diğer ifadeler içinde setterlarımızı normal şekilde yazalım.

void set nameSet(String name){
    this._name = name;
  }
  void set lastNameSet(String lastName){
    this._lastName = lastName;
  }
  void set numberSet(String number){
    this._number = number;
  }
  void set ageSet(int age){
    this._age = age;
  }

Böylelikle Setterları tamamlamış olduk.

Şimdi main tarafında tekrar kontrol edersek bu metodların işler bir şekilde göründüğünü göreceğiz.

Get Metodlarımızı da Yazalım.

Get metodu var olan değeri dışarıya döndüğü için aslında bir okuma işlemi yapıldığı için bir geri dönüş tipiyle çalışır diyebiliriz. Burada geriye neyi get edeceğimize göre bu değişebilir. Ancak direkt değerin okunduğu bir getter yazdığımızı varsayarcak fonksiyonun propertynin tipinde bir geri dönüş tipi olmalıdır.

Getterlar parametre almadıkları için setterlar gibi parantezlerle belirtilmez.

String get nameGet{
    return this._name;
  }
  String get lastNameGet{
    return this._lastName;
  }
  String get numberGet{
    return this._number;
  }
  int get ageGet{
    return this._age;
  }

Getterlarımızı da yazmış olduk.

Şimdi kullanalım.

import 'package:hello_dart/01_personal.dart';

void main() {
/*
  Personal Ahmet = Personal();

  Ahmet.name = "Ahmet";
  Ahmet.lastName = "Bilginer";
  Ahmet.number = "0 345 667 56 56";
  Ahmet.age = 20;

  print("${Ahmet.name} ${Ahmet.lastName}\n${Ahmet.number} - ${Ahmet.age} ");

  Personal Ayse = Personal();

  Ayse.name = "Ayşe";
  Ayse.lastName = "Bilginer";
  Ayse.number = "0 656 548 45 45";
  Ayse.age = 45;

  print("${Ayse.name} ${Ayse.lastName}\n${Ayse.number} - ${Ayse.age} ");

  Personal Murat = Personal();
*/

  Personal Murat = Personal("Murat", "Bilginer", "0 564 456 45 67", 28);

  Personal Meryem = Personal.NoAge("Meryem", "Yalvaç", "0 523 432 43 54");


  Murat.nameSet = "Murat";
  Murat.lastNameSet = "Bilginer";
  Murat.numberSet = "0 564 894 55 66";
  Murat.ageSet = 20;
  
  print("${Murat.nameGet} - ${Murat.lastNameGet} - ${Murat.numberGet} - ${Murat.ageGet}");

}
  Murat.nameSet = "Murat";
  Murat.lastNameSet = "Bilginer";
  Murat.numberSet = "0 564 894 55 66";
  Murat.ageSet = 20;
  
  print("${Murat.nameGet} - ${Murat.lastNameGet} - ${Murat.numberGet} - ${Murat.ageGet}");

Bir set ifadesine değer atarken parametre ifadesini fonksiyon parametre verir gibi yazmayız. set ifadesini yazdıktan sonra değeri karşısına eşittir ifadesinden sonra yazarız.

Murat.nameSet(“Murat”); gibi bir kullanım hatalı olacaktır.

Sonuca bakalım.

H:\Dart_Tutorial\hello_dart\bin_Classes>dart 01_main.dart
Murat - Bilginer - 0 564 894 55 66 - 20

Sizlere şimdi güzel bir özellikten bahsedeceğim.

Diyelim ki bir class içinde 50 tane propertyniz var. Bunların tamamı için tek tek getter ve setter fonksiyonlarımı hazırlayacaksınız. Tabii ki hayır.

Intellij Idea editörü bize bu konuda bir kolaylık sağlıyor.

Şimdi var olan sınıfımızda kendi yazdığımız get ve set metodlarını açıklama satırı haline alınız.

Sınıf içinde boş bir alana sağ tıklayınız.

Generate Sekmesini seçiyoruz.

Burada Generate etmek isteyeceğiniz alanlar var başka bir zamanda istediğinizi seçebilirsiniz. Ancak biz şu anda hem getter hem setter oluşsun istiyoruz.

Tamamını seçiyoruz ve OK diyoruz.

class Personal{

  String _name;
  String _lastName;
  String _number;
  int _age;

  String get name => _name;

  set name(String value) {
    _name = value;
  }

  String get lastName => _lastName;

  set lastName(String value) {
    _lastName = value;
  }

  String get number => _number;

  set number(String value) {
    _number = value;
  }

  int get age => _age;

  set age(int value) {
    _age = value;
  }

  /*
  void set nameSet(String name){
    this._name = name;
  }
  void set lastNameSet(String lastName){
    this._lastName = lastName;
  }
  void set numberSet(String number){
    this._number = number;
  }
  void set ageSet(int age){
    this._age = age;
  }

  String get nameGet{
    return this._name;
  }
  String get lastNameGet{
    return this._lastName;
  }
  String get numberGet{
    return this._number;
  }
  int get ageGet{
    return this._age;
  }

*/

 /* Personal(){
    print("Yapıcı Metod Çalıştı");
  } */
/*
   Personal(String name, String lastName, String number, int age){
     this.name = name;
     this.lastName = lastName;
     this.number = number;
     this.age = age;
   }
*/
     Personal(this._name, this._lastName, this._number, this._age){

     }

     Personal.NoAge(this._name, this._lastName,this._number){

     }


}

Aşağıdaki kodları bizim için oluşturduğunu görüyoruz.

String get name => _name;

  set name(String value) {
    _name = value;
  }

  String get lastName => _lastName;

  set lastName(String value) {
    _lastName = value;
  }

  String get number => _number;

  set number(String value) {
    _number = value;
  }

  int get age => _age;

  set age(int value) {
    _age = value;
  }

Burada kafamızı karıştıracak bir şey varsa o da get metodunun yazılma şekli. Biz metodlarımız sadece bir satır kodlardan oluşuyorsa uzun uzun yazmak yerine fat arrow dediğimiz yapıda metodlar yazabiliyoruz.

Burada da bunu yapmışlar. Fat Arrow kavramını daha sonra göreceğiz.

String get name => _name;

String get name{
return _name;
}

Şu iki yazım arasında hiçbir fark yoktur.

=> fat arrow buna diyoruz. Sağa doğru ok. Bu return ifadesini içerir. O yüzden tekrar return yazmaya gerek kalmaz.

Getter ve setterlarımız böyleydi.

Bir sonraki yazımda görüşmek üzere.


What's Your Reaction?

hate hate
0
hate
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win
Murat Bilginer
21 Şubat 1992 Doğumlu. Endüstri Mühendisi olarak Lisansını 2016 yılında tamamlamıştır. Industryolog Akademi - NGenius oluşumlarının kurucusudur. Şu anda kendi şirketi Brainy Tech ile hem Yazılım Hizmetleri Sunmakta Hem de Online Eğitimler Vermektedir.