ASP.NET AJAX : Page Metodlar Neden Static Olmak Zorunda ?

“Page Metodlar Neden Static Olmak Zorunda ?” sorusuna gelmeden önce bazı konuların üzerinden geçmemiz gerekiyor ki sonunda bu soruyu yanıtlarken taşlar yerine oturmuş olsun. Üzerinden geçeceğimiz konular aşağıda sıralandığı gibi olacaktır : 

  • Page class nedir ve niçin ona sahibiz
  • Page class bizim için ne yapar
  • Perde arkasında neler olur
  • Bir metod kullanıldığında gereken static anahtar kelime
  • Ve Page Metodlar Neden Static Olmak Zorunda…

Page class nedir ve niçin ona sahibiz ?

Bağımsız HTTP protokolünün, ASP.NET WebForm paradigmasıyla uyum sağlamasını başarmak ASP.NET ekibi için önemli işti. Bunun üzerine klasik Asp satır içi uygulama yada yürütme (execution) modelinden ASP.NET ‘de büyük değişiklikler gerektiren olay-güdümlü (event-driven) modeline geçildi. Bunun üzerine benzer problemlerin üstesinden gelmek için her yerde aynı anda çalışabilen Page class yaratıldı.

Örneğimize bakalım :


public partial class _Default : System.Web.UI.Page 
{
  protected void Page_Load(object sender, EventArgs e) 
  { 
    // Merhaba dünya
  }
}

Page_Load event’ine aşina olduğunuza eminim. Belki kod yazmaya başladığınızda ilk karşılaştığınız Page_Load event’idir. Yukarıda örnek nasıl çalışıyor inceleyelim :

public partial class _Default : System.Web.UI.Page

Hızlı bir şekilde başladıysanız bu örneklerin açıklamalarını iyi bir şekilde anlamamış olabilirsiniz. Kodu derleyip çalıştırdıktan sonra bu satır geçiştirilerek üzerinde durulmamış olabilir yada çok önemli görülmeyen bir etmen gözüyle bakılmış olabilir.

Bu ifade kodunuzun Page class ile genişletildiğini beyan eder. Bu ifade kodunuza ASP.NET class’ın  tüm fonksiyonelliği dahil edilecektir.

Klasik ASP yada PHP gibi bir dile aşinalığınız varsa, bunu site içerisinde kullanılan güçlü bir dahili dosya gibi  benzeri fonksiyonelliklere sahip olan bir kalıtım sayfası olarak ta düşünebilirsiniz.

Page’in en güçlü özelliklerinden biri : Süreklilik (Persistence)

Page bir çok tablo getirir. Bunun yanında “Page Metodlar Neden Static Olmak Zorunda ?” sorusuna yanıt verebilmek için Persistence özelliğine odaklanalım :

Örneği dikkatle inceleyelim :


<asp:Label runat="server" id="Label1" />
<asp:Button runat="server" id="Button1" OnClick="Button1_Click" />

protected void Button1_Click(object sender, EventArgs e)
{
 Label1.Text += DateTime.Now.ToString();
}

Buton her tıklandığında label kontrolüne şuan ki zaman ve tarih eklenecek. Ayrıca bu örnekte WebForms Page’in kalıcılığı veya devamlılığı (persistence) otomatik olarak nasıl sağladığını görebiliriz.

Tarayıcı HTTP POST sonrasında bize Label1 nesnesini üretecek. Label nesnesinin otomatik olarak text özelliğine sahip olacağını varsayalım.

Ancak normalde veri, sunucuya gönderilen POST verisine dahil olmayacaktı.Tarayıcıdan sadece form elemanları gönderilir. Bir label kontrolü span eleman olarak render edilir. Yani tarayıcı tarafından bir label olarak değilde span eleman olarak POST edilir.

Peki, sayfa bu verileri bize nasıl sağlar ? Kalıcılık.

Page bunu nasıl yapıyor ?

Kalıcılığı kapsayan bu katmanı uygulamak için ViewState yaratıldı.

Page, her seferinde tarayıcıya render edilir ve içerisindeki kontrolleri serialize eder. Daha sonra  döndürülen HTML’e  __ViewState diye isimlendirilen hidden form alanı üzerinden bu bilgiler eklenir.  Postback meydana geldiğinde hidden field daha sonra son isteğin (request) sonundakiyle aynı durumda ki sayfanın bir örneğini oluşturmak için de-serialize edillir.

Daha basit anlatacak olursak,  her postback başlangıcında,  sayfayı yeniden başlatmak için bu constructor’ın kullanıldığını düşünebilirsiniz.


Page _Default = new Page(Request["__ViewState"]);


Yukarıdaki ifade de, postback yapıldıktan sonra oluşturulan sayfa aşağıdaki gibi görünecektir.

page-instance-watches

Postback ardından yapılan postback, WebForm’un makine yuvarlamasını saklayan, ViewState’den gelen yeni sayfa örneğidir.

Static metod nedir ?

Static metod, bulunduğu sınıfın içerisindeki herhangi bir örnek ile ilişkili olmayan bir metottur. Daha yaygın, alternatif, ait olduğu sınıfın belirli bir örneğin sonucunun durumuna bağlı olan bir metot örneğidir.

Örneğin her iki durumda tam olarak aynı şey döndürülecek,  fakat farklı tiplerdeki metodlarla gerçekleşecektir.


// ToString() Datetime sınıfının bir örnek metodudur.
// Sonucu her Datetime örneğinin değerine bağlıdır
return DateTime.Now.ToString();
 
// String.Format String sınıfın bir static metodudur.
// Sonucu herhangi bir String örneğiyle ilişkili değildir.
return String.Format("{0}", DateTime.Now);


Static metod’un ait olduğu sınıfta uygun bir örnek ayarlanmadan çağrılabilmesi temel farkı veya en önemli farkını anlamaktır.

Diğer bir ifadeyle, Static Metod vatansız veya bağımsız bir metottur diyebiliriz.

Niçin Page Metod static olarak çağrılmak zorundadır ?

 

Şayet page metodla ilgili bir uygulama yaptıysanız büyük ihtimalle mükemmel performanslarının farkına varmışsınızdır. Özellikle UpdatePanel’in kısmi postback özelliğiyle kıyaslanabilirler.

Oldukça performanslı olmasının sebebi, kısmi Postback yaparken şu iki şeyi de yapar:

  1. Post edildiklerinde ViewState kullanmazlar
  2. Sayfanın bir örneğini yaratmazlar

Artık bildiğimiz gibi, bir page metod sayfanın bir örneğini yaratmaz hatta istekte bulunulsa bile ViewState temin sağlanamaz.

Bu tam olarak niçin static olarak işaretlenmek zorunda olduklarını anlatıyor. Page class’ınızın propert ve metodlarıyla etkileşimde bulunumaz, çünkü bir page metod sayfanın veya diğer her kontrollerin bir kopyasını veya örneğini yaratmaz.

Page metodlar kabaca, stenografiye eşdeğer bağımsız web servisleridir. Aslında, ScriptManager bile normal bir web hizmeti için tam olarak page metodları çağırır.

Konumuz burada sona eriyor. Umarım benim gibi static metodlarla uğraşırken neden bu static olmak zorunda diye kafayı yiyen birilerini aydınlatan bir yazı olmuştur. 🙂

 

Muavenet

Web teknolojilerine merak salmış bir bilgisayar mühendisinin yazıları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir