Flutter: Clean Code 2
Herkese tekrardan merhaba, Clean Code serimizin ilk yazısını yaklaşık 8 ay önce oluşturmuştum. Her ne kadar kısa gibi gözüksede bu geçen sürede kendimi daha da geliştirdim ve biraz daha temiz kod yazmayı öğrendim. Bu bilgileri sizlere de aktarmak istedim. Bir önceki yazıya nazaran elbette yenilikler mevcut. Bu yeniliklerden kısaca bahsedeceğim.
Serinin ilk yazısı olan Flutter: Clean Code’u buraya tıklayarak okuyabilirsiniz.
Hızlıca bahsedeceğim konu başlıklarına bakalım :
- Singleton Design Pattern
- Localization (No Static Strings)
- Part of Pages
- Extensions
Singleton Design Pattern
Yazdığımız kodda tanımladığımız değişkenler, nesneler ve benzeri değerler RAM’de yani cihazın belleğinde yer kaplamaktadır. Çoğu zaman değişkenleri fonksiyonlar içerisinde kullanıp, fonksiyonda işimiz bittiği zaman otomatik olarak yok olduğunu biliyoruz.
Fakat bazı değişkenler, nesneleri uygulamanın tamamında kullanıyoruz ve her birisi için tek tek, ayrı ayrı oluşturarak istekte bulunuyoruz. Örnek vermek gerekirse uygulamamızın teması (Text Theme, Icon Theme…)
veya Database için oluşturduğumuz bağlantı…
Singleton Design Pattern ile birlikte bu yapıyı, tek bir örnek alarak kullanılırız. Böylelikle uygulama çalıştığı müddetçe sadece tek bir örnek oluşur. İlk kez çağırıldıklarında tek sefer oluşturulurlar.
Dart’ta nasıl kullanıldığına hep birlikte bakalım.
Yukarıdaki örneği incelediğimizde, bir sınıfımız mevcut ve bu sınıf içerisinde bir adet static
olarak oluşturulmuş bir instance
var. Bu sınıf içerisindeki cancel
veya search
değişkenine erişmek istersek aşağıdaki hatayı alırız.
Bu hatanın sebebi ise, instance
kullanmadan cancel
değişkenine erişmeye çalışmamızdan kaynaklanıyor. Yani cancel
artık statik değil, statik olan instance
ögesinin içerisinde bulunmakta.
Singleton tasarım deseni hakkında daha detaylı araştırmanızı tavsiye ederim. Stackoverflow’da gördüğüm sorunun altında faydalı cevaplara erişebilirsiniz. Okumak için: How do you build a Singleton in Dart?
Localization (No Static Strings)
Bir projeye başlarken genelde kullanıcı arayüzü (UI) tasarımı hazır halde olur. Geliştirici hazır olan tasarıma bakarak projeyi geliştirir. Proje kodlanırken dikkat edilmesi gereken noktalardan bir tanesi ise kullanıcı arayüzdenki kelimeler, cümleler yani kısaca Stringler
statik olarak yazılmamalıdır.
Basit bir sebep ile örneklendirelim. Örneğin bir projede sadece Türkçe dili bulunsun ve Stringler
statik olarak verilmiş olsun. İlerleyen zamanlarda ek olarak diğer diller eklenmek istendiğinde ise tek tek bu statik kelimeleri, cümleleri bulup çeviri için düzenlemeniz gerekecektir. Bu durumu projeye başlarken localization
ekleyerek çözebiliriz. Böylelikle daha temiz kod yazılmış olur. Geliştirici daha az zaman harcamış olur.
Peki projeye başlarken ne yapmalıyız? Ben bir projeye başlarken bellirli kütüphaneleri ekliyorum. Localization
için easy_localization
kütüphanesini projeye ekliyorum. Ardından assets
klasör dizinine hangi dilde geliştiriyor isem o dile ait bir json
dosyasını oluşturuyorum.
assets
└── language
├── {languageCode}.json // Sadece dil kodu
└── {languageCode}-{countryCode}.json // Ya da full yerel kod
Ardından gerekli olan ayarları yaptıktan sonra projeyi geliştirmeye devam ediyorum. Dil eklemek istediğim zaman yapmam gereken tek bir şey kalıyor, yukarıda göstermiş olduğum klasör dizinine o dile ait bir json
dosyayı oluşturuyorum. Son olarak çevirilmiş metinleri eklemek kalıyor.
Part of Pages
Çoğu Dart/Flutter geliştiricisi part
kavramını kullanmaktan kaçınırlar. Genellikle bir sayfaya ait kodları tek sayfada yazmayı daha uygundur görürler. Çünkü ileride koda bakım yapılmak istendiğinde, kodun daha kolay bulunacağını düşünürler.
Bir sayfadaki kodların bir bölümünü ayırmak için part
kavramını kullanmayı tercih ederseniz, hangi sayfaya ait olduğunu belirtmeniz gerekiyor. Yani özetlemek istersek, part
ve part of
kavramını kesinlikle kullanmanız gerekmektedir.
Part
: Temel sayfaya yazılması gerekmektedir.Part of
: Parçası olunan sayfaya yazılması gerekmektedir.DİKKAT : Bu parçalamayı kullandığınızda aradığınız kodların bulunmasında karmaşıklığa neden olabilir. Her zaman ve her yerde kullanmayınız.
Anlaşılması oldukça güç olan bir kavramı örnekle açıklamaya çalışalım. Bir giriş sayfamız olduğunu düşünelim. Giriş sayfamızın içerisinde çok fazla component
olduğunu düşünelim. Kodları yazdıkça Login Form
kod bloklarımızın kaybolduğunu ve bulmakta zorlandığınızı farkederseniz işte part of pages
kullanmanın yeridir. Kodlarla birlikte daha iyi anlaşılacaktır. Hadi kodlayalım!
Giriş sayfamızın bu şekilde olduğunu hayal edelim. Yorum satırlarının olduğu yerlerde kod olduğunu varsayalım. Parçalamak istediğimiz zaman yapmamız gereken ilk adım 3. satırda görüldüğü üzere parçalanacak sayfaya part
kavramını eklemek. Bunu ekledikten sonra bir hata alacaksınız fakat endişelenmeyin!
Bu hatada parçasını bulamadığını söylüyor. Bizden parçası olan sayfaya da part of
kavramının eklenmesini istiyor. Diğer sayfaya da aşağıdaki örnekteki gibi ekledikten sonra hata düzelecektir.
Extensions
Extension’lar, Dart diline 2.7 versiyonuyla birlikte geldi. Extension’ları özet geçmek gerekirse varolan veya özel olarak oluşturduğumuz, belirlediğimiz tiplere özgü, yeni özellikler eklememize yaramaktadır. Kendimizde bir extension yazarak, projemizdeki geliştirme hızımızı gözle görülebilir derecede artırabiliriz.
Diğer yazılarımın birinde extension’lar hakkında yazı yazmıştım. Kendimi tekrarlamamak açısından o yazıyı yönlendirmemi mazur görün. Mobil Dünyada Extension yazımı buraya tıklayarak okuyabilirsiniz.