Dapper

905bb8f6-e568-4eda-a2a1-7e6b0b95420e

Herkese merhaba,

Bu makalede sizlere stackoverflow tarafından geliştirilen micro orm kütüphanesi olan Dapper dan bahsediyor olacağım.Dapper Entity Framework gibi tam bir ORM (Object Relation Mapper) kütüphanesi değildir. Diğer ORM kütüphaneleri ile karşılaştırıldığında en dikkat çekici özelliği performansıdır. Neredeyse ADO.NET kadar hızlıdır. Büyük ölçekli .NET projelerinde veri erişimi için ado.net yerine tercih edilebilecek en iyi alternatif diyebiliriz.

Dapper tek bir DLL den oluştur. Projenize nuget aracılığıyla aşağıdaki satırları yazarak dapper kütüphanesini ekleyebilirsiniz.

Örnek veri modelimizi aşağıda görebilirsiniz.

Company modeli için temel işlemlerimizi(CRUD) gerçekleştirmek istiyoruz.Bunu Dapper kullanarak yapacağız. Bunun için bir repository sınıfı yazdık.Temel işlemler bu sınıfın içerisinde yer alacak. Methodları incelediğinizde kodların içerisinde T-SQL sorgularını yazdığımızı da göreceksiniz. Dapper EF gibi otomatik sorguları oluşturmuyor. Tabi ki bunu sağlayacak Dapper-Extention kütüphanesi var. Buradan inceleyebilirsiniz.

Dapper Connection nesnesi üzerinden işlemleri gerçekleştiriyor.

Ayrıca kodun içerisine t-sql kodları yazmak istemiyorsanız bunların daha yönetilebilir olmasını istiyorsanız Stored Procedure leride kullanabilirsiniz. Aynı Repository sınıfın Stored Procedure kullanan şeklini de aşağıda görebilirsiniz.

Ayrıca dapper asenkron yapıyı  ve QueryMultiple() methodu ile de çoklu sorgu çekmemizi sağlar. Eğer dapper kullanıyorsanız projenize Dapper extention ı da ekleyerek dapper ı daha otomatik ve kullanışlı hale getirebilirsiniz. Temelini dapper oluşturan kendi projenize özgü veri erişim kütüphanesi oluşturabilirsiniz.

Aşağıda örnek proje dosyasını ve bağlantıları bulabilirsiniz.

İyi Çalışmalar

Proje Dosyaları ;

Teknik mülakatlar

Herkese merhaba diyerek başlamak istiyorum öncelikle. Uzun zamandır bloguma gereken özeni göstermediğimin farkındayım tabi ki bir sürü şey okuyup teknik şeyler deneyimliyoruz iş hayatında fakat bunlardan çok azını yazıyorum, işin korkunç olan kısmı bu yazım bile 2017’nin ilk yazısı. Neyse artık daha çok yazı yazmaya özen göstereceğim kendime buradan söz vermiş olayım.

Bu yazımda teknik mülakatlar üzerine deneyimlerimi aktarmaya çalışacağım.Yazılımcı olarak belirli dönemler de iş değişikliği veya yeni fırsatları değerlendirme anlamında bir dizi iş görüşmesinde katılıyoruz.Bu iş görüşmelerinin ilk olarak insan kaynakları ile görüşürsünüz.eğitim ve kariyer sürecinizden bahsedip genel bir tanışma havasında geçer bu görüşme. Daha sonra eğer olumlu bir izlenim bırakırsanız teknik insanlarla mülakat sürecine girersiniz.Bu aşamada teknik bilginizi ve analitik düşünme, problem çözme becerinizi ölçmeye yönelik sorular sorulur.

Bu görüşmeler yüz yüze olabileceği gibi skype üzerinden uzaktan bağlantı şeklinde de olabiliyor ve hatta teknik görümeler adayı daha iyi tanımak ve ölçmek için iki adet teknik görüşme isteyebilirler.

Yaklaşık 4.5 senedir profesyonel olarak yazılım geliştirici olarak çalışıyorum.Özellikle .NET teknolojilerinde uzman arkadaşlar için bu teknik mülakatlarda ne gibi sorular sorulduğuna dair bir liste paylaşacağım sizlerle.

  • String ve StringBuilder arasındaki fark nedir ?
  • Access Modifiers nelerdir ? Internal ?
  • Sealed nedir ?
  • Pattern ve Anti-Pattern kavramlarını açıklar mısınız ?
  • Reference-Type ve Value-Type nedir ? String ne tipindedir ?
  • OOP temelleri açıklayabilir misin ?
  • ORM nedir ? Hangilerini kullandın ?
  • Reflection nedir ?
  • Aspect Oriented Programming nadir ?
  • Interface ve Abtract Class arasındaki fark nedir ?
  • Process ve Thread ilişkisini söyler misiniz ? Multi-Thread nedir ?
  • Tek Process li bir CPU da birden fazla Thread oluşturabilir misin ?
  • Thread-Safe nasıl sağlanır ? Thread statusları nelerdir ?
  • Virtual – Override nedir ?
  • Dapper ı diğer ORM kütüphanelerinden ayıran nedir ?
  • WebStorage nedir ?
  • Micro servis nedir ?
  • Stored Procedure ve Function arasındaki farklar nedir ?
  • MVC nedir ? MVC life-cycle ı açıklayabilir misin ?
  • Sistemde bir sayfa çok geç yükleniyor, ilk önce bakacağın şey ne olur ?
  • Post-back ve call-back arasındaki fark nedir ?
  • Linq nedir ? ne işe yarar ?
  • Normalizasyon nedir ?
  • Asp.net MVC de HtmlHelper nedir ? TextBox ve TextBoxFor arasında ne fark var ?
  • RazorEngine nedir ?
  • SOLID prensipleri nedir ? bir kaçını açıklar mısınız ?
  • Tasarım desenleri daha önce hangilerini kullandın ? Bir kaçını açıklayabilir misin ?
  • Singleton ve Static sınıflar arasında ne fark var ?
  • Jquery de == ve === arasındaki fark nedir ?
  • Bir tabloda A.B ve C kolonlarına index tanımladım.Daha sonra tablodan sorgu çekerken where ifadesine sadece A ve B için kriter ekledim. Bu durumda Index çalışır mı ?
  • Index nedir ne işe yarar ? clustered Index nedir ?
  • Rest API nedir ?

Bu tür soruları ikiye ayırabiliriz. Temel yazılım geliştirme soruları; tasarım desenleri, prensipler nesne yönelimli sorular vs. ve teknoloji odaklı sorular; asp.net mvc, razor engine, jquery vs.

Şirketler özellikle yüz yüze olan mülakatlarda genele 10 soruluk bir sınav da yapabiliyor. Burada bazı kod parçalarını vererek hatayı bulmanızı veya kodun çıktısını yorumlamanızı isteyebilirler.

Örneğin ; Aşağıdaki resimde bunun benzeri bi soru göreceksiniz. Her bir mesaj ayrı bir soru olarak düşünün kalıtım ve type dönüşümlerine ait bir soru. kod parçasınınn hata alıp almayacağını hata alırsa runtime-error mü yoksa compile-error mü olacağını soruyor.

Bazı sorular ise problem çözmeye becerinizi ölçmeye dair sorular. Örneğin ;

  • Bir üçgen düşün. bu üçgenin her köşesinde bir karınca var ve hepside aynı hızda yürüyorlar ve hepside üçgenin çizgileri üzerinde yürüyorlar. Bu karıncaların çarpmama olasılığı kaçtır ?
  • Bir yazılımcınız var ve bu yazılımcıya A/G olarak her gün sonunda bir külçe altın veriyorsunuz. Elinizde de 7 külçeli bütün bir altın var.Tabi ki bu külçeler bölünebiliyor. Elinizdeki bu 7 parçalı altını toplamda iki kere bölerek 7 gün boyunca yazılımcının A/G bedelini ödemeniz gerekiyor nasıl yaparsınız ?
  • Sınırsız bir su kaynağınız var. 3 ve 5 litrelik bir su kabınız var. Bir de 4 litrelik bir su kabı var.Elinizdeki 3 ve 5 litrelik kapları kullanarak 4 litrelik kaba su koymanız gerekiyor. Kaplarda kalan sular dökülmeden bunu nasıl yaparsınız ?

Ekte yazılı bir mülakat sorularını bulacaksınız. Technical_Interview_Questions indirebilirsiniz.

Umarım faydalı olmuştur. Görüşmek üzere

Template Method Tasarım Deseni

Capture

Bu yazımda template method tasarım desenini anlatmaya çalışacağım.Aşağıda bununla ilgili güzel bir örnek de bulacaksınız.

Madde madde anlatalım ;

  • Davranışsal tasarım deseni grubuna girer ve %60 kullanım oranına sahiptir.
  • Bir işlemi gerçekleştirmek için gerekli alt adımları net olarak bilinen (algoritmik akışı olan) ve bu alt adımları temel sınıfta soyut olarak tanımlayarak algoritmanın nasıl işleyeceğini template method belirler.
  • Template method tasarım deseni ; algoritma adımlarını soyut bir sınıfa(abstract) tanımlayarak asıl sınıflar(concrete) tarafından ezilip(override) çalıştırılmasını düzenler.
  • Template method tasarım deseni , bir algoritmanın (algoritma iskeletinin) bir den fazla biçimde veya içerikle çalışmasını sağlar.
  • Eğer algoritma iskeletinde bir değişiklik yapılacaksa bu tek bir yerden yapılır ve böylece kod tekrarı önlenmiş olur.

Desenin UML şeması ;

Template_method_pattern_class_diagram

Template tasarım deseni için gerçek dünya senaryoları ;

Örnek senaryo ; 

Şirketler için gerekli olan bir çok raporlama şekli ve rapor vardır.Bu raporlarlar bir araç aracılığıyla rapor kaynağını okuyarak excel, word, pdf, txt gibi çıktıları üretir ve önceden tanımlanmış dizinlere belirli aralıklarla(günlük,haftalık,aylık) atar.Bu yazı için kodlayacağımız senaryo da bu rapor üretimi ile ilgilidir.

Örnek senaryomuz (rapor oluşturma adımları) için algoritmik akış adımları ;

  • GetReportDefinitions : rapor için konfigure edilmiş ayarlar alınır.örn; raporun dosya tipi,çıktı dizini,rapor kodu gibi
  • RunReportJob : rapor verisini oluşturacak iş çalıştırılır.
  • ValidateReport :  rapor yer alan içerik tiplerinin valide olup olmadığının kontrolü yapılır
  • CreateReportFile : rapor kaynağına göre fiziksel dosya oluşturulur.
  • ExtractReportFile : dosya belirtilen dizine atılır.

Kod parçası ; 

  • Raporların üretimi için bir (baseprocessor) temel işlemci sınıfı tasarlıyacağız.Bu sınıf her rapor için aynı olan işlemleri, loglama yapısınını ve olay mekanizmasını içeriyor.Her rapor işlemcisi bu temel işlemci sınfını (baseprocessor) kalıtmak zorundadır.
  • Burada konumuzla alakalı olmamasına rağmen (event) olay mekanizması ekledim ve bunun faydalı olacağını düşünüyorum.
  • Burada primitive method lar List olarak bir liste halinde türeyen sınıfdan alınır ve baseprocessor bunu teker teker çalıştırır.Böylece daha dinamik bir template method kullanımı elde etmiş oluyoruz.Eğer istenirse raporların oluşumu için gerekli methodlar belli olduğundan List tipinde tanımlanmayıp doğrudan istenilen method lar (GetReportDefinitions,RunReportJob,ValidateReport,CreateReportFile) eklenebilir ve algoritmik sırasıyla çalıştırılabilirdi.
  • List olarak tanımlanan primitive methodlar SortedList olarak tanımlanarak ve sıralı bir şeklide çalıştırılılması daha mantıklı olur.
  • Burada önemli olan baseprocessor sınıfında bulunan Processor ve SubProcessor sınıfıdır.Aslında bu iki methodu tek method olarak da kabul edebiliriz.Uzun içeriğe sahip bir method olmaması için ikiye bölerek işlemleri gerçekleştirdim.Processor methodu Template Methottur.Bu method içerisinde türemiş sınıfta(reportprocessor) verilen primitive methodlar çalıştırılır.BaseProcessor sınıfı Abstract sınıf ve reportProcessor sınıfı Concrete sınıftır.

Yardımcı tipler

Eventler için EventArg, processor sınıfının durumunu belirtmek için kullanacağımız ProcessorStatus sınıfı ve baseprocessor sınıfı için bir interface yer alıyor.

BaseProcessor sınıfı ;

ReportProcessor sınıfı ;

Kullanımı; burada genel kullanımı gözlemlemek için doğrudan reportprocessor sınıfı yazdım aslında şu şeklide de yapılabilirdi.Her rapor için bir reportProcessor sınıfı yazıp gerekli methodları set edip istenilen istenilen rapor ilgili rapor işlemcisi aracılığıyla çalıştırılarak oluşturulabilir.

Sınıf diagramı ; örnek senaryomuzun kodlarını yazdık ve incelediysek şimdi sınıf diagramı üzerinde de görelim.

Capture_template_method

Yukarıda da bahsettiğim bu örnek uygulamanın desenin kullanımını daha net görebilmeniz için ikinci bir versiyon olarak kodlama yaptım.Burada çok daha net olarak template method tasarım deseninin kullanımını göreceksiniz.Örneğin ikinci versiyonunda algoritmik akış methodları doğrudan baseprocessor sınıfına yazıldı.

Örnek kodlamahttps://gist.github.com/yemrekeskin/8282604

Kodlamanın ikinci versiyonuhttps://gist.github.com/yemrekeskin/8299220

Diğer örnek kodlama için sınıf digaramını aşağıda görebilirsiniz.

Capture_v2_template_method

İlgili linkler

Bu yazımdan da bu kadar umarım yararlı olmuştur.

Abstract Factory Tasarım Deseni

header_abstract_factory

Yaratımsal desen kategorisinde yer alan diğer bir desen ise abstract factory desenidir.Bu desenin birbiriyle ilişkili veya bağlı olan sınıfların (nesne ailelerinin) üretiminin tek bir arayüz veya soyut sınıf ile yapılmasını sağlar.Böylece tek bir sınıf ile istenilen nesne aileleri üretilmiş olur.

Bu desen için verilen en popüler örnek veritabanı provider yapısıdır.Veri odalı bir yazılım sisteminin veritabanı olarak MS-SQL kullandığını varsayın ve veri işlemleri için doğrudan framework tarafından sağlanan SQL sınıflarını kullandım.Bu kod yazış biçimi bizi aşırı bağımlı bir yapıya götürüyor.Sistemimizin veri kaynağının değişmeyeceğini öngörüyor olsak bile framework sınıfları wrap edecek sınıflar yazmamız gerekir.Yazılım kaynağının değişeceğini ya da sistem içerisinde bazı modüllerin Oracle bağlantısına göre bazı modüllerinin ms-sql veritabanına göre davranması gerekebilir.Bu bahsettiğim senaryo aslında bir veri erişim modelinin (Connection,Command,Transaction) diğer bir deyişle ürün ailesinin farklı tiplerde olabileceğini farklı versiyonlarının olacağını görüyoruz.Bu gibi senaryolar da soyut fabrika desenini kullanabiliriz.Bu senaryoya ait örnek kod parçasına buradan ulaşabilirsiniz

Benzer yapı .NET Base Library içerisinde yer alıyor.

untitled

Genel olarak soyut fabrika deseni ;

  1. İlişkisi veya bağlılığı bulunan nesnelerin üretimi efektif ve kolay bir şeklide gerçekleşir.
  2. İstemci doğrudan asıl ürünle konuşmaz.Asıl ürüne erişmek istediğinde onun için tanımlı olan arayüz ile konuşur.Böylelikle ürün ailesindeki değişiklikler istemci kodunda herhangi bir değişikliğe ihtiyaç duymaz.Aynı zamanda daha test edilebilir bir yapı ortaya çıkmış olur.
  3. Asıl ürünlerden soyutlanmış sınıflar veya arayüzler üzerinden kullanıldığı için kolayca başka nesne grupları gerekli implementasyonlar yapıldığı takdirde desen içerisine ve üretime dahil edilmiş olur.
  4. Birbiri ile ilişkileri olan nesneleri üretimini soyutlamak için sorumlu işlem methodlarında basit if-else , switch ifadelerini kullanarak da gerçekleştirebiliriz.Fakat bu tarz bir kodlama değişim ve ekleme işlemleri için sıkı kod yazılmasını beraberinde getirebileceği gibi işlem methodların sorumluluk alanının dışına çıkılmış olunur.Üretimde if-switch gibi alt seviye kodlar kullanılmadığı için değişimlere kolayca ayak uydurur.
  5. Factory method deseni yerine soyut fabrika desenini kullanabiliriz.
  6. Genel olarak fabrika method sınıflarını genelleştirmek için kullanılır.

 Tasarım

Aşağıda desenin UML diagramını görüyoruz.

capture

 

Desene ait bazı kavramlar ;

Concrete Product; Birbiriyle ilişkisi bulunan nesneler ve asıl üretilmesi istenilen nesnelerdir. (ProductA1 , ProductA2 , ProductB1 , ProductB2)

Abstract Product; birbiriyle ilişkisi bulunan sınıfları tek bir tip altında tanımlayabilmek için kullanılır.Concrete product  sınıfları tarafından uygulanır veya implement edilir.İnterface ve abstract class olarak yazılabilirler. (IProductA , IProductB)

Concrete Factory ; İçerisinde nesne ailesine ilişkin concrete product nesnelerinin üretiminde sorumlu methodları içerir.Asıl fabrika sınıflarıdır.Bu sınıf abstract factory sınıfını gerçekleştirirler.(Factory1 , Factory2)

Abstract Factory ; Factory sınıfları için soyut bir tip sağlar ve içerisinde yine abstract product sınıfları için methodlar bulunur. (IFactory)

Bir kaç tasarım alternatifleri

  • Burada nesnelerin oluşturulması concrete factory sınıfları içerisinde gerçekleşir.Nesne oluşturma sürecini burada istediğiniz gibi  kurgulayabilirsiniz. Örneğin nesne oluşturmak için Dependency Injection gibi yapıları kullanabilirsiz
  • Factory sınıflarının fazla olduğu durumlar da generic bir factory sınıfı kullanabilirsiniz.
  • Delegate tabanlı factory sınıfları tasarlayabilirsiniz.
  • Yazacağınız fabrika sınıflarının istemci kod tarafından doğrudan kullanılması yerine bunun için bir wrapper sınıf yazarak tek bir factory tipi ile o ürün ailesi ile ilgili tüm alt sınıfların üretilmesini ve ilgili temel işlemlerin yapılmasını sağlayabilirsiniz.

Örnek Senaryo ve kodlama

Raporlama ile ilgili örnek bir senaryomuz var.Bir online bankacılık uygulmasın da müşterilerin günlük veya aylık gibi çeşitli periyotlarda hesap hareketlerini alabildiği bir fonksiyonellik düşünün.Teknik olarak elimde bir veri seti var ve bu veri setini seçeneğe göre excel veya pdf olarak bir çıktı üretmem gerekiyor.Bu ihtiyaç için iş çatısının (business framework) ilgili yerine bu fonksiyonelliği sağlayacak kodları yazıyoruz.Aşağıda başlangıçta kullanacağım kodlarım yer alıyor

Kodlara baktığınızda rapor tipinden bağımsız olarak 3 işlemsel fonksiyonum (ReportConnector,ReportFormatter,ReportWriter) var.Bunlar bir ürün ailesini temel fonksiyonları ve bunların kalıtımı sonucunda PDF ve excel için iki farklı ürün ailesi elde ediyoruz.

Yukarıda fabrika sınıflarının kodlamalarını göreceksiniz.Ek olarak bu sınıfların nasıl kullanılabileceğinide örneklemiş olduk.İstemci kodun doğrudan fabrika asıl fabrika sınıflarına erişmemesi için ReportGenerator sınıfını tanımladım.Bu sınıf aracılığıyla raporlamaya dair bir çok iş gereksinimi gerçekleştirebilirim.Tabi biraz method eklemeniz gerekebilir.Ayrıca bu sınıfın genişleyebileceğini düşündüğüm için statik bir sınıf olarak tanım yapmadım ve  çalışma zamanında tek bir instance nın olması için singleton olarak tasarladım.

Şimdi de örnek uygulamamızın sınıf diagramını görelim.

capture_2

İlişkili desenler

Bu desen Factory method deseni ile benzerlikler gösterir.Tek farkla bir fabrika sınıfı yerine birden fazla fabrika sınıfını barındıracak soyut bir sınıf yaratılır.Bu desen fabrikaların fabrikası olarak da isimlendirilir.

Şimdilik bu kadar.Yazıda yanlış olduğunu düşündüğünüz yerleri lütfen yorumlayın 😀