Flutter: Clean Code 2

Muhammet ÖMER
Flutter Türkiye
Published in
4 min readNov 29, 2020

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.

dart’ta singleton kullanı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.

aldığımız hata

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!

login_part.dart

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!

part error

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.

login_part_of.dart

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.

Zamanınızı ayırıp bu yazıyı okuduğunuz için teşekkür ederim, faydalı olması dileğiyle.

Bana bu adreslerden ulaşabilirsiniz:

Ayrıca GitHub hesabıma buradan ulaşabilirsiniz.

--

--

Muhammet ÖMER
Flutter Türkiye

Computer Engineer | Mobile Application Developer | Traveler