RSS

İlk VS.NET 2005 makrosu

18 Jul

Sevgili Umut Aydın‘ı utandırma zamanı! 😉

Her ne kadar GNU Emacs yahut VIM kadar güçlü ve gerçek bir programlama editörüne sahip olmasa da sunduğu makro programlama imkanı ile MS Visual Studio.NET 2005 kendini bir nebze çekilebilir, katlanılabilir ve genişletilebilir kılıyor.

VS.NET 2005, Code Snippets gibi güzel ve akıllıca bir metin düzenleme kolaylaştırıcısına sahip olsa da bunlar her zaman yeterli olmadıkları gibi tek tuşla halledilecek işler için de fazla “genel” kaçıyorlar.

Bu gibi durumlarda da devreye makro programlama giriyor. VS.NET 2005’in prop “code snippet”i ile uzun uzun uğraşıp property yaratmak yerine seçtiğim bir değişkeni tek hareketle ve kendi konvansiyonlarıma göre bir “property”ye dönüştürmek çok daha pratik ve daha da önemlisi hata yapmayı engelleyici.

Bunun için yapılması gereken ise Ana Menü –> Tools –> Macros –> New Macro Project… yolunu izleyip bir makro ismi yaratmak (yahut Macros IDE’yi açıp My Macros’a yeni bir makro eklemek).

Bundan sonra da sıra söz konusu makroyu kodlamaya geliyor. Makro kodlanıp test edildikten sonra Ana Menü –> Tools –> Options –> Keyboard yolunu izleyip oluşturulmuş ve test edilmiş makroyu kestirme bir tuş kombinasyonuna atamak mümkün (benim örneğimde Alt+Shift+p kombinasyonuna atanmış durumda).


Public Module CreatePropertyModule

    Public Sub CreateProperty()
        ' Get the current insertion point (where the cursor is positioned).
        Dim TS As TextSelection = DTE.ActiveDocument.Selection
        Dim ResultString = TS.Text
        Dim TmpArray(10)
        Dim PrivateVariableName
        Dim PublicVariableName

        ResultString = Trim(ResultString)
        ResultString = Replace(ResultString, ";", "")
        ResultString = Replace(ResultString, "private", "public")

        TmpArray = Split(ResultString)
        PrivateVariableName = TmpArray(2)

        PublicVariableName = PrivateVariableName

        ' Clean the variable name of its privacy markers
        PublicVariableName = Replace(PublicVariableName, "m_", "")
        PublicVariableName = Replace(PublicVariableName, "_", "")

        ' Capitalize the variable name so it becomes suitable to be a Property name
        PublicVariableName = UCase(Left(PublicVariableName, 1)) + Mid(PublicVariableName, 2)

        TmpArray(2) = PublicVariableName

        ' OPTIONAL: XML comment header. It is better to have them.
        ResultString = "/// " & vbCrLf
        ResultString = ResultString & vbTab & vbTab & "/// " & vbCrLf
        ResultString = ResultString & vbTab & vbTab & "/// " & vbCrLf

        ' OPTIONAL: Added for ActiveRecord.
        ' OPTIONAL: If you don't use ActiveRecord, you may delete
        ' OPTIONAL: or comment out the line below
        ResultString = ResultString & vbTab & vbTab & "[Property]" & vbCrLf

        ResultString = ResultString & vbTab & vbTab & Join(TmpArray)
        ResultString = ResultString & vbCrLf
        ResultString = ResultString & vbTab & vbTab & "{"
        ResultString = ResultString & vbCrLf
        ResultString = ResultString & vbTab & vbTab & vbTab
        ResultString = ResultString & "get { return " & PrivateVariableName & "; }"
        ResultString = ResultString & vbCrLf
        ResultString = ResultString & vbTab & vbTab & vbTab
        ResultString = ResultString & "set { " & PrivateVariableName & " = value; }"
        ResultString = ResultString & vbCrLf
        ResultString = ResultString & vbTab & vbTab & "}"

        ' Move to the end of the line.
        TS.EndOfLine()

        ' Add two newlines.
        TS.NewLine()
        TS.NewLine()

        ' Insert the resulting text which corresponds to property definition.
        TS.Insert(ResultString)
    End Sub

End Module

Böylece mesela C# ile geliştirdiğim bir projedeki bir sınıfın C# kaynak kod dosyasına gidip aşağıdaki satırlardan herhangi birini seçip


private int orderNo;

private int _orderNo;

private int m_orderNo;

Alt+Shift+p bastığımda şöyle bir property metnini kaynak kod içinde elde edebiliyorum (tabii private değişken ismi de uygun şekilde gelecek şekilde):


/// <summary>
///
/// </summary>
[Property]
public int OrderNo
{
	get { return m_orderNo; }
	set { m_orderNo = value; }
}

Makro kodunun yorum satırlarında belirtildiği gibi [Property] lafı VS.NET ya da C#’a özgü değil, sadece şu anda kullanmakta olduğum Castle ActiveRecord isimli NHibernate tabanlı kalıcılık katmanı ile ilgili bu yüzden de opsiyonel.

Bunun yanısıra tabii ki henüz tüm değişken tanımlamalarını kapsar halde değil ve geliştirilmeye açık bir makro.

VS.NET 2005 ortamında makro yazmanın bir dezavantajı kodlamanın VB ile yapılmak zorunda olması ise, bir avantajı de elinizin altında tüm .NET sınıf kitaplığının bulunması. Söz konusu avantaj geniş ve derin bir işlevsellik sunmanın ötesinde alışık olduğumuz nesne modeli ile VS.NET 2005 IDE’sinin kendisinin de her türlü öğesine erişme ve onlara müdahale imkanı sağlıyor.

VS.NET 2005 makroları ile yapılabilecek çok daha sofistike ve karmaşık şeyler mevcut. Mesela kendi “refactoring” örüntülerinizi birer makro olarak kodlamak gibi.

Konu ile ilgili birkaç bağlantı: Using Visual Studio .NET Macros, Refactoring with Visual Studio Macros, Macro Madness, Transcript: Examples of Visual Studio Extensibility.

Advertisements
 
1 Comment

Posted by on July 18, 2006 in .NET, General, Programlama

 

One response to “İlk VS.NET 2005 makrosu

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: