C# Feature Toggle Kullanımı

Feature Toogle,Feature Flags, Feature Bits, or Feature Flippers adlarıyla da bilinen,sistem davranışlarını değiştirmeden kodumuzu geliştirmeye yarayan bir tekniktir.Var olan kod repomuzda ekipteki diğer kişiler çalışmaya devam ederken,sizin yaptığınız geliştirmenin,refactoring belki,aylar alacaktır.Bu süreçte kod bloğunu master veya ana repomuz hangisiyse ondan güncel tutmaya çalıştıkça,baş edilemeyen merge issue ları çıkacaktır.Bu gibi durumları aşabilmek için Martin Fowler ın makalesini okuyabilirsiniz.Avantaj ve dezavantaj gibi durumlar tabii olacaktır.

FeatureToggle kütüphanesi ile basit örneğimiz aşağıda yer almaktadır.İlk önce “Install-Package FeatureToggle” komutu ile Nuget paketimizi indirelim.

Aşağıdaki örnekteki gibi sınıfımızı SimpleFeatureToggle classımızdan inherit etmemiz gerekmekte.Bu örneğimizde aynı methodumuzda feature umuz olarak farklı bir hesaplama yöntemi ve dönüş olarak farklı bir string döndürmek istiyoruz.Aşağıdaki örneğimiz gerçek hayattaki senaryoya uymamış olabilir ama genel mantık bu şekildedir.

Continue reading

GoLang Kurulumu

GoLang ın Windows işletim sistemine nasıl kurulacağından bahsedeğim.Şu adreste çeşitli işletim sistemlerine nasıl kurulacağına dair bilgilendirme mevcut.Bu adresten  ilk önce msi paketini indiriyoruz.

İndirme işleminden sonra msi installer ı çalıştırarak,next next diyerek kurulumu tamamlayabilirsiniz.Default olarak C:\Go klasörüne kurulum yapılmakta,isterseniz bu klasörü değiştirebilirsiniz ben bunu tercih etmedim.Daha sonrasında Environment Variables da Path e C:\Go\bin değişkenini (default klasör yerine başka bir klasör tercih etti iseniz o path i vermelisiniz.)eklemeniz gerekmektedir.Environment Variables a System->Advanced->Environment Variables ile ulaşabilirsiniz.

Test etmenin kolay yolu,komut satırından aşağıda görüldüğü gibi go version komutu ile kontrol edebilirsiniz.

Command Design Pattern

Command Design Pattern,Behavioral(Davranışsal) tasarım kalıplarından birisidir. Genellikle,algoritmayı ,nesneler arasındaki ilişki ve sorumlulukları yönetmek için kullanılır.

GOF kitabında tanım olarak aşağıdaki ifade verilmiştir.

Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.

Continue reading

Singleton Pattern

Singleton pattern,kısaca nesnemizden sadece bir örnek oluşturulup kullanılmasıdır.

Hangi durumlarda kullanırız.Thread pools,cache,kayıt defteri gibi merkezi durumda olan ayarları kullanan objeler,loglama için kullanacağımız obje leri yaratırken bu pattern i uygulayabiliriz.Birden fazla obje oluşturmanın sistem üzerinde oluşturacağı yanlış durumlar oluşturacağı zaman yararlanabiliriz.

Global variable tanımlayıp kullanmadan farkı nedir diyecek olursak,global variable atadığımız bu obje uygulamanın başlangıcında oluşturulur.Bu nesne yoğun bir kaynakta kullanıyor olabilir ve uygulamanız bu objeyi kullanmadan sonlanmıyorsa,sistemde hatalar oluşabilir.

Continue reading

.Net Core CLI Tools

Visual Studio 2017 veya .NET Core sdk ınızı yükledikten sonra,dotnet isimli CLI tool u yüklenir.dotnet  CLI ın sahip olduğu komutlar aşağıda yer almaktadır.Komut satırından dotnet -h komutunu yazdıktan sonraki ekran görüntüsü aşağıdaki gibidir.

dotnet new console:    Yeni console projesi oluşturur.
dotnet new classlib:     Yeni classlibrary projesi oluşturur.

Continue reading

Interface Explicit vs Implicit

Explicit ve Implicit interface implementasyonlarını açıklamaya çalışacağım.Explicit  apaçık, vâzıh, sarih, âşikâr, açık-seçik, anlaşılmadık nokta bırakmayan anlamına gelmekte.Implicit ise gizli, saklı, âşikâr olmamakla beraber gizlice anlaşılabilen, aslında olan olarak karşılıkları yer almakta sözlükte.

Basit olarak implicit olarak implemente ettiğimizde ,interface methodlarımıza vs direk olarak erişebiliriz.Explicit de ise sadece class ımızı interface e cast ederek kullanabiliriz.

Explicit interface implementasyonunu,eğer aynı method ve propertyleri içeren iki interface i aynı sınıfa implemente ettiğimiz durumlarda kullanmak zorunda kalırız.
Örnek olarak aşağıdaki kod bloğuna bakabiliriz.

Continue reading

C# BenchmarkDotNet Kullanımı

Aslında bu yazıyı Entity Framework,Dapper ve Ado.Net karşılaştırmasını yazmak için düşünüyordum ama benchmarkdotnet kullanımına evrildi.

Projemizi oluşturduktan sonra Nuget den Install-Package BenchmarkDotNet ile yüklüyoruz.Aşağıdaki kod örneğindeki gibi performans karşılaştırması yapacağımız methodları yazıyoruz.Methodlara Benchmark attribute ini ekliyoruz.


[Benchmark]
public string StringConcat()
{
      return String.Concat(Enumerable.Repeat("a", 1000).ToArray());
}

[Benchmark]
public string StringBuilder()
{
      StringBuilder sb = new System.Text.StringBuilder();
      sb.Append('a', 1000);
      return sb.ToString();
}

Bu iki methodun karşılaştırmasını yapmak için BenchmarhRunner sınıfının Run methodunu kullanıyoruz.


 class Program
 {
      static void Main(string[] args)
      {
        var summary = BenchmarkRunner.Run(typeof(PerformanceProblem));
      }
 }

Debug modda çalıştırdığınızda sadece konsola yazdırmasına rağmen,release modda derlediğiniz exe yi çalıştırdığınızda Release klasörünün altına BenchmarkDotNet.Artifacts klasörünü oluşturuyor.Bu klasör altında ise results klasörü ve log dosyası bulunuyor.results klasöründe ise html,cvs ve md formatlarında benchmark sonucunu gösteren dosyaları oluşturuyor.

Aşağıda görmüş olduğunuz,sonucun çıktısı.

 

Son olarak git hesabımdan bu örnek projeye bakabilirsiniz.

 

 

 

C# Observer Pattern Kullanımı

Her hafta bir desgin pattern yazmaya çalışacaktım ama bu disiplini sağlamakta hayat koşuşturmasında biraz geciktiriyorum.

Bu kısa makalede behavioral(davranışsal) tasarım kalıpları grubunda yer alan,observer tasarım desenini anlatmaya çalışacağım.

Observer pattern,objeler arasında one-to-many ilişkiye sahip,bir objenin durumu değiştiğinde diğer objelerinde haberdar olmasını sağlayan bir yapıdır.Publisher/Subscriber olarak tanımlanmaktadır.Bir publisher(yayınlayıcı) vardır ve diğer üyeler bu publisher e subscriber olmaktadır.

İlk başta publisher olarak yani takip edilecek objemiz için implemente edeceği methodlar interface olarak tanımlıyoruz.


interface INotifiy
 {
 void RegisterObserver(IObserver observer);
 void RemoveObserver(IObserver observer);
 void NotifyObservers();
 }

Sonra concrete classımız olan Membership e INotifiy interface ini implemente ediyoruz.


class Membership : INotifiy
{

private IList<IObserver> observers;
public Membership()
{
observers = new List<IObserver>();
}

public void NotifyObservers()
{
foreach (var observer in observers)
{
observer.Update();
}
}

public void ChangeStatus()
{
NotifyObservers();
}

public void RegisterObserver(IObserver observer)
{
observers.Add(observer);
}

public void RemoveObserver(IObserver observer)
{
observers.Remove(observer);
}
}



Daha sonrasında değişen objemize observer olacak objeleri oluşturuyoruz.



interface IObserver
{
void Update();
}

class AccountExecutiveObserver : IObserver
{

public AccountExecutiveObserver(INotifiy notifiy)
{
notifiy.RegisterObserver(this);
}
public void Update()
{
Console.WriteLine("Heyyy.");
}
}


static void Main(string[] args)
{
Membership memberShip = new Membership();
AccountExecutiveObserver observer = new AccountExecutiveObserver(memberShip);
memberShip.ChangeStatus();

}

 

Abstract Factory Method

Abstract factory pattern,concrete sınıfları belirtmeden ilgili veya bağımlı nesnelerin ailelerini oluşturmak bir interface sağlayarak yazılır.Factory of factories diye de tanımlanır.
(Factory türkçe karşılığı fabrika/imalathane olarak geçmektedir.Buradan yola çıkarak bir üretici olarak tanımlayabiliriz)

Örnek verecek olursak,aşağıda interface lerimizi ve bu interfaceleri implemente eden concrete sınıflarımızı yazdık.

Continue reading

Interface Segregation Principle

Birbirinden bağımsız birden fazla method içeren interface ler yerine daha küçük interface ler yazmak daha maküldür.Yabancı literatürlerde bu çok method ihtiva eden interface ler fat interface olarak geçiyor.Bu şekilde interface leri kullandığımızda impplemente ettiğimiz her  nesnenin interface in barındırdığı özelliklerine sahip olması gerekmeyebilir.Bu durumda o methodlar boş olarak kalacaktır.Bu kötü kullanıma örnek vermek gerekirse.

interface IRobot
{
   void Run();
   void Fire();
   void Fly();
   void LaunchRocket();
}

Continue reading