Uçtan Uca Mobil Uygulama Geliştirmek — Bölüm 2: Client Side

Hüseyin Serkan Özaydin
6 min readMay 25, 2020

--

Merhabalar, serimin ikinci kısmını fazla geciktirmeden paylaşayım dedim. Serinin ilk yazısında proje geliştirirken backendte dikkat ettiğim hususları paylaşmıştım. Bu yazımda ise client tarafında dikkat ettiğim konular olacak. Biraz daha Android özelinde uyguladığımız çözümlerden bahsediyor olacağım. Bu çözümler detaya girmediğim başlıklar şeklinde olacak. Zaten en aşağıda projenin kaynak kodlarını paylaştım oradan bu özellikleri teker teker çıkarabilirsiniz.

Hadi başlayalım ama serisinin ilk yazısını okumayan arkadaşlar için linki şöyle bırakayım

Not 2: Aşağıdaki yazının içeriğini verdikleri destekler ile çıkarmamı sağlayan ekip arkadaşlarım var onların isimlerini en aşağıda paylaşmak istemedim. Melih Kök ,Oğuzhan Öztürk ve Kemal TUNÇ

Projenin Yapısı & Kullanılanlar

  • Multi Module
  • Dagger 2
  • Http Cache
  • MVP
  • Clean Architecture
  • One activity multiple fragment
  • Diffutil
  • Glide ile Image Cache
  • View Binding
  • CI/CD Süreçleri

1. Multi Module

Projenin daha esnek olması için ilgili işleri yapan parçacıkları modül haline getirdik. En önemlisi ise bu yapımızda modüller birbirine Dagger 2'nin oluşturduğu sınıflar ile ulaşmakta yani başka bir deyiş ile modülleri birbirine Dagger 2 ile bağladık. Bu modüllerimiz neler peki?

1.1 Core Utility

Bu modülde projemizin herhangi bir anında ihtiyaç duyacağımız fonksiyonlar mevcut. Örneğin bir Recylerview Adapter’ı initialize etmek gibi. Aşağıdaki kod parçacığını kullanarak bir adaptera Recylerview assign edebiliyoruz. Ve 3 sütunluk bir Recylerview oluşturabiliyoruz.

Yukarıdaki gibi birçok özellik mevcut Core Utility modülünde. Detaylara girmiyor olacağım çünkü aşağıda tüm modüllerin kaynak kodlarını paylaşıyor olacağım orada bu modülleri teker teker kontrol edebilirsiniz.

1.2 Core Network

Bu modülde ise internete çıkacağımız adapterı yönettiğimiz modül. Örneğin bir HTTP işlemi yapacaksak bu modül ile internete çıkıyoruz. Ve bu modül katmanında HTTP Cache yapıyoruz veya requestleri logluyoruz.

1.3 Core Local

Bu modülü ise lokalde yapacağımız herhangi bir veri tutmayı yönetmek için kullanıyoruz. Yani bir authorization key mi tutacağız lokalde bunun için bu modüle geliyoruz.

1.4 Base MVP

Projemizlerde MVVM kullanmıyoruz genellikle. Çünkü ekip olarak MVVM felsefesinden dolayı çekincelerimiz var . Zaten Fragment ve Activity’lerde yaşam döngüsünü ekip olarak iyi benimsediğimizden dolayı MVVM’in sağladığı kolaylıkları MVP’de de yönetebiliyoruz. Bu seçim biraz projeden projeye göre değişecek birşeydir. Bir bakarsınız yanlış düşünüyormuşuz deyip MVVM kullanmaya başlayabiliriz. Lafı fazla uzatmadan bu modülde BaseActivity, BaseFragment, BaseRecylerviewAdapter vb. sınıfları yönetiyoruz. Burada en çok sevdiğim sınıf BaseRecylerviewAdapter. Çünkü öyle bir sınıf oluşturduk ve geliştirdikki ihtiyacımız olan herşey burada. Pagenation’ı buradan yönetiyoruz, diffutili burada yönetiyoruz ve BaseViewHolder ile birlikte herhangi bir iteme tıklama işlemini ön tarafa aktarabiliyoruz. Biraz daha sınıftan bahsetmek istiyorum çünkü çok uğraştık :)

Bunun sayesinde aşağıdaki kodları kullanarak tüm işlemlerimizi yapabiliyoruz.

Bir Recylerview’a listeyi vermek

Veya pagination yapmak

Veya bir iteme click işlemini handler etmek

Bunun üstünde daha çok konuşabiliriz ama bu yapı sayesinde Recylerview’ı daha rahat yönetebiliyoruz veya diğer sınıflar ile projelere daha hızlı başlangıçlar yapabiliyoruz.

Genel olarak yapı aşağıdaki gibi

2. Dagger 2

Evet projemizde DI için Dagger 2 kullanıyoruz ve tüm modüllerimiz birbirine böyle bağlanabiliyor. Bunun dışında Repository, Presenter ve diğer modüllerinde nesnelerini ayağa kaldırıp yönetmemizi sağlıyor. Dagger 2 yi anlattığım yazımı şöyle bırakıyorum

3. HTTP Cache

Backend side tarafında da bahsetmiştim bu konudan ama Android tarafında da bu özelliği kullanmak için birkaç geliştirme yapmak gerekiyor. Yapacağınız geliştirmeleri anlattığım yazımı şöyle bırakıyorum

Bunlar dışında her zaman güncellenmeyecek veriler için tekrar request atmamak gerekiyor. Http Header annotationları sayesinde bunları basit bir şekilde yönetebilirsiniz.

4. MVP

Evet projemizde MVP kullanıyoruz. Bu yapı bizi biraz daha güvende hissettiriyor ve daha önce oluşturduğumuz projelerde de bu yapıyı kullandığımız için ekip içinde projeler arasında geçişler daha hızlı oluyor. Bunlar dışında otomatik sınıfları generate etmek için yazdığımız bir Python script var bunun sayesinde bir yapıyı oluşturmak için yapıyor olduğumu kod tekrarını tek tuşla halledebiliyoruz. Onunda kaynak kodlarını şuraya bırakayım

5. Clean Architecture

Son zamanlarda bayağı hipe olan bir konu ve bizde ekip olarak bu konuya adapte olduk. Biraz kendimize göre yapıyı güncelleyip kullandık. Yukarı paylaştığım script bir businessı tek tıkla oluşturmanızı sağlıyor.

6. One Activity Multiple Fragment

Google’nin önerdiği bir yapı ciddi anlamda projelerimizin yağ gibi kaymasını sağlıyor ama şöyle bir sorun var bir projemizde Navigation Architecture Component kullandık ve ciddi anlamda işimiz zorlaştı büyük sıkıntılar yaşadık. Çok komplike geldi yapı. Proje büyüdükçe bir sürü ok çıkmaya başladı navigation tarafında ama bu yapıyıda kullanmak istedik bunun için ekip arkadaşlarımdan birisi olan Kemal TUNÇ‘un yapısını kullandım.

Ama bu yetmedi Fragment’in yaşam döngüsü Activity’e benzemediği için kullanımı biraz zor. Bunun için ViewBinding ile BaseFragment’te birkaç güncelleme yaptık. 2 fonksiyon ekledik ve fragmentin tekrar açılıp açılmadığını bu fonksiyonlar sayesinde yönetebildik.

InitUI fragment ilk kez açıldığında tetikleniyor againOpened(isim gelmedi aklıma) ise fragment daha önce açılıp tekrar stackte en üste geldiyse tetikleniyor. Bu sayede gereksiz yere View’ı tekrar çizdirmek gibi performansı etkileyecek şeylerin önüne geçiyoruz. Daha bir çok avantajı var.

7.DiffUtil

Bu oldukça önemli bir konu arkadaşlar. Bir projede listeleme olmazsa olmazımız. Bunun içinde Recylerview kullanıyoruz. Recylerview’ın artık olmazsa olmazı olan DiffUtil’i kullanmazsak olmaz ve animasyon cidden hoş oluyor. Detaylı bilgi için aşağıdaki yazıyı okuyabilirsiniz;

BaseRecylerview’da bu yapı mevcut ekstra bir işlem yapmanıza gerek yok. Bu arada Recylerview’da ListAdapter kullanıyoruz. Doğal olarak Recylerview’da bu sayede DiffUtil bulunuyor.

8.Glide İle Image Cache

Bu önemli bir konu bence. Çünkü clienta indirdiğiniz bir resmi tekrar indirmeniz saçma hem veriyi aldığınız yeri yoruyorsunuz hemde clientın o veriyi indirmesi lazım. Glide, Picasso vb. kütüphaneler Cache özelliğini destekliyor. Glide değil ama Picasso için Cache özelliğini anlattığım yazımı buraya bırakıyorum

Bununla birlikte eğer Recylerview’da görsel gösterecekseniz arkadaşlar gösterdiğiniz görselin çözünürlüğü çok büyük olmamalı. Olur ise performansta sorunlar yaşıyorsunuz birde listelemede kullanıcıya neden yüksek çözünürlüklü görsel gösterelim ki. Core Utility modülünde Glide’nin Cache’leme fonksiyonları veya indirilen bir görselin çözünürlüğünü değiştirme fonksiyonları mevcut.

9. View Binding

Projelerimizde son zamanlarda kotlin synthetic kullanıyorduk rahattı ama one activity multiple fragment yapıya geçince uygulamadan Viewlar null olduğu için hatalar almaya başladık. Durduk yere uygulama patlıyordu bunun önüne geçmek için View Binding kullandık projelerde de. View Binding’in anlatıldığı güzel bir video var onu paylaşıyorum

10. CI/CD Süreçleri

Projelerimizde sürekli APK çıkar gönder gibi bir zulmü yaşamamak için ve sürekli yaptığımız değişikliklerin test edilebilmesi için CI/CD süreçlerini kullanmamız gerekti. Bunun için Git’te Git Flow kullanıyoruz. Development branchine merge edince otomatik beta çıkıyoruz. Master branchine merge edince ise otomatik canlıya çıkıyoruz. Daha önce böyle bir entegrasyonu anlattığım bir yazım var onu paylaşayım;

Bu süreçler için daha farklı servislerde mevcut.

Evet yazımızın sonuna geldik. Yukarıda performans için kullandığımız çözümler dışında yaklaşımlarımızıda paylaşmaya çalıştım. Çünkü geçen gün bir belgesel izledim ciddi anlamda belki paylaştığım bir bilgi birşeyleri değiştirir. Belgeseli aşağıda paylaşıyor olacağım. Yukarıdaki yapıya gelmemiz ciddi anlamda uzun zamanımızı aldı belki daha çok ilerleyeceğiz ama herkes bu acıyı çekmesin. Belki birilerine bir faydamız dokunur.

Bunlar dışında son bir konuyu unuttum o da şu kaynak kodlar daha önce sosyal medya mecralarında paylaştım ama burada da paylaşıyorum.

Kişisel projemi Google Play’e attım onunda linki şurada

--

--

Responses (1)