Parça Metotlar ve Sınıflar ( Partial Methods & Partial Classes )

Visual Studio ile uygulama geliştirirken aslında bir çok senaryoda Visual Studio sizin için bir çok parça sınıf üretiyor, bunları yazının sonunda inceleyeceğiz.

Partial Classes  (Parça, Kısmi Sınıflar)

Bu türden sınıfları kullanmak için nedenlerimize şöyle bir göz atarsak ,

  1. Sınıf için kullandığımız dosya fazlasıyla büyümüştür ve farklı dosyalara ayırma ihtiyacımız ortaya çıkmıştır.
  2. Sınıfın farklı mantık öğelerine sahip kısımlarını farklı dosyalarda tutmak isteyebiliriz.
  3. İlk iki maddeden yola çıkarak takım çalışmalarında farklı geliştiricilerin aynı sınıf üzerinde çalışmaları rahatlatılabilir.
  4. Otomatik oluşturulan kodlar ile çalışırken (Entity Framework gibi) oluşturulan sınıflara direk ilgili sınıf dosyalarında ekleme, düzenleme yapmak tehlikelidir. Çünkü o sınıflar otomatik olarak tekrar oluşturulabilirler bu durumda yazdıklarımız yok olacaktır. Bunun yerine farklı bir dosyadan ilgili sınıfa ek yaparak kod eklemek daha mantıklı olacaktır.

Mantığı kavramak için şöyle bir sınıf oluşturalım :

Class Kedi

    Public Adı As String

    Sub Miyavla()
        Console.WriteLine("Miyav")
    End Sub

End Class

 

Kedi nesnesini türetip Miyavla metodunu çağırdığımızda doğal olarak ekrana “Miyav” sonucu gelecektir, şimdi bu sınıfın çok uzadığını düşünelim ve ikinci bir dosya açmış olalım ve metotlara devam ediyor olalım, ikinci dosyamızın içeriği şöyle olacaktır :

Partial Class Kedi

    Public Türü As String

    Sub Sevin()
        Console.WriteLine("grr grr grr grr")
    End Sub

End Class

 

Aşağıdaki gibi kullanımda aynı sınıf içindeki metotlara farklı dosyalarda dahi olsalar erişebildiğimizi göreceksiniz

Module Module1

    Sub Main()

        Dim Kedicik = New Kedi With {.Adı = "Kedican",
                                    .Türü = "Siyam"
                                    }

        Kedicik.Miyavla()
        Kedicik.Sevin()

    End Sub

End Module

 

Örneğinimizin ekran çıktısı şöyle olacaktır :

image

 

Partial Methods (Parça, Kısmi Metotlar)

 

Partial Metotlar ile bir metodun tanımı yapılır fakat o metot oluşturulmaz ve o metot başka bir yerde )genellikle partial class içerisinde) oluşturulmamış ise o satır işlenmez.

İlk sınıfımıza SütüDök() adında bir metot ekliyoruz bu metotta önce kedimiz miyavlayacak eğer Partial Class içerisinde Kaç() metodu oluşturulmuş ise kaçacak..

Class Kedi

    Public Adı As String

    Sub Miyavla()
        Console.WriteLine("Miyav")
    End Sub

    Sub SütüDök()
        Miyavla()
        Kaç()
    End Sub

    Partial Private Sub Kaç()

    End Sub
End Class

 

Diğer dosyamızdaki partial class’ımızda bir değişiklik yapmadan uygulamamızda sütüdök metodunu çağırıyoruz:

Module Module1

    Sub Main()

        Dim Kedicik = New Kedi With {.Adı = "Kedican",
                                    .Türü = "Siyam"
                                    }
        Kedicik.SütüDök()

    End Sub

End Module

 

Bu durumda ekran çıktımız şöyle olacak :

image

Şimdi, Partial Class’ımızda ilgili metodu oluşturuyoruz :

Partial Class Kedi

    Public Türü As String

    Sub Sevin()
        Console.WriteLine("grr grr grr grr")
    End Sub

    Private Sub Kaç()
        Console.WriteLine("Fırrrr")
    End Sub
End Class

 

Artık Kaç metodumuzun bir işlevi var derleyici bu satırı artık işleyecek, durum itibariyle :

image

şeklinde çıktı alıyoruz.

Partial olarak Function oluştrmayı denediğinizde bunu yapamadığınızı fark edeceksiniz, zira böyle bir durumda ilgili metot tanımlanmadığında hata oluşacaktır. Peki ne yapabiliriz ? Partial Class’da da tanımlansa metodun class içindeki değişkenleri ve propertyleri değiştirebileceğini unutmayın. Örneğin Kaç() metodunda istersek Adı property(özelliğini)sini değiştirebilirdik ve Kaç() metodunu çağırmamızın ardından Adı özelliğini kontrol edip karar verebilirdik.

Otomatik oluşturulan (Code Generated) kodlarda genellikle Validasyon işlemleri için böyle bir _isvalid özelliği bulunmaktadır ve biz modelin doğruluğunun kontrolünü gerçek sınıfa bırakabilmekteyiz.

Peki bu özellik pratikte nerelerde kullanılıyor,

  1. Otomatik olarak oluşturulan kodlarda genellikle kullanıcı bu kodlara müdahale edebilmesi amacıyla bu tip metotların çağrımı yapılmaktadır.
  2. Daha sonra farklı projelerde kullanılabilecek sınıflarda kullanabilmektedir.

Partial Metotlarda nelere dikkat etmek gerekir ?

  1. Partial Metotlar sadece Sub olabilirler.
  2. Partial Metot gövdeleri kod içermezler.
  3. Erişim belirleyicisi sadece Private (Sadece o sınıfın içinde) olabilir.
  4. Shared  olarak tanımlanabilirler.
Visual Studio içinde otomatik oluşturulan Partial Class ve Metotlar

Bununla ilgili en tipik örnek Winforms uygulamalarında form tasarımında olmaktadır. Eklediğimiz her kontrolün bir aslında bir nesne (object) olduğunu biliyoruz, bu durumda form üzerine sürükleyip bıraktığımız her “şey” için bir kod yazılması gerekir. Eğer ki projemizi notepad ile geliştiriyor olsa idik, bir textbox eklemek için

Public Class Form1
    WithEvents MetinKutum As New TextBox With {.Bounds = New Rectangle(10, 10, 300, 32),
                                                .Text = "Metin Kutum",
                                                .Name = "txtCihan"
                                              }
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(MetinKutum)
    End Sub
End Class

 

benzeri bir kod yazmamız gerekirdi, bu şekilde tasarım yapmak oldukça zorlayıcı olacaktır eminim.

Peki biz toolbox’dan metin kutusu eklediğimizde ne oluyor ? Aslında Visual Studio 2005 öncesini kullanıyor olsaydınız, formun codebehind dosyasının en üstüne bir yığın kod eklendiğini görecektiniz zira .net’in ilk sürümlerinde Partial Class yoktu ve tasarımı oluşturan kodlar direkt olarak form için oluşturulan codebehind (form1.vb) dosyasının içinde yer alırdı.

Hızlıca günümüze dönelim ve örneğimiz için hazırlanan sınıfa bakalım :

 _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
     _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.
    'Do not modify it using the code editor.
     _
    Private Sub InitializeComponent()
        Me.txtCihan = New System.Windows.Forms.TextBox()
        Me.SuspendLayout()
        '
        'txtCihan
        '
        Me.txtCihan.Location = New System.Drawing.Point(10, 10)
        Me.txtCihan.Name = "txtCihan"
        Me.txtCihan.Size = New System.Drawing.Size(300, 20)
        Me.txtCihan.TabIndex = 0
        Me.txtCihan.Text = "Metin Kutum"
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(351, 189)
        Me.Controls.Add(Me.txtCihan)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents txtCihan As System.Windows.Forms.TextBox

End Class

 

Peki bu dosya nerede ? Nasılsa üzerinde kod olarak değişiklik yapmayacağımız için bu dosya Visual Studio tarafından gizleniyor, kendisini açmak için Solution Explorer’ın araç çubuğunda ilgili düğmeye tıklamamız yeterli :

image image

 

Peki başka başka diyorsanız şu makalelere göz atın derim :



Etiketler :




0.000135898590088 | 3.5