Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…

Kim kurgulayıp, yaptıysa ayağa kalkıp, önümü ilikleyip öyle alkışladım. Keyifli bir video olmuş…

Yakın zamanda Devnot‘a yazdığım TDD (Test-Driven Development) Yapmak Gerçekten Zor Mu? yazısının devamı niteliğinde biraz daha kod örnekleri ile bu sormuş olduğum sorunun cevabını vermeye çalışacağım. Basit bir senaryo üzerinden, yine basit bir kod yazarak; hani kod yazmadan, nasıl testi yazılır problemi var ya, bunu anlamaya bir yandan da anlatmaya çalışacağım…

Belli bir miktarda paranın aylık faiz miktarını hesaplamamız gerekiyor. Ana para 10.000’den büyük olursa faiz oranı maksimum % 3, 10.000’den küçük olursa da maksimum %1.5 olacak şekilde hesaplanmalıdır. Sadece aylık zaman dilimine göre hesaplanmalı ve bu zaman 1 yılı geçmemeli.

Ekonomiye can katacak bu çok basit müşteri talebi ya da analiz çakması ihtiyacımız; işte artık nasıl yorumlarsanız, uygulamamızın ilk hali aslında. Böyle uzun uzadıya tasarım yapabileceğimiz bir örnek olmasa da kabaca nasıl yaparız bunu düşünelim önce.

Öncelike bir tane FinancialManager diye bir sınıfımız olsun mesela. Bu ana paramızı emanet ettiğimiz sınıf…SetCapital metotu ile ana paramızı belirtelim. Bu sınıf üzerinden faiz oranını tanımlayabilelim, SetInterestRate mesela. İstersek değiştirebilelim. Aynı şekilde SetPeriod ile aylık zamanı da belirtip, değiştirelim. Bütün bu tanımlamalara, FinancialManager sınıfının özelliklerinden ulaşabilelim. Ana para(Capital), faiz oranı(InterestRate), aylık zaman(Period) falan…Bütün bu özellikler belirtildiği zamanda CalculateInterest ile faiz miktarını hesaplayabilelim.

Sınıf, metot, özellik falan…Biraz daha koda yaklaştık. Teknik olarak biraz daha anlaşılır oldu sanki. Bu aşamadan sonra kodu yazmak biraz daha kolay, hatta direkt yazalım…Test etmeye ne gerek var?

Dııttt yanlış….

Teknik olarak, ne yapacağımızı oluştursak da, kodu yazarken hata yapma oranımız çok yüksek. Çünkü parametrelerimiz değişken, dikkat etmemiz gereken ve sağlamamız gereken belli şartlar var falan filan… Bu hatalar kod gelişmeye başladıkça karşımıza zaten çıkacak. Baştan farkında olup, kod geliştikçe ortadan kalkacak şekilde düşünürsek ama, daha sağlıklı bir kodumuz olacaktır. O yüzden hadi test yazalım…

Bu örneği Visual Studio’nun test proje şablonunu kullanarak yapacağım. Farklı proje şablonları ya da test framework’leri de kullanabilirsiniz tabi. Birim testi için bir sürü framework var. Farklılıkları olsa da hepsinin ortak noktası daha çok. O yüzden araçtan çok, konsepte odaklanmak bu aşamada daha doğru olacaktır.

TestÖncelikle bir tane Unit Test, bir tane de Class Library şablonundan iki proje oluşturalım. FinanceApp olsun bir tanesi, bunun test projesi de FinanceApp.Test olsun. FinanceApp’in içerisinde de hiç bir sınıf falan olmasın…Silelim, şablonla gelen Class1’i…Gerek yok.

Bizim şimdilik işimiz FinanceApp.Test projesi… O yüzden UnitTest.cs dosyasını açalım. Fark etmiş olduğunuz gibi içinde boş bir tane test metodu olan, test sınıfımız bu dosyanın içinde.

namespace FinanceApp.Test
{
    [TestClass]
    public class UnitTest
    {
        [TestMethod]
        public void TestMethod1()
        {


        }
    }
}

İlk testimizi de, bu TestMethod1’in ismini Test_SetCapital şeklinde değiştirerek içine yazalım…

namespace FinanceApp.Test
{
    [TestClass]
    public class UnitTest
    {
        [TestMethod]
        public void Test_SetCapital()
        {
            FinancialManager manager = new FinancialManager();
            manager.SetCapital(100.0);

            double expected = 100.0;
            double actual = manager.Capital;

            Assert.AreEqual(expected, actual);

        }
    }
}

Yukarıda özetlediğim gibi, basitçe test kodunu yazmaya çalıştım. FinancialManager diye bir sınıf olduğunu farz edip, bundan bir nesne yarattım. SetCapital() metodu ile de ana paramı tanımladım. Daha sonra expected ve actual değerlerini, karşılaştırıyorum. Bu iki değer bir biri ile aynı olursa testimiz başarılı sonuçlanmış demektir.

Test_1

 

Devam…

MEF(Managed Extensibility Framework) ile ilgili geçenlerde küçük bir soru ile karşılaştım. Burada da bahsetmek isterim. Ama önce MEF nedir, ne değildir hatırlamak isteyenlere önceki yazılara bir göz atmalarını tavsiye ederim…

  1. MEF ile esneklik kazanıyoruz…
  2. MEF’de “Part”lara kendi “metadata” bilgilerimizi nasıl ekleriz acaba?
  3. MEF’i basit bir WPF uygulaması ile daha iyi anlıyoruz…
  4. Managed Extensibility Framework(MEF)’de ki kataloglar…
  5. Asp.Net MVC Framework’de MEF ile Controller eklentileri…

Neyse gelelim, soruya… MEF alt yapısını kullanarak, uygulamalarızı genişletirken, “Part”ları [Export] özelliğini kullanarak belirtiyoruz. MEF’in olmazsa olmaz, en önemli özelliği aslında. Bununla ilgili olarak,  “Her geliştirilen “Part” bu şekilde [Export] özelliğine sahip olmalı mı,tek bir ortak yapı ile olmaz mı?” manasında bir soruydu gelen. Hemen bakalım…

MEF alt yapısı ile uygulamalarımızı genişletmek için kullandığımız parçaları mutlaka tanımlamamız lazım. MEF’deki kataloglar ve konteynırlar bu tanımlamalara göre oluşturduğumuz parçaları yaratıyor ve ayağa kalkmasını sağlıyor. Bildiğiniz üzere de [Export] bunu sağlayan özellik. Ama her parçaya bunu yazmak pek tercih edilen bir yöntem olmayabilir. Bu da aslında temel olarak iki sebepten olabilir. Bir tanesi MEF alt yapısını dışarısı ile paylaşmak istememek, bir diğeri de tüm koduna müdahele edemediğimiz uygulamaları genişletme ihtiyacı…

Öncelikle normalde nasıl yaptımızı hatırlayalım. Aşağıdaki kod örneği sanırım bunun için yeterli olacaktır.


    public interface IPlugin
    {
        void Execute();
    }

    [Export(typeof(IPlugin))]
    public class PluginA : IPlugin
    {

        public void Execute()
        {
            throw new NotImplementedException();
        }
    }

    [Export(typeof(IPlugin))]
    public class PluginB : IPlugin
    {

        public void Execute()
        {
            throw new NotImplementedException();
        }
    }

Burada her IPlugin arayüzünden geliştirilen, “Part”a, [Export] özelliğini yazmak yerine, BasePlugin şeklinde bir temel sınıf olup, “Part”ların o sınıftan türemesi istenebilir. Böylece “PlugX” şeklinde geliştirilen her sınıf, hem belli standart özellikleri sağlıyor olur, hem de [Export] özelliği o sınıf tarafından yönetilebilir. Ayrıca tüm koduna müdahele edemediğimiz, ama belli bir sınıftan türeyen sınıfların, MEF Part’ları olarak yorumlanmasını da istersek, bu belli sınıfa sadece bir özellik ekleyerek, yazılımcıdan “Part” kavramını soyutlayabiliriz.

MEF’de bunun için [InheritedExport] özelliği sunuyor.  Sadece bir sınıf ya da arayüze [InheritedExport] özelliği eklemek, bunlardan türetilen tüm sınıfların “Part” olarak yorumlanmasını sağlayacaktır. Bu sayede Export özelliği tek bir yerden yönetmek mümkün olacaktır.


    [InheritedExport(typeof(IPlugin))]
    public abstract class BasePlugin : IPlugin
    {

        public void Execute()
        {
            Process();
        }

        public abstract void Process();
    }

    public class PluginA : BasePlugin
    {

        public override void Process()
        {
            throw new NotImplementedException();
        }
    }

    public class PluginB : BasePlugin
    {

        public override void Process()
        {
            throw new NotImplementedException();
        }
    }

Bu basit ama bir o kadar da anlamlı özellik, kodun kirlenmesinin de önüne geçiyor diye düşünüyorum. MEF ile çalışmayı düşünen ya da çalışanlar için umarım faydalı olur.

4 Nisan 2015, Cumartesi günü 9.su düzenlenecek olan .Nedirtv Yazılım Teknolojileri etkinliği bu sefer biraz daha yoğun geçecek…Yok yok, o derece… Yine ücretsiz gerçekleşecek olan etkinlikte, bu sene paralel oturumlar ile, Big Data’dan, uygulama güvenliğine, TDD’den, Mobile uygulama geliştirmeye kadar farklı bir çok konu var. Oldukça keyifli bir ortamın olacağı garantisini de şimdiden verebilirim…Kaçırmayın derim…

Etkinlik ile ilgili ayrıntıları ve katılmak için kayıt işlemini http://nedirtv2015.eventbrite.com/ adresinden gerçekleştirebilirsiniz.

afisnedirtv

 

 

15 Mart‘da İstanbul’da şahane bir teknoloji etkinliği var… Women Techmakers Istanbul 2015 adı altında, GDG Istanbul grubunun ön ayak olduğu bu etkinliğin oldukça geniş bir içeriği var. Tek gün olmasına rağmen, paralel oturumlar ile bir birinden değişik, özel ve güncel konuları bulabileceksiniz. Bu etkinliğin bir diğer önemli noktası da, anlatılacak konuların, konusunda uzman kadınlar tarafından aktarılacak olması. Keşke bunun özel bir durum olmadığı bir dünyada, özellikle ülkede yaşıyor olsaydık. Cinsiyet ayrımı olmadan, farkındalığı insanların yarattığı bir ülke için, teknoloji sektöründe olan herkese bu etkinliği tavsiye ederim. IBM’den, Turksat’a, Monitise’dan, ThoughtWorks’e kadar bir çok farklı şirketten çok farklı şeyler duyacağınızı garanti ediyorum…

Ayrıntılı bilgi, program ve kayıt için http://wtmistanbul.com/ adresini ziyaret edebilirsiniz.

womentechWomen Techmakers Istanbul 2015
15 Mart 2015 @ 8:30
Yer: Bahçeşehir Üniversitesi,Beşiktaş
KAYIT OL

 

Programa kısaca göz atmak isterseniz, aşağıdaki resime tıklamanız yeterli…Program