Giriş yapmadınız.

#1 05.03.2013 17:44:28

Mecit
Üye
Kayıtlı: 13.01.2013
Mesajlar: 28

Setters fonksiyonlarının mantığı?

Getters / setters fonksiyonlarına bakarken, kafama bu soru takıldı. Getters'ı anladım fakat şöyle bir durumda niye setters kullanalım?

// Model
class User extends Eloquent {

    public function set_password($password)
    {
        $this->set_attribute('password', Hash::make($password));
    }

}


// set_password metodu baz alinarak...
$user = User::find(1);
$user->password = 'test';
$user->save();

// set_password metodu baz alinmaksizin...
$user = User::find(1);
$user->password = Hash::make('test');
$user->save();

Şimdi, users tablomda password diye bir field var ve ben iki türlü de aşağı yukarı aynı işemi yaparak şifreyi güncelleyebiliyorum. Bu durumda, setters fonksiyonlarını kullanmanın amacı nedir?

Son düzenleyen Mecit (05.03.2013 17:45:07)

Çevrimdışı

#2 06.03.2013 13:29:26

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,439
Website

Yanıt: Setters fonksiyonlarının mantığı?

Burada kullanım avantajları tüm detaylarıyla anlatılmış.

Çevrimdışı

#3 07.03.2013 01:41:40

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Setters fonksiyonlarının mantığı?

Aslında setters kavramı verdiğiniz örnekte çok fayda sağlayacak bir şey gibi durmuyor görünebilir. Ancak büyük çaplı projelerde yüzlerle ifade ettiğimiz değişken/algoritma/metod arasında boğuşmak yerine setters ile işlerin biraz daha rahat yönetilebilir olduğunu görüyorsunuz. Bazı durumlarda loop, try-catch vs gibi kolaylıklar dahi yeterli olmuyor. Bu nedenle PHP 6 versiyonu ile birlikte goto gibi kavramları/yöntemleri getiriyor (goto konusundaki akademik saçmalıklara katılmadığımı açıkça belirteyim). Ancak biz yine sizin örneğinizden gidelim.
Şimdi alt alta 10 kere her seferinde find'a atadığınız değer de değişecek şekilde 10 farklı php dosyasına

$user = User::find(x); //x değerini değiştirelim durmadan ama :)
$user->password = Hash::make('test');
$user->save();

Sonra bunları include edelim tek bir dosyaya ya da birbirlerini include etsinler. (tekrar ediyorum, verdiğiniz örnekle aklıma ancak böyle bir örnek vermek geliyor)
Kullandığınız IDE'yi kapatın, tüm dosyaları kapatın. Ve bir anda veri tabanında ya da başka bir modelde başka bir yerde yaptığınız bir değişiklik nedeniyle ,

Hash::make($password)

yöntemini değil de

md5('herhangi bir salt değeri',$password);

kullanmak zorunda olduğunuzu düşünün.

Sizin yönteminizle bir şekilde (genelde IDE yardımları ile) bu yöntemi kullandığınız  bütün dosyaları teker teker güncellemek zorunda kalacaksınız.

Ancak setter kullanan ben, sadece setter bulunan dosyayı güncelleyerek zaman, saç, kafein, bira ve sigara tasarrufu sağlamış oluyorum.

Setterları sadece veri girişinde kullanmak olarak düşünmeyin, ayrıca verileri süzerken, onlara "şekil" verirken de kullanabilirisniz smile Bunlar OOP güzellikleri, ancak her zaman gerekli olan yollar değil.

Setter cemaati kuruyorum var mı gelen? tongue

Son düzenleyen drlinux (07.03.2013 01:42:05)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#4 07.03.2013 08:31:08

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,439
Website

Yanıt: Setters fonksiyonlarının mantığı?

drlinux yazdı:

Setter cemaati kuruyorum var mı gelen? tongue

+1

Çevrimdışı

#5 07.03.2013 23:56:40

Mecit
Üye
Kayıtlı: 13.01.2013
Mesajlar: 28

Yanıt: Setters fonksiyonlarının mantığı?

Cevaplarınız için teşekkürler, sineld ve drlinux. Özellikle drlinux'un cevabından sonra konu çok daha net bir hâle geldi.

Çevrimdışı

#6 10.04.2013 03:39:56

Aristona
Üye
Yer: Kastamonu
Kayıtlı: 08.02.2013
Mesajlar: 173
Website

Yanıt: Setters fonksiyonlarının mantığı?

Çok basit bir ekleme yapmak istiyorum.
Settler kullanmadan private olan değişkenlerin değerini değiştiremezsiniz.

<?php
	class Test 
	{
		private $var;

		function __construct()
		{
			$this->var = 'Değer';
		}

		function setVar($val)
		{
			$this->var = $val;
		}

		function getVar()
		{
			return $this->var;
		}
	}

	$test = new Test();
	$test->setVar('Yeni değer');
	echo $test->getVar(); //Yeni Değer
        
	$test->var = 'Yeni Değer'; //Hata

Ayrıca bir avantajı daha var, o da başkalarının private değişkenlere direkt erişip hatalara yol açmasını önlemek.

Örneğin kdv hesaplama sınıfındaki $kdv_orani değişkenini birinin yanlışlıkla 18'den 100'e çıkardığını düşünün. Bu tür hataları gidermek için settler içerisinde basit bir kontrol eklenebilir ve $kdv_orani'nin anormal değerlere sahip olması engellenebilir.

Private olmasa bile, mümkün olduğunca sınıflar içerisindeki değişkenlere direkt erişim sağlamamaya çalışın. Gettler ve settler kullanın.

Son düzenleyen Aristona (10.04.2013 03:42:49)


"Eğer 6 ay önce yazdığın kodları gördüğünde utanmıyorsan, kendini yeterince hızlı geliştiremiyorsun demektir."

Site: http://anilunal.com/
Blog: http://aristona.github.io/

Çevrimdışı

#7 10.04.2013 11:14:06

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Setters fonksiyonlarının mantığı?

Aristona yazdı:

Çok basit bir ekleme yapmak istiyorum.
Settler kullanmadan private olan değişkenlerin değerini değiştiremezsiniz.

<?php
	class Test 
	{
		private $var;

		function __construct()
		{
			$this->var = 'Değer';
		}

		function setVar($val)
		{
			$this->var = $val;
		}

		function getVar()
		{
			return $this->var;
		}
	}

	$test = new Test();
	$test->setVar('Yeni değer');
	echo $test->getVar(); //Yeni Değer
        
	$test->var = 'Yeni Değer'; //Hata

Ayrıca bir avantajı daha var, o da başkalarının private değişkenlere direkt erişip hatalara yol açmasını önlemek.

Örneğin kdv hesaplama sınıfındaki $kdv_orani değişkenini birinin yanlışlıkla 18'den 100'e çıkardığını düşünün. Bu tür hataları gidermek için settler içerisinde basit bir kontrol eklenebilir ve $kdv_orani'nin anormal değerlere sahip olması engellenebilir.

Private olmasa bile, mümkün olduğunca sınıflar içerisindeki değişkenlere direkt erişim sağlamamaya çalışın. Gettler ve settler kullanın.

+1


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#8 10.04.2013 21:14:37

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,439
Website

Yanıt: Setters fonksiyonlarının mantığı?

Teşekkürler @Aristona
Güzel ve açıklayıcı bir örnek olmuş.

Çevrimdışı

#9 11.04.2013 03:15:52

Timeout
Üye
Kayıtlı: 27.02.2013
Mesajlar: 8

Yanıt: Setters fonksiyonlarının mantığı?

Aristona yazdı:

olduğunca sınıflar içerisindeki değişkenlere direkt erişim sağlamamaya çalışın. Gettler ve settler kullanın.

Direkt olarak erişimde sakınca olmayan değişkenlerde kullanmak daha yavaş çalışmasına yol açıyor.

Çevrimdışı

Forum alt kısmı