Repository Pattern Nedir? Neden Kullanmalıyız?

Eyyoo eyyoo herkese selamlar…

Yazılım merakını dindiremeyip, ileri düzey konularını araştıran her insan mutlaka Design Pattern kavramıyla karşı karşıya gelirler. Yazılım hayatında birden fazla design olsa da asıl önemli olan hangi Design Pattern’i hangi zamanda ve onu nasıl kullanacağımızdır. Repository Pattern, Builder Design Pattern, Adapter Pattern, Command Design Pattern gibi birçok dizaynları görüp karşı karşıya geleceksiniz. Peki bunlardan Repository Pattern nedir? neden ve nasıl kullanmalıyız gelin hep birlikte incelemiş olalım…

Konuyu anlatmadan önce unutmayalım ki.. Nesne yönelimli programalanın (OOP) amaçlarından biri; benzer kodları tekrar tekrar yazmak yerine bir yere yazıp onu kullanmaktır.  Yani benzer kodları tekrar yazmaktan bizi kurtararak hem projemizin kodunun anlaşılır olmasını hemde zamandan tasarruf etmemize neden olur.

# Peki Repository Pattern nedir ve neden kullanırız?

“Veri merkezli uygulamalarda veriye erişimin ve yönetimin tek noktaya indirilmesini sağlayan yapıya Repository Pattern denir.”
*Yani OOP mantığında da söylediğimiz gibi kod tekrarı olmadan, saf ve temiz bir şekilde veritabanı işlemlerinin tek bir noktadan kontrol edip, yönetilmesini Repository Pattern ile sağlıyoruz.

# Peki Repository Pattern faydaları nelerdir?

  • Projede değişiklikler yapıldığında kolayca yönlendirilebilir olması,
  • Esnek bir mimari yapıda olması,
  • Unit-Test yapabilmemizi kolaylaştırması,
  • Veri işlemlerinde ki hataları görmemizi kolaylaştırır.

Şimdi yapacağımız örnekle birlikte kafamızda oluşan yapıyı sağlam bir şekilde oturmasını sağlıyalım.. 🙂

Örneğimiz şu şekilde;
Xamarin ile yapılan bir mobil restaurant uygulaması düşünelim… Uygulamamız veri(stok,masa,fiş,adisyon vb.) bilgilerini dışardan API yardımıyla SQL’den alıyor ve ekrana basıyor.
Eğer Repository Pattern bilmeseydik; Arka planda her SQL CRUD işlemleri için ayrı ayrı classlar ve ayrı ayrı metodlar yazıcaktık. Buda bize çok fazla efor ve zaman kaybı yaratacaktı. Fakat Repository Pattern ile birden fazla veri işlemlerini tek bi çatı altından yapacağız.

Şimdi projeye Repository klasörünü açıp içine BaseRepository adı altında bir class açıp interfacemizide tanımlayıp kodlarımızı yazmaya başlıyoruz.

IBaseRepository interface’de kullanacağımız metodların imzalarını oluşturup bırakıyoruz…

Interface’lerimizi tanımladıktan sonra ana classımıza implement edip içlerine sunucumuzdan çekilecek verilerin HttpWebRequest ‘lerimizi oluşturuyoruz.
Ben anlamanız için sadece ReadAll ve ReadById metodlarını göstereceğim create,update,delete işlemini sizlere bırakıyorum:)

Repository metodlarını tamamladığımıza göre artık kategori,stok,ürün,adisyon vb. veri işlemlerinde tek bir noktadan istek gönderip, gelecek cevabı beklemek kalıyor..

Örnek; Kategoriler tablosunu istiyorum;

Gördüğünüz gibi result değişkenimin içine baktığım da 6tane verimin geldiğini görüyorum. API’den diğer verileri çekmek için .ReadAll(“Kategoriler”); ‘de parantez içinde ki valueyi değiştirmemiz yeterli. Nasıl mı ? buyrun örnekler;

Stoklar tablosunu istiyorum -> string query = await baseRepo.ReadAll(“Stoklar“);
Adisyon tablosunu istiyorum -> string query = await baseRepo.ReadAll(“Adisyon“);
Masalar tablosunu istiyorum -> string query = await baseRepo.ReadAll(“Masalar“); gibi gibi..

# Peki ben Masalar tablosundan hepsini değilde sadece ID numarası 35 olan masayı istiyorum nasıl getirebilirim?

Bu sefer .ReadAll yerine .ReadById kullanacağız.. buyrun;

Diğer delete/update/create işlemlerinide sizlere bırakıyorum. Zaten mantığı anladıysanız gerisi çok sabit 🙂

Bir yazımızın daha sonuna geldik..
Umarım projelerinizde sık sık Repository Design kullanır ve sevdiklerinize kullanımını tavsiye edersiniz. Unutmayın ki çalışacağınız firmalarda, büyük projelerde Repository Design çok fazla karşınıza gelecektir. Ben örneğimde sadece veri işlemleri için kullandım. Repoyu çok farklı yerlerde, işlerinizi hafifletmeniz için kullanabilirsiniz.

Herkese bol mantıklı kodlamalar 🙂

Yeni Uygulamam [DEPREM BİLDİRİMİ]

Herkese selamlar….

Şöyle bi’ 2020nin ilk aylarına baktığımızda pek de iç açıcı girmediğimiz ortada..
En önemlisi 10 yıldan beri fay hattının durgunluğunu bozup ülkemizde ciddi derece de depremler yaşamaya başlaması…
Yakın bir sürede Aydın ve Marmara’da da büyük bir deprem beklenmekte, alacağımız önlemlerle inşallah 1 kişinin bile hayatını yitirmeden geçiririz..

Şimdi konumuza dönersek Google Play üzerinde araştırma sonucu ne yazık ki depremlerle ilgili AFAT dışında çokta güzel uygulamalar bulamadım, birinde biri varsa diğerinde yok hep bi yetersizlik..
Depremlerin şiddetli olduğu bu günlerde şöyle bir fikir geliştirdim;

1-) Uygulamaya ilk girdiğinde son 10 depremi karmaşık olmadan net bir şekilde listeleyebilmek,
2-) Uygulama kapalı olsa dahi; Türkiye gündeminden veya belirlediği illerden X büyüklüğünde bir deprem olduğunda haberdar olması/anlık bildirim (notificition) alması,
3-) Tartışmaların yapılabileceği bir sohbet paneli (kesinlikle goygoy olmadan, hislerini paylaşabilecekleri bir ortam *bizler tarafından sürekli denetlenecek),
4-) Büyük bir sarsıntı ve deniz seviyesi yüksekliğinde ani bir düşüş olduğu zaman bizim sunucumuza bildirim geçmesi ve bu durumu sağlık bildirimlerine bildirmemiz, *
5-) Büyük bir sarsıntı ve deniz seviyesi yüksekliğinde ani bir düşüşünde telefondan son ses müzik çalması. *

Genel düşüncem bu şekilde, önemli olarak 4 ve 5. maddelere baktığımızda olası bir enkaz durumunda kişinin enkaz altında efor kaybı yaşatmadan telefonundan SOS sesinin dışarıya vermesi ve depremzedenin daha kolay bir şekilde bulunması. (ani bir rakım düşüşü ve sarsıntıda uygulama bizim sunucumuza telefon numarasını kaydedecek ve bizimde sağlık ekiplerine bildirmemiz sağlanacak.)

Fikrimin çoğunu bitirmiş durumdayım bir kaç dizayn düzenlemesi yapıp paylaşacağım.

Uygulamada neler kullandın diye soracak olursanız buyrun arka planda kullanılan nugetler ve bazı hazır dizaynlar;

• Uygulama neyle yazıldı?
– Mobil ; Microsoft Xamarin.Forms
– Sunucuda ki Kandilli Rasathanesinden Veri Çekme ; Python ( https://github.com/emirkabal/deprem-api ) (fakat kısa süre içinde NET Core 3.0’a kendim bir bot yazacağım.)

• Uygulama kapalı olsa dahi bildirim alması (Android Service)
Xamarin.Android.Services ve Xamarin.Forms.MessagingCenter.Subscribe<>(); kullanımı ile Samsung ,Huwai,Vestel gibi telefonlarda 24 saat boyunca uygulama kapalı olsa dahi bildirimler alıyordum fakat Xiaomi telefonlarda uygulama kapandığı an Android.Services kapanması beni mahvetti o yüzden https://github.com/shinyorg kullanmaya karar verdim 1-2 testlerim oldu tahminlerime göre bütün telefonlarda bu sorunu bununla çözmüş olacağım. (*çözemezsem değiştirmiş olurum:p)
** Özellikle bu konu hakkında ne yazık ki Türkçe ve güncel makale bulmak çok zor bunu özel bir blog yazımda en kısa ayrıntılarına kadar anlatacağım.

• Xamarin Tasarımları Nasıl Geliştirdin?
– Tasarımları sıfırdan yapmak yerine güzel UI tasarımları geliştirmenin daha iyi fikir olduğunu düşündüm. Tasarımlarım şu 2 projeden birleştirme;
a-) https://github.com/devcrux/WeatherApp
b-) https://github.com/sthewissen/KickassUI.Banking

• Extra Kullanılan Nuget Paketleri;
– Tartışma – Mesajlaşma alanı için; SignalR
– Ekranda işleme bağlı async “Lütfen Bekleyiniz” ifadesi için; AiForms.Dialogs
– Xamarin MVVM yapısı için ; FreshMvvm
– Menünün yukarda değilde aşağıda olmasını istediğim için ; LH.BottomNavigationBar.FX
– XAML üzerinde anlık değişiklikleri görebilmem için ; LiveXAML + HotReload
– JSON verileri kullanabilmek için ; Newtonsoft.Json
– Deprem bilgisini paylaş butonları; Plugin.Share
– Kullanıcıya Notification için ; Plugin.LocalNotification **
– Bazı bölgelerde kullanıcıları yönlendirme yapmadan hızlıca pop-up göstermek için ; Rg.Plugins.Popup
– Android Jobs ve Servisler için ; Shiny.Core
– Ayarları ve kullanıcı kayıtlarını kaydetmek için database ; SQLite
– Depremin olduğu noktayı göstermek için ; Xam.Plugin.ExternalMaps
– Deprem notificationunda titreşim gönderebilmek için ; Xam.Plugins.Vibrate
– Xamarin.Android tarafında binding yapabilmek için ; Xamarin.Android.Support.Core.Utils
– Klasik vazgeçilmez pluginimiz : Xamarin.Essentials (anlatmaya gerek yok mikemmel)
– Panel ve Grid yapılarının daha güzel, göze hoş gelmesi için ; Xamarin.Forms.PancakeView

Xamarin Failed to create JavaTypeInfo for class – Hatası Çözümü

Eyyoo eyyoo herkese selamlar….

Bildiğimiz üzere Xamarin Microsoft tarafından halen geliştirilen bir proje..
Bu gelişim sürecinde durduk yere patlamalar,çatlamalar yaşatabiliyor. Hele ki bazı hataların çözümünü bulmak çok zor çünkü ne hata satırı veriyor, ne de bak hatan burada diyebileceği kızgın kod bloklarını 🙂 Bundan sonra yaşayacağım her hatada türkçe olarak bu hataların çözümlerini sizlere sunacağım bunlardan bir taneside “Failed to create JavaTypeInfo for class” hatası.

Hata Adı : Failed to create JavaTypeInfo for class: Android.Support.V4.View.Accessibility.AccessibilityManagerCompat/IAccessibilityStateChangeListenerImplementor due to MAX_PATH: System.IO.DirectoryNotFoundException: Could not find a part of the path…
Hata Resmi:


Hata Çözümü: Belgelerimde ki Github veya masaüstünde ki projenizi, daha kısa bir yol uzantısına taşıyın..
Yanii; Bu hatayı aldığınızda projeyi kapatıp, proje dosyasını C:\ dizinine taşıyın ve projeyi tekrar açın, sorun tamamen kalktığını / buildlendiğini göreceksiniz 🙂

• Eğer çözüm bulamadıysanız yorum olarak belirtirseniz beraber diğer çözüm yollarını bulabiliriz. Herkese keyifli kodlamalar, görüşmek üzere.. : )

Xamarin Forms Giriş Ekranı (YAKINDA!)

Eyyyoo herkese selamlar arkadaşlar Truegram adlı projemin mobil uyguması için geliştirdiğim giriş ekranını sizlerle paylaşacağım.
Bir sorun olmazsa planladığım paylaşım tarihi 30.12.2019 olacaktır, görüşmek üzere 🙂

Proje içinde olacak konular;

– Xamarin Custom Font,
– Binding Kullanımı,
– Grid.ColumnDefinitions ve Grid.RowDefinitions kullanım mantığı,
– CustomEntry & Models & Renderer kullanımı.

C# Windows Form Hata Geri Bildirimi

Eyyoo eyyoo herkese selamlar….

Satışa sunduğumuz program bazen bilinmedik sebeplerden dolayı kendini kapatabilir veya diğer sebeplerden dolayı sorunlar çıkartabilir. Bu ve buna benzer durumlarda müşterinin bilgisayarına bağlanıp kontrol etmek biraz profesyonellik dışı olduğu için müşterinin aldığı hatayı otomatik olarak bize mail attırabilir veya hata dosyasını kaydettirebiliriz. Nasıl mı? Buuuyyrunnnn;

İlk önce Program.cs ‘de ki Main classına bir hata yakalayıcısı ekliyorum.

Application.ThreadException += new ThreadExceptionEventHandler(ErrorThread);

Şimdi hata durumunda tetiklenecek olan ErrorThread eventini oluşturuyorum;

Hatanın ne olduğunu anlayabilmem için ThreadExceptionEventArgs içinde bulunan Exception.Message ifadesini hata nedeni olarak gösteriyorum…

Şimdi programımız olası bir hata durumunda .exe‘nin bulunduğu yere error.txt diye bir metin belgesi oluşturup dakika dakika kaydettiğini görebilirsiniz 🙂

Peki.. hatayı mail olarak göndermek istiyorsak ne yapmalıyız diyorsanız çözümü çok basit.. hemen projeme sendMail adında bir class açıyorum..

Bu sefer metin belgesi kodumu siliyorum ve mail göndermeyi tetiklettiriyorum.

Programı hataya düşürdüğüm zaman gördüğünüz gibi otomatik olarak mail hesabıma düştü 🙂

Bu konumuzda bu kadar eğer projelerinizde neler olup bittiğini öğrenmek istiyorsanız bu kısa yolu kullanarak öğrenebilirsiniz.
Herkese bol mantıklı kodlamalar 🙂

C# Veri Kapsülleme (Class Encapsulation) {Get/Set Mevzuları}

Eyyoo eyyoo herkese selamlar…
Bugün sizlere github’da ki projelere bakınca ‘bu değişkenlere neden sadece int veya string diye bırakmıyoruz?/niye get-set ile uğraşıyoruz?/nedir bu get-set?” dedirten veri kapsüllemeyi inceleyip, nasıl kullanılacağını örnekleriyle birlikte sizlere anlatmaya çalışacağım.

Kapsülleme, sınıf içindeki değişkenlere erişimi kaldırmak ya da kısıtlamak için kullanılır. Önemli bir değişkeni public olarak tanımlamak, değişkene yazılımcı tarafından -bilinçli ya da bilinçsiz- müdahaleye açık hale getirir. Bu da sınıf içindeki metodların çalışmasını olumsuz etkileyebilir. Bu gibi durumların önüne geçmek için kapsülleme tekniği kullanılmaktadır.(*1)

Yanii.. Get ve Set metodlarını birer kontrol mekanizması olarak düşünebiliriz . Kod blokları arasında oluşabilecek hataları önceden engelleyen “hoopp hemşerim nereye” diyen bodyguard’ımız 🙂 tabi sadece hataları engellemek için değil, diğer istediğimiz limitlemeleri, koşul kontrollerini de get & set içinden yapabiliriz.

Bilmemiz gereken bilgiler;
• get : Kapsül içindeki verileri okumamız için çalışan metod. (Get -> Getir olarak aklınızda kalabilir)
• set : Kapsüle veri göndereceğimiz zaman kullanacağımız metod.
• value : Kapsüle dışardan gelen veriyi incelemek veya atama yapacağımız zaman kullanacağımız anahtar kelime,
• return : Geriye bir değer döndürmemize yardımcı olan anahtar kelime.

Örneğin nerelerde Get&Set kullanabiliriz?
– Kimlik numarasına harf ataması yapılmasını engelleme durumunda,
– Belirli bir kritere uygun olup olmamasını kontrol ettirme gibi durumlarla örneklendirebiliriz..

Şimdi birlikte kısa bir örnek yapalım;
Hedefimiz şu : Kullanıcıdan bir TC kimlik numarası isteyeceğiz ve TC numarasını tekrar çağırdığımızda ilk 4 hanesini görüp geri kalanını yıldız (*) ile gizleyeceğiz.
(benzeri örnek: 16haneli kredi kartı bilgisinin ilk 4 hanesini görüp kalanının *** olması gibi..)

İlk önce Personel.cs olarak bir class açıyorum ve malzemelerimi yavaş yavaş ekliyorum;
1-) _tckimlikNumarasi adında uzaklardan erişimi olmayan bir private değişken oluşturuyorum.
2-) tckimlikNumarasi adında her yerden erişilebilen, gelen veriyi _tckimlikNumarasi ‘e aktaracak bir kapsül oluşturuyorum.

* _tckimliknumarasi olarak açılan değişkenim private olduğu için diğer classlardan erişimi olmayacaktır. Veri gönderdiğim zaman bütün iş yükü tckimlikNumarasi ‘nin set bloğu arasında olacaktır.

Şimdi projeye geri dönersek; İlk önce kullanıcıdan gelen TC numarasının boş olup olmadığını daha sonrasında da 11 haneli olup olmadığını kontrol edeceğiz. Eğer kriterlere uyuyorsa hata mesajım çıkacak, uymuyorsa direk else bölümüne geçip _tckimliknumarasi değişkenine verimi atayacağım.

* Şimdi set tarafımdaki koşullarım bitti, hemen get tarafını kodlamaya başlıyorum.

Get tarafında ki amacım neydi? tckimlikNumarasi çağırdığım zaman 11 hanenin ilk 4hanesini gösterip 7haneyi yıldız yapmaktı…

Hatırlarsanız string değerlerin belirli bir aralığını almak istiyorsak Substring kullanıyorduk. O yüzden _tckimliknumarasi değişkenime 0,4 Substringi uygulayıp sonuna da yıldızlarımı ekledim mi istediğim her şey olmuş olacak 🙂

Personel.cs tarafım hazır, Program.cs tarafına geçip per adında Personel classını üretiyorum.

Artık işim personele tc numarası atamak ve tc numarasını çağırmak…

Kodumuzu şimdi inceleyelim bakalım;