Fluent Design Pattern
Fluent design pattern’nin temel amacı, bir nesneye her seferinde nesne adını yeniden belirtmek zorunda kalmadan nokta (.) İle bağlayarak bir nesneye birden çok özellik (veya yöntem) uygulayabilmemizdir.
Örnek olarak aşağıdaki gibi Employee sınıfımız olsun.
Yukarıdaki employee sınıfını kullanmak istediğimizde, genellikle employee sınıfının bir örneğini oluştururuz ve ilgili özellikleri aşağıda gösterildiği gibi ayarlarız.
Fluent design pattern kodunuzu daha basit, okunabilir ve bulunabilir hale getirerek nesne kullanım kodunuzu basitleştirir.
Buraya kadar bu design patternin ne işimize yaradığını ve bize nasıl kolaylıklar sağladığı ile ilgili bilgiler verdik.
Gelelim işin ön önemli tarafına bu patterni nasıl uygulayacağız? Aşağıdaki örnek kod bloğunda detaylı olarak anlatılmaktadır.
Yukarıdaki örnekte (.) diyerek her methoda erişebilir durumdayız. Bazen bu durum yaptığınız tasarıma bağlı olarak istenmeyebilir. Örneğin; Connect() methodunun sadece ilk başta gelmesini isteyebilir veya Send() methodunun enson da gelmesini isteyebilirsiniz. Özetle methodların sırasını siz belirlemek isteyebilirisiniz. Bu durum da aşağıdaki örnekte olduğu gibi bir tasarım yapabilirsiniz.
Yukardaki örnekte Class ilk çağırılırken Connect methodu gelecektir. Connect metodu IAzureBlob dönüş değerine sahip olduğundan bir sonraki çağırmada sadece OnBlob methodunun gelmesini sağlayacaktır. Bu şekilde zincirleme devam edecektir.
Fluent API’ların en güzel örnekleri Microsoft.Azure.*.Fluent kütüphaneleridir.
Bu kütüphanelerin en güzel özelliği komutları ve parametreleri (PowerShell betiklerinden farklı olarak) ezberleme ihtiyacını ortadan kaldırmasıdır.
Aşağıdaki kod yeni bir Kaynak Grubu üzerinde veritabanı ve güvenlik duvarı kurallarıyla yeni bir SQL Server oluşturur.
await Azure
.Configure()
.WithLogLevel(Level.Basic)
.Authenticate(credentials)
.WithSubscription("subscriptionId")
.SqlServers
.Define("sqlServerName")
.WithRegion(Region.EuropeWest)
.WithNewResourceGroup()
.WithAdministratorLogin("sqlAdmin")
.WithAdministratorPassword("pass")
.WithNewDatabase("databaseOne")
.WithNewDatabase("databaseTwo")
.WithNewFirewallRule("0.0.0.0")
.WithNewFirewallRule("1.1.1.1")
.WithNewFirewallRule("2.2.2.2")
.CreateAsync();