Uygulama geliştirmede Boilerplate: nedir, örnekler ve nasıl azaltılır

Yazar: IT Sectr Yayınlanma: 2026-07-26 Okuma süresi: 10 dk

Boilerplate, geliştiricilerin her yeni modül veya projede minimum değişiklikle yazdığı şablon koddur. Benzersiz iş mantığı içermez, sadece altyapıyı hazırlar: yapılandırma, kütüphane içe aktarımları, standart işleyiciler ve DTO sınıfları. CodeScene Engineering Productivity Report (2025) verilerine göre, tipik bir ticari uygulamada boilerplate tüm kodun yüzde 20 ila 40'ını oluşturur. Asıl sorun bu kodun tekrarlanması değil, her tekrarın bir hata noktası olmasıdır: bir kopyadaki hata diğerleriyle senkronize olmaz ve hatalar projeye yayılır. Kod oluşturma, ek açıklamalar ve makrolar yoluyla boilerplate oluşturmayı otomatikleştirmek, kaliteden ödün vermeden geliştirmeyi hızlandırmanın en etkili yollarından biridir.

Önemli Noktalar

  • Boilerplate — iş mantığı değişmeden modülden modüle tekrarlanan şablon koddur.
  • Ana kaynaklar: DI yapılandırması, DTO sınıfları, form ekranları, ağ istekleri ve ORM eşlemesi.
  • Boilerplate geliştirmeyi yavaşlatır ve kopyalama sırasında hata sayısını artırır.
  • Azaltma araçları: kod oluşturma, ek açıklamalar (Lombok, Data sınıfları), makrolar ve ekran oluşturucular.
  • Amaç boilerplate'i tamamen ortadan kaldırmak değil, oluşturulmasını ve senkronizasyonunu otomatikleştirmektir.

Boilerplate nedir?

Boilerplate kodu, bir projenin farklı bölümlerinde minimum varyasyonla tekrarlanan kaynak kodu parçalarıdır. Terim matbaacılık sektöründen gelir; burada boilerplate, yeniden yazılması gerekmeyen gazeteler için önceden yazılmış metin bloklarını ifade ediyordu. Programlamada, bir framework, dil veya mimarinin gereksinimlerini karşılamak için tekrar tekrar yazmak zorunda kaldığınız herhangi bir koddur.

Boilerplate klasik anlamda teknik borç değildir — hata içermez ve SOLID ilkelerini ihlal etmez. Ancak bakımı, test edilmesi ve okunması gereken kod miktarını artırır. Boilerplate'in her satırı, derleyicinin her zaman yakalayamayacağı potansiyel bir yazım hatası yeridir.

JetBrains Developer Ecosystem (2025) raporuna göre, geliştiricilerin yüzde 67'si üretkenlik düşüşünün ana nedeni olarak boilerplate'i görmektedir. Mobil geliştirmede bu rakam daha yüksektir: Java'daki Android projeleri, findViewById, Intent, RecyclerView bağdaştırıcıları ve ContentProvider için önemli miktarda şablon kod içerir. Kotlin ve Swift bu sorunların bir kısmını sözdizimsel araçlarla çözdü, ancak boilerplate tamamen ortadan kalkmadı.

Mimari tasarlarken, şablon kodu en aza indiren çözümler seçmeye çalışın. Örneğin, Parcelable uygulamasını manuel yazmak yerine Kotlin'de @Parcelize kullanın. ViewModel için fabrikalar yerine — @HiltViewModel ile Hilt kullanın. Bu tür her optimizasyon, proje ölçeğinde saatlerce geliştirme süresi kazandırır.

Mobil projelerde boilerplate örnekleri

Android geliştirmede boilerplate'in en tanınabilir örneği RecyclerView.Adapter'dır. Kotlin ve ViewBinding'den önce, her bağdaştırıcı yaklaşık 80–100 satır şablon kod gerektiriyordu: onCreateViewHolder, onBindViewHolder, getItemCount, iç ViewHolder sınıfı, yapıcı, alan bağlama. ViewBinding ile kod azaldı, ancak tamamen kaybolmadı.

Optimizasyon olmadan Bağdaştırıcı Boilerplate'i

kotlin
class UserAdapter(
    private val users: List<User>
) : RecyclerView.Adapter<UserAdapter.ViewHolder>() {

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ViewHolder {
        val view = LayoutInflater
            .from(parent.context)
            .inflate(R.layout.item_user, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(
        holder: ViewHolder,
        position: Int
    ) {
        holder.bind(users[position])
    }

    override fun getItemCount(): Int = users.size

    class ViewHolder(itemView: View) :
        RecyclerView.ViewHolder(itemView) {
        fun bind(user: User) {
            Glide.with(itemView)
                .load(user.avatarUrl)
                .into(itemView.avatar)
        }
    }
}

Bir diğer açıklayıcı örnek, kütüphanesiz Java'da JSON eşlemesidir. Bir API yanıtını manuel olarak ayrıştırmak, her biri bir anahtarın varlığını kontrol eden, değeri alan ve bir alana atayan düzinelerce yöntem yazmayı gerektirir. Gson, Moshi veya Kotlin Serialization gibi kütüphanelerle — tek bir @Serializable ek açıklaması yeterlidir.

iOS geliştirmede klasik boilerplate, özellikle JSON anahtarları camelCase özellik adlarından farklı olduğunda, her API yanıtı için CodingKey ve Decodable uygulamasıdır. Codable'ın otomatik oluşturulmasına rağmen, CodingKeys'in manuel olarak listelenmesi hala şablon kod kaynağıdır.

Derleme zamanında boilerplate oluşturmak için kod oluşturmayı kullanın. Android'de — Room, Dagger, Moshi için Annotation Processing (KSP). iOS'te — Codable ve AutoMockable için Sourcery. Oluşturmayı yapılandırmak için harcanan her saat, manuel kopyalama günlerinden tasarruf sağlar.

Şablon kod neden zararlıdır

Boilerplate bir projeye üç şekilde zarar verir: yeni işlevsellik yazmayı yavaşlatır, mevcut kodu okumayı zorlaştırır ve değişiklikler sırasında senkronizasyon bozulma noktaları oluşturur.

Geliştirmedeki yavaşlama açıktır: geliştirici iş mantığı içermeyen kod yazmak için zaman harcar. Yeni bir özellik uygulamak yerine (örneğin, kullanıcı profiline bir alan eklemek), DB geçişi, DTO sınıfı, alan varlığına eşleyici, giriş alanı olan ekran, doğrulama ve her katman için testler yazar. Bu işin çoğu mekaniktir.

Senkronizasyon bozulması daha sinsi bir sorundur. Bir yerde veri yapısı değiştiğinde (örneğin, bir API yanıtına alan eklendiğinde), geliştirici DTO'yu, eşleyiciyi, modeli, ekranı ve testleri güncellemelidir. Bir yer atlanırsa, uygulama derlenir ancak çalışma zamanında çöker veya — daha kötüsü — hata olmadan yanlış veri gösterir. Ne kadar çok boilerplate katmanı varsa, bu tür senkronizasyon bozulması olasılığı o kadar yüksektir.

Projeyi tekrarlayan desenler açısından analiz edin. Farklı adlara sahip üç özdeş sınıf görüyorsanız — bu oluşturma için adaydır. Kod oluşturmayı tek seferlik bir optimizasyon olarak değil, mimari çözümün bir parçası olarak tanıtın. Her yeni modülle kendini amorti eder.

Boilerplate otomasyonu için kod oluşturma

Kod oluşturma, boilerplate ile mücadelede en güvenilir yoldur. Şablon kodu manuel yazmak yerine, geliştirici meta verileri (ek açıklamalar, şemalar, yapılandırmalar) tanımlar ve oluşturucu derleme zamanında hazır kod oluşturur.

Android ekosisteminde standart kod oluşturma aracı KSP'dir (Kotlin Symbol Processing). Eski KAPT'nin yerini alır ve Java stub'ları oluşturmadan Kotlin AST'sine doğrudan erişim sayesinde daha hızlı çalışır. KSP, Room (DAO uygulaması oluşturma), Moshi (JsonAdapter oluşturma), Glide (hedef yükleme sınıfı oluşturma) ve Dagger (DI grafiği oluşturma) tarafından kullanılır.

KSP ile Room Varlık Oluşturma

kotlin
@Entity(tableName = "users")
data class UserEntity(
    @PrimaryKey val id: Long,
    @ColumnInfo(name = "full_name") val name: String,
    @ColumnInfo(name = "avatar_url") val avatarUrl: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getById(@Param("id") id: Long): UserEntity?
}

iOS geliştirmede, kod oluşturma rolünü Sourcery üstlenir — Stencil şablonlarını işleyen ve yorumlardaki ek açıklamalara dayalı olarak Swift kodu oluşturan bir araç. Tipik senaryolar: AutoMockable (testler için mock oluşturma), AutoCodable (CodingKeys olmadan Decodable uygulaması), AutoEquatable ve AutoLenses.

Flutter projeleri için, build_runner aracılığıyla oluşturucular boilerplate'i azaltır: JSON eşlemesi için json_serializable, copyWith ile değişmez modeller için freezed, API istemcileri için retrofit_generator ve DI için injectable_generator. Bu oluşturucuların her biri, 10–20 satır ek açıklamayı yüzlerce satır hazır koda dönüştürür.

Ek açıklamalar ve makrolarla azaltma

Ek açıklamalar ve makrolar, derleyiciye veya ön işlemciye hangi kodun oluşturulacağını söylemenin bildirimsel bir yoludur. Geliştirici uygulamayı yazmaz, sadece niyeti işaretler ve oluşturucu işaretlemeyi hazır koda dönüştürür.

En çarpıcı örnek, Java'da Lombok (tarihsel olarak) ve Kotlin data class'tır. Kotlin'deki data class, equals, hashCode, toString, componentN ve copy'yi otomatik olarak oluşturur — Java'da bunun için yaklaşık 80 satır el yazısı kod veya @Data ile Lombok kullanmak gerekir. Kotlin sorunu dil düzeyinde çözerek boilerplate'i örtük hale getirdi.

Swift'te benzer bir rolü makrolar (Swift 5.9'da tanıtılan Swift Makroları) oynar. Codable uygulamasını manuel yazmak yerine, geliştirici yapıyı @Codable ile işaretler — ve derleyici gerekli kodu oluşturur. Diğer yerleşik makrolar: @Observable (gözlemlenebilir durum), @ResultBuilder (sonuç oluşturucular) ve @MainActor (ana iş parçacığına dağıtım).

swift
@Codable
struct UserProfile {
    let id: Int
    let displayName: String
    let avatarURL: URL
    let bio: String?
}

// @Codable macro generates:
// extension UserProfile: Codable { }
// private enum CodingKeys: String, CodingKey {
//     case id, displayName, avatarURL, bio
// }

Kod oluşturma ve makrolar arasında seçim yaparken, dil destekliyorsa makroları tercih edin. Makrolar derleyici düzeyinde çalışır, derleme betiği yapılandırması gerektirmez, derlemeyi yavaşlatmaz (Annotation Processing'in aksine) ve her zaman kaynak kodla senkronizedir. Makrolar mevcut değilse — KSP, Sourcery veya build_runner aracılığıyla harici oluşturucular kullanın.

Dile özel azaltma pratikleri

Her dil ve platform, boilerplate'i en aza indirmek için kendi araçlarını sunar. Aşağıda ana mobil geliştirme yığınları için belirli pratikler verilmiştir.

PlatformAraç / TeknikNeyin yerine geçer
Android / Kotlindata classequals, hashCode, toString, copy, componentN
Android / Kotlin@ParcelizeParcelable uygulaması
Android / KotlinViewBinding / DataBindingfindViewById, ButterKnife
iOS / SwiftCodable + makrolarManuel JSON ayrıştırma, CodingKeys
iOS / SwiftSourceryAutoMockable, AutoEquatable, AutoLenses
Flutter / Dartfreezed + json_serializablecopyWith, mühürlü sınıflar, equals/hashCode, JSON
Flutter / Dartretrofit_generatorTipli istek ve yanıtlarla API istemcisi

Web ön yüzü (React Native / TypeScript) için ana araç, OpenAPI spesifikasyonundan (openapi-typescript, swagger-codegen) tür oluşturmadır. Her uç nokta otomatik olarak tipli bir istek ve yanıt alır — geliştiricinin yüzlerce API çağrısı için arayüzleri manuel olarak tanımlaması gerekmez.

Kod oluşturmayı projenin erken aşamalarında tanıtın. Mevcut bir projeyi oluşturuculara taşımak, onlarla sıfırdan tasarlamaktan daha zordur. Proje zaten yazılmışsa — en acı verici noktadan başlayın: Java → Kotlin (data class), manuel bağdaştırıcılar → DiffUtil ile ListAdapter, manuel JSON eşlemesi → Moshi / Kotlin Serialization.

Sıkça Sorulan Sorular

Boilerplate teknik borçtan nasıl farklıdır?

Boilerplate borç değil, fazlalıktır: kod doğrudur, ancak çok fazladır. Teknik borç, daha sonra düzeltilmesi gereken bilinçli bir uzlaşma kararıdır. Boilerplate düzeltme gerektirmez — otomasyon gerektirir.

Boilerplate'e sahip olmak her zaman kötü müdür?

Hayır, küçük projelerde boilerplate basitlikle haklı gösterilebilir: hemen görünür ve değiştirilmesi kolaydır. Sorun ölçekte ortaya çıkar — benzer modüllerin sayısı onu geçtiğinde, manuel kopyalama etkisiz hale gelir ve oluşturmayı tanıtma zamanı gelir.

Hangi boilerplate otomatikleştirilemez?

Standart olmayan mantığa sahip harici hizmetlere (özel SDK'lar, tescilli protokoller) bağlı kodun oluşturulması zordur. Bu gibi durumlarda, boilerplate manuel olarak yazılır ancak projeye yayılmasını en aza indirmek için ayrı modüllerde izole edilir.

Yeni Java projelerinde Lombok kullanılmalı mı?

Yeni projeler için, data class'ın aynı görevleri dil düzeyinde çözdüğü Kotlin'e doğrudan geçmek daha iyidir. Proje Java'da kalırsa — Lombok fiili standart olmaya devam eder, ancak bir IDE eklentisi gerektirdiğini ve yeni Java sürümleriyle çakışabileceğini unutmayın.

Kod oluşturma derleme süresini artırır mı?

Evet, kod oluşturma derlemeye zaman ekler. KSP, KAPT'den daha hızlı çalışır ancak yine de tam derlemeye saniyeler veya dakikalar ekler. Optimizasyon: artımlı derlemeler kullanın ve derlemeler arasında oluşturma sonuçlarını önbelleğe alın.

Özet

  • Boilerplate — her modülde tekrarlanan ve benzersiz iş mantığı içermeyen şablon koddur.
  • Ana kaynaklar: DTO sınıfları, eşleyiciler, ağ istekleri, bağdaştırıcılar, DI yapılandırması ve ORM varlıkları.
  • Boilerplate geliştirmeyi yavaşlatır, senkronizasyon bozulması riskini artırır ve kod okumayı zorlaştırır.
  • Mücadele yöntemi — KSP, Sourcery, build_runner veya openapi-typescript aracılığıyla kod oluşturma.
  • Ek açıklamalar ve makrolar (data class, Codable, @Parcelize, freezed) en yaygın desenleri otomatikleştirir.
  • Kod oluşturmayı mimari tasarım aşamasında seçin, geç bir optimizasyon olarak değil.
  • Her dilin kendi araçları vardır: Kotlin data class, Swift makroları, Dart freezed — bunları varsayılan olarak kullanın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun