Bugün sizlere biraz Refactoring'den bahsetmek isriyorum. Refactoring'i kaba bir şekilde tanımlamak gerekirse herhangi bir kodun işlevini değiştirmeden yazılışı değiştirmek ve hedef olarak da kodun okunuşu kolaylaştırmaktır diyebiliriz. Refactoring konusunda sektörde bir çok araç, üçüncü parti uygulamalar satılıyor. Visual Studio içerisinde de C# için hazır bazı ufak tefek Refactoring araçları bulunuyor. Tabi ben bir VB programcısı olarak olayın VB kısmından bahsedeceğim ve sizlere ücretsiz bir Visual Studio eklentisi olan Refactor'u tavsiye edeceğim.
http://msdn2.microsoft.com/en-us/vbasic/bb693327.aspx
Yukarıdaki adresten indirebileceğiniz yazılımın normal sürümü ücretsiz ve hem Visual Studio 2005 hem de 2008 ile uyumlu. Yazılımın daha çok özelliklere sahip bir sürümü de "Refactor Pro" adı altında satılıyor. Biz şimdilik ücretsiz sürümle yetinelim :)
Hemen bir iki örnek ile neler yapabileceğimize bakalım.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ds As New Data.DataSet
Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("CNN").ConnectionString)
Using cmd As New SqlCommand("SELECT * from TABLO", cnn)
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds)
End Using
End Using
GridView1.DataSource = ds
GridView1.DataBind()
End Sub
Yukarıdaki kod herhangi bir asp.net web sayfasının Page.Load durumunda çalışıyor olsun. Gördüğünüz gibi veritabanına bir Select göndererek gelen veriyi GridView'e bağlıyoruz. Eğer Select ile aldığımız veriyi sayfada başka yerlerde de almamız gerekecekse aslında bunu harici bir function olarak yazmamız daha faydalı olacaktır. Hemen aşağıdaki şekilde function içerisine almak istediğim bölümü seçiyorum.

Kodumuzu harici bir function içerisinde alıyoruz.
"Extract Method" komutu verdiğimizde Refactor bize kodu class yapısı içerisinde nereye yazdırmak istediğimizi soruyor sonrasında da Function'ımızı aşağıdaki gibi otomatik olarak yaratıyor.
Partial Class _Default
Inherits System.Web.UI.Page
Private Shared Sub Page_LoadExtracted(ByVal ds As Data.DataSet)
Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("CNN").ConnectionString)
Using cmd As New SqlCommand("SELECT * from TABLO", cnn)
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds)
End Using
End Using
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ds As New Data.DataSet
Page_LoadExtracted(ds)
GridView1.DataSource = ds
GridView1.DataBind()
End Sub
End Class
Gördüğünüz gibi artık aynı Function'ı kullanarak sürekli aynı datayı istediğimizde bir DataSet içerisine doldurtabiliyoruz. Fakat burada sizi rahatsız edeceğinden emin olduğum bir şey var; Refactor'un yarattığı function'ın adı çok anlamsız :) Visual Studio içerisinde yaratılan fonksiyonun adını değiştirirseniz Refactor sizin için söz konusu fonksiyonun kullanıldığı yerlerdeki referansları da otomatik olarak değiştirecektir.
Gelelim bir diğer örneğe. Varsayalım ki yeni bir sınıf yapısı oluşturmaya başladınız. Oluşturduğunuz ilk sınıfın bir sürü Private değişkeni var ve bunlara da uygun Property'lerin tanımlanması gerekiyor. Set ve Get leri tek tek her biri için ayarlıyor olmak gerçekten işkenceye dönüşebilir. Gelin aşağıdaki koda bir bakalım.
Public Class Deneme
Private Ozellik As Integer
Private Ozellik2 As Integer
Sub New()
End Sub
Sub New(ByVal Ozellik As Integer, ByVal Ozellik2 As Integer)
Me.Ozellik = Ozellik
Me.Ozellik2 = Ozellik2
End Sub
End Class
Yukarıdaki sınıfımızda sadece iki adet özellik bulunuyor bunların Property'lerini oluşturmamız gerekiyor. Private değişkenlerin üzerine sağ tuşu ile tıkladıktan sonra "Refactor / Encapsulate Field" komutu veriyorum ve kodun yerleştirileceği yeri de seçtikten sonra Refactor benim için Property kodlarını otomatik olarak yazıyor.
Public Class Deneme
Private Ozellik As Integer
Private Ozellik2 As Integer
Sub New()
End Sub
Sub New(ByVal Ozellik As Integer, ByVal Ozellik2 As Integer)
Me.Ozellik1 = Ozellik
Me.Ozellik21 = Ozellik2
End Sub
Public Property Ozellik1() As Integer
Get
Return Ozellik
End Get
Set(ByVal value As Integer)
Ozellik = value
End Set
End Property
Public Property Ozellik21() As Integer
Get
Return Ozellik2
End Get
Set(ByVal value As Integer)
Ozellik2 = value
End Set
End Property
End Class
Refactor tarafından tamamlanan yukarıdaki kodda dikkatinizi çektiyse Sub New kodundaki değerlerin aktarıldığı değişkenlerin isimleri de otomatik olarak Property isimleri ile değiştirilmiş durumda. Bir önceki örnekte olduğu gibi burada da eğer elle Property isimlerini değiştirirseniz Refactor otomatik olarak sınıf içerisinde diğer referansları da değiştiriyor.
Tüm bu işlemleri kod yazarken yapıyor olmak kolaylık sağlayabilir fakat esas mesele elinizde hazır kodları tamamlanmış bir proje varsa gerçekleşiyor. Projeyi inceleyerek sadece Refactoring araçlarını kullanarak daha okunabilir bir kod yaratmaya çalışıyorsunuz, hatta çoğu zaman kodun işleyişini değiştirmeden kodu kısaltabiliyorsunuz bile.
Refactoring'e giriş yapmanızı sağlayacak Refactor eklentisi ne kadar ücretsiz olsa da daha fazla reklamını yapmayacağım :) Refactoring dünyasını keşfetmek artık size kalmış.
Hepinize kolay gelsin.