{"id":44471,"date":"2026-09-02T09:05:52","date_gmt":"2026-09-02T06:05:52","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/"},"modified":"2026-09-02T09:06:21","modified_gmt":"2026-09-02T06:06:21","slug":"kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/","title":{"rendered":"Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?"},"content":{"rendered":"<h2>Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?<\/h2>\n<p>Kotlin Multiplatform (KMP) ile tek bir kod taban\u0131ndan birden fazla platforma uygulama geli\u015ftirmek heyecan verici bir vaat sunar. Bu mimarinin temel ta\u015flar\u0131ndan biri olan <code>expect\/actual<\/code> mekanizmas\u0131, platforma \u00f6zg\u00fc kodlar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm gibi g\u00f6r\u00fcnse de, her zaman varsay\u0131lan tercih olmamas\u0131 gerekti\u011fini savunuyoruz. Bu makalede, <code>expect\/actual<\/code> yakla\u015f\u0131m\u0131n\u0131n inceliklerini, potansiyel tuzaklar\u0131n\u0131 ve alternatif \u00e7\u00f6z\u00fcm yollar\u0131n\u0131 derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Kotlin Multiplatform Nedir ve &#8216;expect\/actual&#8217; Mekanizmas\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Kotlin Multiplatform (KMP), JetBrains taraf\u0131ndan geli\u015ftirilen ve geli\u015ftiricilerin Android, iOS, Web (JavaScript), masa\u00fcst\u00fc (JVM) ve hatta g\u00f6m\u00fcl\u00fc sistemler gibi farkl\u0131 platformlarda kod payla\u015fmas\u0131na olanak tan\u0131yan yenilik\u00e7i bir teknolojidir. KMP&#8217;nin temel amac\u0131, i\u015f mant\u0131\u011f\u0131, veri modelleri, a\u011f katman\u0131 gibi kritik uygulama bile\u015fenlerini tek bir ortak (common) mod\u00fclde yazarak geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmak ve tutarl\u0131l\u0131\u011f\u0131 art\u0131rmakt\u0131r. Ancak, her platformun kendine \u00f6zg\u00fc API&#8217;leri (uygulama programlama aray\u00fczleri) ve yetenekleri oldu\u011fundan, bu ortak kodun platforma \u00f6zel \u00f6zelliklerle etkile\u015fime girmesi gerekti\u011fi durumlar ortaya \u00e7\u0131kar. \u0130\u015fte tam bu noktada <code>expect\/actual<\/code> mekanizmas\u0131 devreye girer.<\/p>\n<p><code>expect\/actual<\/code>, KMP&#8217;nin platforma \u00f6zg\u00fc ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in sundu\u011fu bir dildir. Ortak mod\u00fclde, bir i\u015flevin, s\u0131n\u0131f\u0131n, aray\u00fcz\u00fcn veya t\u00fcr takma ad\u0131n\u0131n (type alias) belirli bir platformda nas\u0131l davranmas\u0131 gerekti\u011fini &#8220;beklersiniz&#8221; (<code>expect<\/code> anahtar kelimesiyle tan\u0131mlars\u0131n\u0131z). Bu beklenti, ilgili platforma \u00f6zg\u00fc mod\u00fcllerde &#8220;ger\u00e7ekle\u015ftirilir&#8221; (<code>actual<\/code> anahtar kelimesiyle implemente edilir). Bu sayede, ortak kodunuz platforma \u00f6zg\u00fc detaylar\u0131 bilmek zorunda kalmadan soyutlamalar \u00fczerinden \u00e7al\u0131\u015fabilir. \u00d6rne\u011fin, bir cihaz\u0131n platform ad\u0131n\u0131 almak istedi\u011finizde, ortak mod\u00fclde sadece bir fonksiyon beklersiniz ve her platform kendi ad\u0131n\u0131 d\u00f6nd\u00fcrecek \u015fekilde bu fonksiyonu implemente eder.<\/p>\n<p>Bu mekanizman\u0131n temel faydas\u0131, platforma \u00f6zg\u00fc kodun ortak koddan izole edilmesini sa\u011flamas\u0131d\u0131r. Bu izolasyon, ortak kodun platformdan ba\u011f\u0131ms\u0131z olarak test edilmesine ve daha temiz bir mimariye sahip olmas\u0131na yard\u0131mc\u0131 olur. Geli\u015ftiriciler, platforma \u00f6zg\u00fc API&#8217;leri do\u011frudan ortak kodda \u00e7a\u011f\u0131rmak yerine, <code>expect\/actual<\/code> \u00e7iftleri arac\u0131l\u0131\u011f\u0131yla bir soyutlama katman\u0131 olu\u015ftururlar. Bu, \u00f6zellikle dosya sistemi eri\u015fimi, kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) bile\u015fenleri, platforma \u00f6zg\u00fc sens\u00f6r eri\u015fimi veya a\u011f istekleri gibi alanlarda b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Ancak, bu kolayl\u0131\u011f\u0131n her zaman en iyi \u00e7\u00f6z\u00fcm olup olmad\u0131\u011f\u0131n\u0131 sorgulamak, daha s\u00fcrd\u00fcr\u00fclebilir ve esnek KMP uygulamalar\u0131 geli\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bir \u00f6rnekle a\u00e7\u0131klayal\u0131m. Uygulaman\u0131zda platforma \u00f6zg\u00fc bir loglama (kay\u0131t tutma) mekanizmas\u0131 kullanmak istedi\u011finizi varsayal\u0131m. Ortak kodunuzda bir mesaj\u0131 loglamak i\u00e7in bir fonksiyona ihtiyac\u0131n\u0131z var. Bu durumda <code>expect\/actual<\/code> nas\u0131l kullan\u0131l\u0131r?<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ commonMain\/kotlin\/com\/example\/mylibrary\/PlatformLogger.kt\npackage com.example.mylibrary\n\nexpect fun logMessage(tag: String, message: String)\n\n\/\/ commonMain\/kotlin\/com\/example\/mylibrary\/MyBusinessLogic.kt\npackage com.example.mylibrary\n\nfun doSomeWork() {\n    logMessage(\"MyFeature\", \"\u0130\u015flem ba\u015flat\u0131l\u0131yor...\")\n    \/\/ ... i\u015f mant\u0131\u011f\u0131 ...\n    logMessage(\"MyFeature\", \"\u0130\u015flem tamamland\u0131.\")\n}\n  <\/code><\/pre>\n<\/div>\n<p>\u015eimdi bu beklentiyi platforma \u00f6zg\u00fc mod\u00fcllerde ger\u00e7ekle\u015ftirmemiz gerekiyor:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ androidMain\/kotlin\/com\/example\/mylibrary\/PlatformLoggerActual.kt\npackage com.example.mylibrary\n\nimport android.util.Log\n\nactual fun logMessage(tag: String, message: String) {\n    Log.d(tag, message)\n}\n  <\/code><\/pre>\n<\/div>\n<div class=\"code-container\">\n<pre><code>\n\/\/ iosMain\/kotlin\/com\/example\/mylibrary\/PlatformLoggerActual.kt\npackage com.example.mylibrary\n\nimport platform.Foundation.NSLog\n\nactual fun logMessage(tag: String, message: String) {\n    NSLog(\"[%@] %@\", tag, message)\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu basit \u00f6rnekte, ortak kod olan <code>doSomeWork()<\/code> fonksiyonu, hangi platformda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmeden <code>logMessage<\/code> fonksiyonunu \u00e7a\u011f\u0131rabilir. Derleme zaman\u0131nda, Kotlin derleyicisi her platform i\u00e7in uygun <code>actual<\/code> implementasyonunu ba\u011flar. Bu, KMP&#8217;nin temel g\u00fcc\u00fcn\u00fc ve platformlar aras\u0131 kod payla\u015f\u0131m\u0131n\u0131 nas\u0131l m\u00fcmk\u00fcn k\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6steren g\u00fczel bir \u00f6rnektir. Ancak, bu basitli\u011fin ard\u0131nda yatan potansiyel karma\u015f\u0131kl\u0131klar\u0131 ve &#8220;varsay\u0131lan&#8221; olarak kullan\u0131lmas\u0131n\u0131n getirebilece\u011fi sorunlar\u0131 anlamak, daha karma\u015f\u0131k projeler i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>&#8216;expect\/actual&#8217; Varsay\u0131lan Tercih Oldu\u011funda Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve Tuzaklar<\/h3>\n<p><code>expect\/actual<\/code> mekanizmas\u0131, KMP&#8217;nin platformlar aras\u0131 kod payla\u015f\u0131m\u0131n\u0131 kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, her platforma \u00f6zg\u00fc ihtiya\u00e7 i\u00e7in otomatik olarak bu yakla\u015f\u0131m\u0131 benimsemek, zamanla projenizin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve bak\u0131m maliyetini art\u0131rabilir. Bu durum, \u00f6zellikle projenin \u00f6l\u00e7e\u011fi b\u00fcy\u00fcd\u00fck\u00e7e veya yeni platformlar desteklenmeye ba\u015fland\u0131k\u00e7a daha belirgin hale gelir. \u0130\u015fte <code>expect\/actual<\/code>&#8216;\u0131n varsay\u0131lan tercih olarak kullan\u0131lmas\u0131n\u0131n getirdi\u011fi ba\u015fl\u0131ca zorluklar ve tuzaklar:<\/p>\n<h4>Tekrarlayan Kod (Boilerplate) ve Bak\u0131m Y\u00fck\u00fc<\/h4>\n<p>Her platforma \u00f6zg\u00fc k\u00fc\u00e7\u00fck bir farkl\u0131l\u0131k i\u00e7in bile bir <code>expect<\/code> bildirimi ve ard\u0131ndan her desteklenen platform i\u00e7in ayr\u0131 bir <code>actual<\/code> implementasyonu yazmak, h\u0131zla ciddi bir tekrarlayan kod (boilerplate) y\u0131\u011f\u0131n\u0131 olu\u015fturabilir. \u00d6rne\u011fin, uygulaman\u0131zda platforma \u00f6zg\u00fc birka\u00e7 farkl\u0131 depolama mekanizmas\u0131, a\u011f konfig\u00fcrasyonu veya sens\u00f6r eri\u015fimi varsa, her biri i\u00e7in ayr\u0131 ayr\u0131 <code>expect\/actual<\/code> \u00e7iftleri olu\u015fturman\u0131z gerekecektir. Bu, kod taban\u0131n\u0131n b\u00fcy\u00fcmesine, okunabilirli\u011finin azalmas\u0131na ve \u00f6zellikle yeni bir platform eklendi\u011finde veya mevcut bir platformda de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda bak\u0131m y\u00fck\u00fcn\u00fcn artmas\u0131na neden olur. Her de\u011fi\u015fiklik, t\u00fcm <code>actual<\/code> implementasyonlar\u0131n\u0131 g\u00f6zden ge\u00e7irmeyi gerektirebilir, bu da hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve geli\u015ftirme h\u0131z\u0131n\u0131 yava\u015flat\u0131r.<\/p>\n<h4>S\u0131k\u0131 Ba\u011flant\u0131 (Tight Coupling) ve Esneklik Kayb\u0131<\/h4>\n<p>Ortak kodunuzda \u00e7ok fazla <code>expect<\/code> bildirimi kullanmak, ortak mod\u00fcl\u00fcn\u00fcz ile platforma \u00f6zg\u00fc mod\u00fcller aras\u0131nda s\u0131k\u0131 bir ba\u011flant\u0131 (tight coupling) olu\u015fturabilir. Ortak kod, platforma \u00f6zg\u00fc detaylardan tamamen soyutlanm\u0131\u015f gibi g\u00f6r\u00fcnse de, asl\u0131nda her bir <code>expect<\/code> bildirimi, belirli bir <code>actual<\/code> implementasyonunun varl\u0131\u011f\u0131n\u0131 &#8220;bekler&#8221;. Bu durum, bir platformu kald\u0131rmak veya yeni bir platform eklemek istedi\u011finizde, t\u00fcm <code>expect<\/code> bildirilerini ve bunlar\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 g\u00f6zden ge\u00e7irmenizi gerektirir. \u00d6rne\u011fin, uygulaman\u0131z ba\u015flang\u0131\u00e7ta Android ve iOS i\u00e7in tasarlanm\u0131\u015f ve her platform i\u00e7in ayr\u0131 ayr\u0131 <code>expect\/actual<\/code> kullanarak bir dosya indirme y\u00f6neticisi implemente etti\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Sonradan bir web (JavaScript) s\u00fcr\u00fcm\u00fc eklemeye karar verdi\u011finizde, mevcut t\u00fcm <code>expect<\/code> bildirimleri i\u00e7in bir JS <code>actual<\/code> implementasyonu sa\u011flamak zorunda kal\u0131rs\u0131n\u0131z. Bu, projenin mimarisinin esnekli\u011fini azalt\u0131r ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 diren\u00e7li hale getirir.<\/p>\n<h4>Test Edilebilirlik Sorunlar\u0131<\/h4>\n<p><code>expect\/actual<\/code> mekanizmas\u0131, ortak kodun test edilebilirli\u011fini bir miktar zorla\u015ft\u0131rabilir. Ortak kodunuzdaki bir <code>expect<\/code> fonksiyonunu do\u011frudan test etmek istedi\u011finizde, bu fonksiyonun bir <code>actual<\/code> implementasyonuna sahip olmas\u0131 gerekir. Bu, birim testleri yazarken sahte (mock) veya taklit (fake) implementasyonlar sa\u011flaman\u0131z gerekti\u011fi anlam\u0131na gelir. Her bir test ortam\u0131 (JVM i\u00e7in JUnit, iOS i\u00e7in XCTest vb.) i\u00e7in ayr\u0131 ayr\u0131 sahte <code>actual<\/code> implementasyonlar\u0131 olu\u015fturmak, test kodunun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve test s\u00fcrecini uzat\u0131r. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (Dependency Injection &#8211; DI) gibi yakla\u015f\u0131mlar, bu t\u00fcr senaryolarda test edilebilirlik a\u00e7\u0131s\u0131ndan daha esnek \u00e7\u00f6z\u00fcmler sunabilir.<\/p>\n<h4>API Tasar\u0131m\u0131n\u0131n K\u0131s\u0131tlanmas\u0131<\/h4>\n<p><code>expect\/actual<\/code> kullan\u0131rken, ortak API&#8217;nizi genellikle t\u00fcm platformlar\u0131n destekledi\u011fi &#8220;en d\u00fc\u015f\u00fck ortak payda&#8221; (lowest common denominator) prensibine g\u00f6re tasarlamak zorunda kal\u0131rs\u0131n\u0131z. Bu, belirli bir platformda bulunan zengin ve g\u00fc\u00e7l\u00fc API&#8217;leri veya \u00f6zellikleri kullanamayaca\u011f\u0131n\u0131z anlam\u0131na gelebilir. \u00d6rne\u011fin, iOS&#8217;ta \u00e7ok geli\u015fmi\u015f bir animasyon API&#8217;si varken, Android&#8217;deki kar\u015f\u0131l\u0131\u011f\u0131 daha basitse, <code>expect<\/code> bildirimi her iki platformun da destekledi\u011fi temel animasyon \u00f6zellikleriyle s\u0131n\u0131rl\u0131 kalmak zorunda kal\u0131r. Bu durum, platforma \u00f6zg\u00fc deneyimi (native experience) tam olarak sunma yetene\u011finizi k\u0131s\u0131tlayabilir ve ortak kodunuzun potansiyelini d\u00fc\u015f\u00fcrebilir.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryosu olarak, bir e-ticaret uygulamas\u0131n\u0131n KMP ile geli\u015ftirildi\u011fini ve ba\u015flang\u0131\u00e7ta sadece mobil (Android ve iOS) platformlar\u0131 hedefledi\u011fini d\u00fc\u015f\u00fcnelim. Uygulama, platforma \u00f6zg\u00fc olarak bildirim g\u00f6nderme, cihaz\u0131n konumuna eri\u015fme ve kamera kullanma gibi \u00f6zelliklere sahip. Geli\u015ftiriciler, her bir \u00f6zellik i\u00e7in <code>expect\/actual<\/code> \u00e7iftleri olu\u015fturmu\u015flar. Bir y\u0131l sonra, \u015firket uygulaman\u0131n bir masa\u00fcst\u00fc (Desktop) versiyonunu \u00e7\u0131karmaya karar veriyor. Bu durumda, geli\u015ftiricilerin mevcut t\u00fcm <code>expect<\/code> bildirimleri i\u00e7in masa\u00fcst\u00fc platformunda da <code>actual<\/code> implementasyonlar\u0131 sa\u011flamas\u0131 gerekiyor. Masa\u00fcst\u00fc ortam\u0131nda konum veya kamera eri\u015fimi mobil kadar yayg\u0131n veya ayn\u0131 API&#8217;lerle olmayabilir. Bu, ya masa\u00fcst\u00fc i\u00e7in sahte (dummy) implementasyonlar yazmay\u0131 ya da ortak kodda b\u00fcy\u00fck de\u011fi\u015fiklikler yaparak bu \u00f6zelliklerin iste\u011fe ba\u011fl\u0131 hale getirilmesini gerektirecektir. Bu senaryo, <code>expect\/actual<\/code>&#8216;\u0131n varsay\u0131lan olarak her yerde kullan\u0131lmas\u0131n\u0131n uzun vadede ne kadar b\u00fcy\u00fck bir bak\u0131m ve uyumluluk sorunu yaratabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h3>&#8216;expect\/actual&#8217; Yerine Kullan\u0131labilecek Alternatif Yakla\u015f\u0131mlar Nelerdir?<\/h3>\n<p><code>expect\/actual<\/code> mekanizmas\u0131 KMP&#8217;de belirli durumlar i\u00e7in vazge\u00e7ilmez olsa da, her platforma \u00f6zg\u00fc ihtiya\u00e7 i\u00e7in varsay\u0131lan \u00e7\u00f6z\u00fcm olarak kullan\u0131lmas\u0131, yukar\u0131da bahsedilen zorluklar\u0131 beraberinde getirebilir. Neyse ki, daha esnek, bak\u0131m\u0131 kolay ve test edilebilir KMP uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullanabilece\u011fimiz \u00e7e\u015fitli alternatif yakla\u015f\u0131mlar mevcuttur. Bu alternatifler, \u00f6zellikle i\u015f mant\u0131\u011f\u0131 veya soyutlama seviyesi y\u00fcksek olan durumlar i\u00e7in daha uygun olabilir.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection &#8211; DI)<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, KMP projelerinde platforma \u00f6zg\u00fc ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in belki de en g\u00fc\u00e7l\u00fc ve esnek yakla\u015f\u0131mlardan biridir. Bu y\u00f6ntemde, ortak mod\u00fcl\u00fcn\u00fczde platforma \u00f6zg\u00fc bir hizmetin veya bile\u015fenin soyut bir tan\u0131m\u0131n\u0131 (aray\u00fcz veya soyut s\u0131n\u0131f) olu\u015fturursunuz. Daha sonra, her platforma \u00f6zg\u00fc mod\u00fclde bu aray\u00fcz\u00fcn somut bir implementasyonunu sa\u011flars\u0131n\u0131z. Ortak kodunuz, bu implementasyonlar\u0131 do\u011frudan \u00e7a\u011f\u0131rmak yerine, bir DI \u00e7er\u00e7evesi (\u00f6rne\u011fin Koin, Dagger\/Hilt&#8217;in KMP versiyonlar\u0131 veya basit bir el ile DI \u00e7\u00f6z\u00fcm\u00fc) arac\u0131l\u0131\u011f\u0131yla veya bir fabrika (factory) deseniyle bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 al\u0131r.<\/p>\n<p>DI&#8217;nin temel avantaj\u0131, ortak kodunuzun platforma \u00f6zg\u00fc implementasyonlardan tamamen ayr\u0131\u015fmas\u0131n\u0131 sa\u011flamas\u0131d\u0131r. Ortak kod sadece aray\u00fczleri bilir ve implementasyonlar \u00e7al\u0131\u015fma zaman\u0131nda (runtime) sa\u011flan\u0131r. Bu durum, test edilebilirli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r, \u00e7\u00fcnk\u00fc testler s\u0131ras\u0131nda aray\u00fczlerin sahte (mock) implementasyonlar\u0131n\u0131 kolayca enjekte edebilirsiniz. Ayr\u0131ca, yeni bir platform eklendi\u011finde, sadece yeni platforma \u00f6zg\u00fc mod\u00fclde aray\u00fcz\u00fcn bir implementasyonunu sa\u011flaman\u0131z yeterli olur, ortak kodda herhangi bir de\u011fi\u015fiklik yapman\u0131za gerek kalmaz.<\/p>\n<p>\u00d6nceki loglama \u00f6rne\u011fini DI kullanarak yeniden d\u00fczenleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ commonMain\/kotlin\/com\/example\/mylibrary\/ILogger.kt\npackage com.example.mylibrary\n\n\/\/ Ortak mod\u00fclde soyut bir aray\u00fcz tan\u0131ml\u0131yoruz\ninterface ILogger {\n    fun log(tag: String, message: String)\n}\n\n\/\/ commonMain\/kotlin\/com\/example\/mylibrary\/CommonServiceLocator.kt\npackage com.example.mylibrary\n\n\/\/ Basit bir servis bulucu veya DI konteyneri\nobject CommonServiceLocator {\n    lateinit var logger: ILogger\n        private set \/\/ D\u0131\u015far\u0131dan sadece okunabilir\n\n    fun init(platformLogger: ILogger) {\n        if (::logger.isInitialized) {\n            println(\"Logger zaten ba\u015flat\u0131lm\u0131\u015f!\")\n            return\n        }\n        logger = platformLogger\n    }\n}\n\n\/\/ commonMain\/kotlin\/com\/example\/mylibrary\/MyBusinessLogic.kt\npackage com.example.mylibrary\n\nfun doSomeWorkWithDI() {\n    \/\/ Ortak kod, logger'\u0131 CommonServiceLocator \u00fczerinden al\u0131r\n    CommonServiceLocator.logger.log(\"MyFeatureDI\", \"DI ile i\u015flem ba\u015flat\u0131l\u0131yor...\")\n    \/\/ ... i\u015f mant\u0131\u011f\u0131 ...\n    CommonServiceLocator.logger.log(\"MyFeatureDI\", \"DI ile i\u015flem tamamland\u0131.\")\n}\n  <\/code><\/pre>\n<\/div>\n<p>\u015eimdi platforma \u00f6zg\u00fc implementasyonlar\u0131 olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ androidMain\/kotlin\/com\/example\/mylibrary\/AndroidLogger.kt\npackage com.example.mylibrary\n\nimport android.util.Log\n\n\/\/ Android'e \u00f6zg\u00fc logger implementasyonu\nclass AndroidLogger : ILogger {\n    override fun log(tag: String, message: String) {\n        Log.d(tag, message)\n    }\n}\n\n\/\/ Android uygulamas\u0131n\u0131n ba\u015flang\u0131\u00e7 noktas\u0131nda (\u00f6rne\u011fin Application s\u0131n\u0131f\u0131nda)\n\/\/ CommonServiceLocator.init(AndroidLogger()) \u00e7a\u011fr\u0131l\u0131r.\n  <\/code><\/pre>\n<\/div>\n<div class=\"code-container\">\n<pre><code>\n\/\/ iosMain\/kotlin\/com\/example\/mylibrary\/IOSLogger.kt\npackage com.example.mylibrary\n\nimport platform.Foundation.NSLog\n\n\/\/ iOS'a \u00f6zg\u00fc logger implementasyonu\nclass IOSLogger : ILogger {\n    override fun log(tag: String, message: String) {\n        NSLog(\"[%@] %@\", tag, message)\n    }\n}\n\n\/\/ iOS uygulamas\u0131n\u0131n ba\u015flang\u0131\u00e7 noktas\u0131nda (\u00f6rne\u011fin AppDelegate'de)\n\/\/ CommonServiceLocator.init(IOSLogger()) \u00e7a\u011fr\u0131l\u0131r.\n  <\/code><\/pre>\n<\/div>\n<p>Bu yakla\u015f\u0131m, ortak kodun platforma \u00f6zg\u00fc detaylardan tamamen ba\u011f\u0131ms\u0131z olmas\u0131n\u0131 sa\u011flar. <code>expect\/actual<\/code>&#8216;da oldu\u011fu gibi derleme zaman\u0131 bir ba\u011flama yerine, \u00e7al\u0131\u015fma zaman\u0131nda bir implementasyon sa\u011flan\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde mod\u00fclerli\u011fi ve esnekli\u011fi art\u0131r\u0131r.<\/p>\n<h4>KMP&#8217;nin Kendi Mod\u00fcl Yap\u0131s\u0131 ve \u00c7oklu Mod\u00fcller<\/h4>\n<p>KMP, birden fazla ortak mod\u00fcl (\u00f6rne\u011fin <code>common-core<\/code>, <code>common-data<\/code>, <code>common-ui-shared<\/code>) ve platforma \u00f6zg\u00fc mod\u00fcller (<code>android-app<\/code>, <code>ios-app<\/code>) olu\u015fturarak da platform farkl\u0131l\u0131klar\u0131n\u0131 y\u00f6netme esnekli\u011fi sunar. Ortak mod\u00fcller, genellikle i\u015f mant\u0131\u011f\u0131n\u0131 ve veri modellerini i\u00e7erirken, platforma \u00f6zg\u00fc mod\u00fcller UI veya platform API&#8217;leri ile etkile\u015fimden sorumlu olur. Bu yap\u0131, <code>expect\/actual<\/code> kullanmadan da platforma \u00f6zg\u00fc kodun izole edilmesine yard\u0131mc\u0131 olur. \u00d6rne\u011fin, bir platforma \u00f6zg\u00fc veritaban\u0131 eri\u015fimi i\u00e7in, ortak mod\u00fclde sadece bir aray\u00fcz tan\u0131mlay\u0131p, her platformda bu aray\u00fcz\u00fc implemente eden bir depolama mod\u00fcl\u00fc (<code>android-db<\/code>, <code>ios-db<\/code>) olu\u015fturabilirsiniz. Ortak kodunuz, bu depolama mod\u00fcl\u00fcne ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu arac\u0131l\u0131\u011f\u0131yla eri\u015febilir.<\/p>\n<h4>Yap\u0131land\u0131rma (Configuration) ve \u00d6zellik Bayraklar\u0131 (Feature Flags)<\/h4>\n<p>K\u00fc\u00e7\u00fck ve \u00f6nemsiz platform farkl\u0131l\u0131klar\u0131 i\u00e7in <code>expect\/actual<\/code> kullanmak yerine, basit yap\u0131land\u0131rma dosyalar\u0131 veya \u00f6zellik bayraklar\u0131 (feature flags) kullanmak daha pratik olabilir. \u00d6rne\u011fin, bir API&#8217;nin temel URL&#8217;si platforma g\u00f6re de\u011fi\u015fiyorsa, bunu <code>expect\/actual<\/code> ile yapmak yerine, her platformun kendi build konfig\u00fcrasyonunda (<code>build.gradle.kts<\/code> veya <code>Info.plist<\/code> gibi) tan\u0131mlay\u0131p \u00e7al\u0131\u015fma zaman\u0131nda okuyabilirsiniz. Bu, daha az tekrarlayan kod ve daha az derleme zaman\u0131 ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<p>Bu alternatif yakla\u015f\u0131mlar, <code>expect\/actual<\/code>&#8216;\u0131n g\u00fc\u00e7l\u00fc bir ara\u00e7 olmas\u0131na ra\u011fmen, her durumda en iyi \u00e7\u00f6z\u00fcm olmad\u0131\u011f\u0131n\u0131 ve projenin ihtiya\u00e7lar\u0131na g\u00f6re farkl\u0131 stratejilerin benimsenmesi gerekti\u011fini g\u00f6stermektedir. Do\u011fru arac\u0131 do\u011fru senaryoda kullanmak, KMP projelerinizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Ne Zaman &#8216;expect\/actual&#8217; Kullanmal\u0131y\u0131z? Do\u011fru Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>\u00d6nceki b\u00f6l\u00fcmlerde <code>expect\/actual<\/code>&#8216;\u0131n varsay\u0131lan tercih olarak kullan\u0131lmas\u0131n\u0131n getirebilece\u011fi zorluklar\u0131 ve alternatif yakla\u015f\u0131mlar\u0131 ele ald\u0131k. Ancak bu, <code>expect\/actual<\/code>&#8216;\u0131n tamamen k\u00f6t\u00fc bir ara\u00e7 oldu\u011fu anlam\u0131na gelmez. Aksine, belirli senaryolarda son derece g\u00fc\u00e7l\u00fc ve hatta vazge\u00e7ilmez bir \u00e7\u00f6z\u00fcm olabilir. \u00d6nemli olan, bu mekanizmay\u0131 ne zaman ve neden kullanaca\u011f\u0131m\u0131z\u0131 do\u011fru bir \u015fekilde anlamakt\u0131r. \u0130\u015fte <code>expect\/actual<\/code>&#8216;\u0131n en uygun oldu\u011fu durumlar ve do\u011fru kullan\u0131m senaryolar\u0131:<\/p>\n<h4>Ger\u00e7ekten Platforma \u00d6zg\u00fc API&#8217;leri Sarmalama \u0130htiyac\u0131 Oldu\u011funda<\/h4>\n<p><code>expect\/actual<\/code>&#8216;\u0131n en temel ve do\u011fru kullan\u0131m alan\u0131, ortak kodun do\u011frudan eri\u015femedi\u011fi, platforma \u00f6zg\u00fc temel sistem API&#8217;lerini (Application Programming Interface &#8211; Uygulama Programlama Aray\u00fcz\u00fc) sarmalamakt\u0131r. Bu t\u00fcr API&#8217;ler genellikle i\u015fletim sistemi (OS) seviyesinde i\u015flevsellik sunar ve farkl\u0131 platformlarda tamamen farkl\u0131 implementasyonlara sahiptir. \u00d6rnek olarak:<\/p>\n<ul>\n<li><strong>Dosya Sistemi Eri\u015fimi:<\/strong> Bir dosya olu\u015fturma, okuma, yazma veya silme i\u015flemleri her platformda farkl\u0131 API&#8217;lerle yap\u0131l\u0131r (Android&#8217;de Java NIO, iOS&#8217;ta Foundation framework&#8217;\u00fc gibi).<\/li>\n<li><strong>A\u011f \u0130stekleri:<\/strong> Temel HTTP istemcileri veya soket i\u015flemleri platforma g\u00f6re de\u011fi\u015febilir (her ne kadar <code>ktor-client<\/code> gibi k\u00fct\u00fcphaneler bunu soyutlasa da, altta yatan implementasyonlar <code>expect\/actual<\/code> kullan\u0131r).<\/li>\n<li><strong>Veritaban\u0131 Eri\u015fimi:<\/strong> SQLite veritabanlar\u0131na eri\u015fim veya di\u011fer yerel depolama mekanizmalar\u0131.<\/li>\n<li><strong>Platform Bilgileri:<\/strong> Cihaz\u0131n modeli, i\u015fletim sistemi s\u00fcr\u00fcm\u00fc, dil ayarlar\u0131 gibi bilgilere eri\u015fim.<\/li>\n<li><strong>Kriptografi ve G\u00fcvenli Depolama:<\/strong> Platformun sa\u011flad\u0131\u011f\u0131 g\u00fcvenli depolama anahtarlar\u0131 veya kriptografik algoritmalar.<\/li>\n<\/ul>\n<p>Bu durumlarda, <code>expect\/actual<\/code> kullanmak, ortak kodunuzun bu platforma \u00f6zg\u00fc detaylardan soyutlanmas\u0131n\u0131 sa\u011flar ve her platformun kendi en verimli ve g\u00fcvenli yolunu kullanmas\u0131na olanak tan\u0131r. Ortak kodunuz sadece &#8220;bir dosya kaydet&#8221; der, nas\u0131l kaydedilece\u011fi platformun sorumlulu\u011fundad\u0131r.<\/p>\n<h4>\u00c7ok K\u00fc\u00e7\u00fck, \u0130zole Edilmi\u015f ve Nadiren De\u011fi\u015fen Platform Farkl\u0131l\u0131klar\u0131<\/h4>\n<p>E\u011fer platformlar aras\u0131ndaki fark \u00e7ok k\u00fc\u00e7\u00fck, izole edilmi\u015f ve gelecekte de\u011fi\u015fme olas\u0131l\u0131\u011f\u0131 d\u00fc\u015f\u00fckse, <code>expect\/actual<\/code> basit ve etkili bir \u00e7\u00f6z\u00fcm sunabilir. \u00d6rne\u011fin, bir platforma \u00f6zg\u00fc sabit bir de\u011fer (\u00f6rne\u011fin bir API anahtar\u0131 veya bir yap\u0131land\u0131rma bayra\u011f\u0131) veya \u00e7ok basit bir yard\u0131mc\u0131 fonksiyon (utility function) i\u00e7in kullan\u0131labilir. Bu t\u00fcr senaryolarda, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi daha karma\u015f\u0131k bir mekanizma kurmak, gereksiz bir m\u00fchendislik y\u00fck\u00fc yaratabilir. <code>expect\/actual<\/code>, bu t\u00fcr basit durumlar i\u00e7in &#8220;just enough&#8221; (yeterli) soyutlama sa\u011flar.<\/p>\n<h4>Derleme Zaman\u0131 (Compile-Time) Garantileri Gerekti\u011finde<\/h4>\n<p><code>expect\/actual<\/code>, derleme zaman\u0131 (compile-time) garantileri sa\u011flar. Yani, ortak mod\u00fclde beklenen her \u015feyin, derleme an\u0131nda ilgili platform mod\u00fcllerinde bir implementasyona sahip olmas\u0131 gerekir. E\u011fer bir <code>actual<\/code> implementasyonu eksikse, derleyici hata verir. Bu, \u00f6zellikle kritik sistem bile\u015fenleri veya temel altyap\u0131 kodlar\u0131 i\u00e7in \u00f6nemlidir, \u00e7\u00fcnk\u00fc eksik implementasyonlar\u0131n g\u00f6zden ka\u00e7\u0131r\u0131lmas\u0131n\u0131 engeller ve uygulaman\u0131n \u00e7al\u0131\u015fma zaman\u0131nda beklenmedik hatalarla kar\u015f\u0131la\u015fma riskini azalt\u0131r. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi \u00e7al\u0131\u015fma zaman\u0131 (runtime) \u00e7\u00f6z\u00fcmleri, bu t\u00fcr hatalar\u0131 ancak uygulama \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda veya test edildi\u011finde ortaya \u00e7\u0131karabilir.<\/p>\n<h4>Kotlin&#8217;in Kendisi Taraf\u0131ndan Sa\u011flanan Platforma \u00d6zg\u00fc S\u0131n\u0131flar\u0131\/Fonksiyonlar\u0131 Kullan\u0131rken<\/h4>\n<p>Kotlin ekosistemindeki baz\u0131 k\u00fct\u00fcphaneler ve dil \u00f6zellikleri, zaten dahili olarak <code>expect\/actual<\/code> mekanizmas\u0131n\u0131 kullan\u0131r. \u00d6rne\u011fin, <code>kotlinx.coroutines<\/code> k\u00fct\u00fcphanesindeki <code>Dispatchers<\/code> s\u0131n\u0131f\u0131, farkl\u0131 platformlarda i\u015f par\u00e7ac\u0131\u011f\u0131 (thread) y\u00f6netimi i\u00e7in <code>expect\/actual<\/code> kullan\u0131r. Bu t\u00fcr durumlarda, mevcut k\u00fct\u00fcphanelerin mimarisine uyum sa\u011flamak i\u00e7in sizin de <code>expect\/actual<\/code> kullanman\u0131z do\u011fal ve do\u011fru bir yakla\u015f\u0131md\u0131r. Benzer \u015fekilde, platforma \u00f6zg\u00fc bir <code>UUID<\/code> (Evrensel Tekil Tan\u0131mlay\u0131c\u0131) olu\u015fturma fonksiyonu gibi standart k\u00fct\u00fcphane benzeri i\u015flevler i\u00e7in <code>expect\/actual<\/code> iyi bir se\u00e7enektir.<\/p>\n<p><strong>Vaka Analizi: Platforma \u00d6zg\u00fc Dosya Kaydetme \u0130\u015flevi<\/strong><\/p>\n<p>Bir uygulaman\u0131n, kullan\u0131c\u0131 taraf\u0131ndan olu\u015fturulan bir raporu PDF format\u0131nda cihaz\u0131n yerel depolama alan\u0131na kaydetmesi gerekti\u011fini varsayal\u0131m. Bu i\u015flevsellik, her platformda farkl\u0131 API&#8217;ler gerektirecektir. Android&#8217;de <code>FileOutputStream<\/code> veya <code>Storage Access Framework<\/code> kullan\u0131l\u0131rken, iOS&#8217;ta <code>FileManager<\/code> veya <code>DocumentDirectory<\/code> gibi yap\u0131lar kullan\u0131l\u0131r. Bu senaryoda <code>expect\/actual<\/code> kullanmak olduk\u00e7a mant\u0131kl\u0131d\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ commonMain\/kotlin\/com\/example\/files\/FileSaver.kt\npackage com.example.files\n\nexpect class PlatformFileSaver {\n    fun saveFile(filename: String, content: ByteArray): Boolean\n}\n\n\/\/ commonMain\/kotlin\/com\/example\/reports\/ReportGenerator.kt\npackage com.example.reports\n\nclass ReportGenerator {\n    private val fileSaver = PlatformFileSaver() \/\/ expect class'\u0131 burada kullan\u0131r\u0131z\n\n    fun generateAndSavePdf(reportData: String, filename: String): Boolean {\n        val pdfContent = generatePdf(reportData) \/\/ PDF i\u00e7eri\u011fini olu\u015ftur\n        return fileSaver.saveFile(filename, pdfContent)\n    }\n\n    private fun generatePdf(data: String): ByteArray {\n        \/\/ Basit bir \u00f6rnek, ger\u00e7ek PDF \u00fcretimi daha karma\u015f\u0131k olacakt\u0131r\n        return \"PDF \u0130\u00e7eri\u011fi: $data\".encodeToByteArray()\n    }\n}\n  <\/code><\/pre>\n<\/div>\n<p>Platforma \u00f6zg\u00fc implementasyonlar:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ androidMain\/kotlin\/com\/example\/files\/PlatformFileSaverActual.kt\npackage com.example.files\n\nimport java.io.File\nimport java.io.FileOutputStream\nimport android.os.Environment\n\nactual class PlatformFileSaver {\n    actual fun saveFile(filename: String, content: ByteArray): Boolean {\n        return try {\n            val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)\n            val file = File(documentsDir, filename)\n            FileOutputStream(file).use { it.write(content) }\n            true\n        } catch (e: Exception) {\n            e.printStackTrace()\n            false\n        }\n    }\n}\n  <\/code><\/pre>\n<\/div>\n<div class=\"code-container\">\n<pre><code>\n\/\/ iosMain\/kotlin\/com\/example\/files\/PlatformFileSaverActual.kt\npackage com.example.files\n\nimport platform.Foundation.*\n\nactual class PlatformFileSaver {\n    actual fun saveFile(filename: String, content: ByteArray): Boolean {\n        return try {\n            val documentsPath = NSSearchPathForDirectoriesInDomains(\n                NSSearchPathDirectory.NSDocumentDirectory,\n                NSSearchPathDomainMask.NSUserDomainMask,\n                true\n            ).first() as String\n            val filePath = NSURL.fileURLWithPath(documentsPath).URLByAppendingPathComponent(filename)\n            val nsData = content.toNSData()\n            nsData.writeToFile(filePath.path!!, atomically = true)\n        } catch (e: Exception) {\n            println(\"Dosya kaydetme hatas\u0131: ${e.localizedDescription}\")\n            false\n        }\n    }\n\n    \/\/ ByteArray'\u0131 NSData'ya d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in yard\u0131mc\u0131 fonksiyon\n    private fun ByteArray.toNSData(): NSData {\n        val data = NSMutableData.dataWithLength(this.size.toULong())\n        data?.appendBytes(this.refTo(0), this.size.toULong())\n        return data as NSData\n    }\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>PlatformFileSaver<\/code> s\u0131n\u0131f\u0131, her platformun kendi dosya sistemi API&#8217;lerini kullanarak dosyalar\u0131 kaydetme i\u015flevini soyutlar. Ortak kod (<code>ReportGenerator<\/code>), bu soyutlamay\u0131 kullan\u0131r ve platforma \u00f6zg\u00fc detaylarla ilgilenmez. Bu, <code>expect\/actual<\/code>&#8216;\u0131n en uygun ve verimli kullan\u0131m alanlar\u0131ndan biridir.<\/p>\n<h3>KMP Projelerinde Esnek ve Bak\u0131m\u0131 Kolay Bir Yap\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>KMP projelerinin uzun vadede ba\u015far\u0131l\u0131 olmas\u0131 i\u00e7in esnek, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir bir mimariye sahip olmas\u0131 kritik \u00f6neme sahiptir. Bu, sadece do\u011fru ara\u00e7lar\u0131 se\u00e7mekle de\u011fil, ayn\u0131 zamanda belirli tasar\u0131m prensiplerini ve en iyi uygulamalar\u0131 benimsemekle de m\u00fcmk\u00fcnd\u00fcr. \u0130\u015fte KMP projelerinizde bu hedeflere ula\u015fman\u0131za yard\u0131mc\u0131 olacak baz\u0131 stratejiler:<\/p>\n<h4>Mod\u00fcler Tasar\u0131m ve Sorumluluklar\u0131n Ayr\u0131lmas\u0131<\/h4>\n<p>KMP projelerinde mod\u00fcler tasar\u0131m, karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmenin temel yollar\u0131ndan biridir. Uygulaman\u0131z\u0131n farkl\u0131 katmanlar\u0131n\u0131 ve i\u015flevselliklerini ayr\u0131 mod\u00fcllere ay\u0131r\u0131n. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong><code>common-core<\/code>:<\/strong> Temel i\u015f mant\u0131\u011f\u0131, veri modelleri, yard\u0131mc\u0131 fonksiyonlar. Platforma \u00f6zg\u00fc hi\u00e7bir \u015feye ba\u011f\u0131ml\u0131 olmamal\u0131d\u0131r.<\/li>\n<li><strong><code>common-data<\/code>:<\/strong> Veri depolama aray\u00fczleri, API istemcileri i\u00e7in soyutlamalar.<\/li>\n<li><strong><code>common-domain<\/code>:<\/strong> \u0130\u015f kurallar\u0131 ve kullan\u0131m senaryolar\u0131 (use cases).<\/li>\n<li><strong>Platforma \u00f6zg\u00fc mod\u00fcller (<code>android-app<\/code>, <code>ios-app<\/code>, <code>web-app<\/code>):<\/strong> UI katman\u0131, platforma \u00f6zg\u00fc API implementasyonlar\u0131 ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ayarlar\u0131.<\/li>\n<\/ul>\n<p>Bu mod\u00fcler yap\u0131, her mod\u00fcl\u00fcn belirli bir sorumlulu\u011fa sahip olmas\u0131n\u0131 sa\u011flar ve de\u011fi\u015fikliklerin etkisini s\u0131n\u0131rlar. Ortak mod\u00fcller, platforma \u00f6zg\u00fc detaylar\u0131 bilmemeli, sadece soyutlamalarla \u00e7al\u0131\u015fmal\u0131d\u0131r. Bu, &#8220;Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Tersine \u00c7evrilmesi&#8221; (Dependency Inversion Principle) prensibini destekler.<\/p>\n<h4>Aray\u00fcz Odakl\u0131 Geli\u015ftirme (Interface-Oriented Development)<\/h4>\n<p>Ortak kodunuzda platforma \u00f6zg\u00fc davran\u0131\u015flar\u0131 soyutlamak i\u00e7in m\u00fcmk\u00fcn oldu\u011funca aray\u00fczler (interfaces) veya soyut s\u0131n\u0131flar kullan\u0131n. Ortak mod\u00fcl sadece bu aray\u00fczleri tan\u0131mlar ve bu aray\u00fczlerin implementasyonlar\u0131 platforma \u00f6zg\u00fc mod\u00fcllerde sa\u011flan\u0131r. Bu yakla\u015f\u0131m, ortak kodunuzun platform detaylar\u0131ndan tamamen ayr\u0131\u015fmas\u0131n\u0131 sa\u011flar ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 daha diren\u00e7li hale getirir. \u00d6rne\u011fin, bir a\u011f istemcisi i\u00e7in <code>common-data<\/code> mod\u00fcl\u00fcnde bir <code>NetworkClient<\/code> aray\u00fcz\u00fc tan\u0131mlay\u0131p, <code>android-data<\/code> ve <code>ios-data<\/code> mod\u00fcllerinde bu aray\u00fcz\u00fcn <code>ktor-client<\/code> veya platforma \u00f6zg\u00fc HTTP k\u00fct\u00fcphaneleriyle implementasyonlar\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) Prensiplerini Benimsemek<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, KMP projelerinde esnekli\u011fi ve test edilebilirli\u011fi art\u0131ran temel bir desendir. Bir DI \u00e7er\u00e7evesi (Koin, Kodein gibi) kullanarak veya manuel olarak basit bir servis bulucu (Service Locator) uygulayarak, platforma \u00f6zg\u00fc implementasyonlar\u0131 ortak mod\u00fcl\u00fcn\u00fcze enjekte edin. Bu, ortak kodunuzun platforma \u00f6zg\u00fc implementasyonlar\u0131 do\u011frudan olu\u015fturmak yerine, d\u0131\u015far\u0131dan almas\u0131n\u0131 sa\u011flar. B\u00f6ylece, testlerde sahte (mock) implementasyonlar enjekte etmek \u00e7ok daha kolay hale gelir ve farkl\u0131 platformlar i\u00e7in farkl\u0131 implementasyonlar sa\u011flamak esnekle\u015fir.<\/p>\n<h4>Test Stratejileri ve Kapsaml\u0131 Testler<\/h4>\n<p>KMP&#8217;nin en b\u00fcy\u00fck avantajlar\u0131ndan biri, i\u015f mant\u0131\u011f\u0131n\u0131z\u0131n \u00e7o\u011funu ortak kodda yazabilmeniz ve bu kodu bir kez test ederek t\u00fcm platformlarda g\u00fcvenilirli\u011fini sa\u011flaman\u0131zd\u0131r. Ortak kodunuz i\u00e7in kapsaml\u0131 birim testleri ve entegrasyon testleri yaz\u0131n. Platforma \u00f6zg\u00fc mod\u00fcller i\u00e7in ise, UI testleri ve platforma \u00f6zg\u00fc API entegrasyon testlerine odaklan\u0131n. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu kullanarak, ortak kodun testlerini platforma \u00f6zg\u00fc ba\u011f\u0131ml\u0131l\u0131klardan izole edebilirsiniz. Bu, test s\u00fcrecini h\u0131zland\u0131r\u0131r ve hatalar\u0131 erken a\u015famada tespit etmenize yard\u0131mc\u0131 olur.<\/p>\n<h4>Kod \u0130ncelemesi ve Ekip \u0130\u00e7i Standartlar<\/h4>\n<p>KMP projelerinde tutarl\u0131l\u0131k, \u00f6zellikle birden fazla geli\u015ftiricinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 ekiplerde hayati \u00f6neme sahiptir. D\u00fczenli kod incelemeleri (code reviews) yaparak, <code>expect\/actual<\/code> kullan\u0131m\u0131n\u0131n do\u011fru senaryolarda yap\u0131ld\u0131\u011f\u0131ndan ve alternatif yakla\u015f\u0131mlar\u0131n gerekti\u011finde tercih edildi\u011finden emin olun. Ekip i\u00e7i kodlama standartlar\u0131 ve mimari prensipler belirlemek, projenin uzun vadede s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. Hangi durumlarda <code>expect\/actual<\/code>, hangi durumlarda DI veya ba\u015fka bir yakla\u015f\u0131m\u0131n kullan\u0131laca\u011f\u0131na dair net y\u00f6nergeler olu\u015fturmak, geli\u015ftiricilerin do\u011fru kararlar\u0131 vermesine yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Deneyimli kullan\u0131c\u0131lar i\u00e7in ek ipu\u00e7lar\u0131: B\u00fcy\u00fck KMP projelerinde, mimari desenler (\u00f6rne\u011fin MVI &#8211; Model-View-Intent veya MVVM &#8211; Model-View-ViewModel) ve \u00e7oklu mod\u00fcl yap\u0131lar\u0131, kodun daha iyi organize edilmesine yard\u0131mc\u0131 olabilir. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) s\u00fcre\u00e7lerinizi, t\u00fcm platformlar i\u00e7in otomatik testler ve derlemeler i\u00e7erecek \u015fekilde yap\u0131land\u0131r\u0131n. \u00d6zellikle yeni bir platform ekledi\u011finizde veya b\u00fcy\u00fck bir mimari de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda, otomatik testler ve derleme pipeline&#8217;lar\u0131, potansiyel sorunlar\u0131 erkenden yakalaman\u0131z\u0131 sa\u011flar. Ayr\u0131ca, <code>expect\/actual<\/code> bildirimlerini minimumda tutmak ve bunlar\u0131 genellikle sadece platforma \u00f6zg\u00fc API&#8217;leri sarmalayan d\u00fc\u015f\u00fck seviyeli k\u00fct\u00fcphaneler i\u00e7in ay\u0131rmak, genel proje karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azaltacakt\u0131r.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>Kotlin Multiplatform (KMP), tek bir kod taban\u0131ndan birden fazla platforma uygulama geli\u015ftirme vizyonuyla mobil uygulama geli\u015ftirme d\u00fcnyas\u0131nda devrim yaratmaya devam ediyor. Bu mimarinin temel ta\u015f\u0131 olan <code>expect\/actual<\/code> mekanizmas\u0131, platforma \u00f6zg\u00fc kodlar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve kullan\u0131\u015fl\u0131 bir ara\u00e7t\u0131r. Ancak, bu makalede detayl\u0131ca ele ald\u0131\u011f\u0131m\u0131z gibi, <code>expect\/actual<\/code> yakla\u015f\u0131m\u0131n\u0131 her platforma \u00f6zg\u00fc ihtiya\u00e7 i\u00e7in varsay\u0131lan tercih olarak kullanmak, uzun vadede projenizin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131, bak\u0131m maliyetini ve esnekli\u011fini olumsuz etkileyebilir.<\/p>\n<p><code>expect\/actual<\/code>&#8216;\u0131n g\u00fc\u00e7l\u00fc y\u00f6nleri, \u00f6zellikle ger\u00e7ekten platforma \u00f6zg\u00fc temel sistem API&#8217;lerini sarmalama, derleme zaman\u0131 garantileri sa\u011flama ve \u00e7ok k\u00fc\u00e7\u00fck, izole edilmi\u015f farkl\u0131l\u0131klar\u0131 y\u00f6netme durumlar\u0131nda ortaya \u00e7\u0131kar. Ancak, tekrarlayan kod (boilerplate), s\u0131k\u0131 ba\u011flant\u0131 (tight coupling), test edilebilirlik zorluklar\u0131 ve API tasar\u0131m k\u0131s\u0131tlamalar\u0131 gibi potansiyel tuzaklar\u0131 g\u00f6z ard\u0131 etmemek gerekir. Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (DI), mod\u00fcler tasar\u0131m ve aray\u00fcz odakl\u0131 geli\u015ftirme gibi alternatif yakla\u015f\u0131mlar\u0131 benimsemek, KMP projelerinizin daha s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<p>Unutmay\u0131n ki, do\u011fru arac\u0131 do\u011fru senaryoda kullanmak, ba\u015far\u0131l\u0131 yaz\u0131l\u0131m geli\u015ftirmenin anahtar\u0131d\u0131r. <code>expect\/actual<\/code>, KMP ara\u00e7 kutunuzdaki de\u011ferli bir \u00f6\u011fedir, ancak ak\u0131ll\u0131ca ve stratejik olarak kullan\u0131lmas\u0131 gereken bir \u00f6\u011fedir. Projenizin ihtiya\u00e7lar\u0131n\u0131 dikkatlice de\u011ferlendirerek, esnek, bak\u0131m\u0131 kolay ve performansl\u0131 KMP uygulamalar\u0131 in\u015fa edebilirsiniz.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<p><strong>1. <code>expect\/actual<\/code> performans\u0131 etkiler mi?<\/strong><\/p>\n<p>Genel olarak, <code>expect\/actual<\/code> mekanizmas\u0131n\u0131n kendisi performans\u0131 do\u011frudan ve \u00f6nemli \u00f6l\u00e7\u00fcde etkilemez. Derleme zaman\u0131nda uygun <code>actual<\/code> implementasyonu ba\u011fland\u0131\u011f\u0131 i\u00e7in, \u00e7al\u0131\u015fma zaman\u0131nda ek bir soyutlama katman\u0131 maliyeti olmaz. Performans \u00fczerindeki olas\u0131 etkiler, <code>actual<\/code> implementasyonunun kendisinin verimlili\u011finden kaynaklan\u0131r; yani platforma \u00f6zg\u00fc kodun ne kadar iyi yaz\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<p><strong>2. Her platforma \u00f6zg\u00fc kod i\u00e7in <code>expect\/actual<\/code> kullanmal\u0131 m\u0131y\u0131m?<\/strong><\/p>\n<p>Hay\u0131r, kesinlikle kullanmamal\u0131s\u0131n\u0131z. Bu makalede vurguland\u0131\u011f\u0131 gibi, <code>expect\/actual<\/code>&#8216;\u0131 varsay\u0131lan tercih olarak kullanmak, tekrarlayan kod, s\u0131k\u0131 ba\u011flant\u0131 ve bak\u0131m zorluklar\u0131na yol a\u00e7abilir. Sadece ger\u00e7ekten platforma \u00f6zg\u00fc temel API&#8217;leri sarmalaman\u0131z gerekti\u011finde, derleme zaman\u0131 garantileri arad\u0131\u011f\u0131n\u0131zda veya \u00e7ok k\u00fc\u00e7\u00fck, izole edilmi\u015f farkl\u0131l\u0131klar i\u00e7in kullanmal\u0131s\u0131n\u0131z. Di\u011fer durumlarda ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi alternatifleri de\u011ferlendirmek daha iyidir.<\/p>\n<p><strong>3. B\u00fcy\u00fck bir projede <code>expect\/actual<\/code>&#8216;\u0131 DI&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrmek m\u00fcmk\u00fcn m\u00fc?<\/strong><\/p>\n<p>Evet, m\u00fcmk\u00fcnd\u00fcr ancak projenin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ve mevcut <code>expect\/actual<\/code> kullan\u0131m\u0131n\u0131n yayg\u0131nl\u0131\u011f\u0131na ba\u011fl\u0131 olarak zaman ve \u00e7aba gerektirebilir. Genellikle, her <code>expect<\/code> bildirimi i\u00e7in ortak mod\u00fclde bir aray\u00fcz tan\u0131mlan\u0131r ve platforma \u00f6zg\u00fc <code>actual<\/code> implementasyonlar\u0131 bu aray\u00fcz\u00fc implemente edecek s\u0131n\u0131flara d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Daha sonra bu s\u0131n\u0131flar, bir DI \u00e7er\u00e7evesi veya manuel DI kullan\u0131larak enjekte edilir. Bu, kademeli olarak yap\u0131labilir, her bir <code>expect\/actual<\/code> \u00e7ifti ayr\u0131 ayr\u0131 d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek risk minimize edilebilir.<\/p>\n<p><strong>4. Hangi KMP k\u00fct\u00fcphaneleri <code>expect\/actual<\/code> kullan\u0131r?<\/strong><\/p>\n<p>Bir\u00e7ok pop\u00fcler KMP k\u00fct\u00fcphanesi, platforma \u00f6zg\u00fc i\u015flevselli\u011fi soyutlamak i\u00e7in dahili olarak <code>expect\/actual<\/code> kullan\u0131r. \u00d6rnekler aras\u0131nda <code>kotlinx.coroutines<\/code> (<code>Dispatchers<\/code> i\u00e7in), <code>ktor-client<\/code> (HTTP istemci implementasyonlar\u0131 i\u00e7in), <code>kotlinx.serialization<\/code> (platforma \u00f6zg\u00fc serile\u015ftirme\/deserile\u015ftirme i\u00e7in) ve <code>SQLDelight<\/code> (veritaban\u0131 s\u00fcr\u00fcc\u00fcleri i\u00e7in) bulunmaktad\u0131r. Bu k\u00fct\u00fcphaneler, <code>expect\/actual<\/code>&#8216;\u0131n do\u011fru ve stratejik kullan\u0131m\u0131na iyi \u00f6rnekler te\u015fkil eder.<\/p>\n<p><strong>5. <code>expect\/actual<\/code> olmadan KMP&#8217;de platforma \u00f6zg\u00fc kod nas\u0131l yaz\u0131l\u0131r?<\/strong><\/p>\n<p><code>expect\/actual<\/code> olmadan platforma \u00f6zg\u00fc kod yazman\u0131n temel yolu, ortak mod\u00fclde aray\u00fczler tan\u0131mlamak ve bu aray\u00fczlerin implementasyonlar\u0131n\u0131 platforma \u00f6zg\u00fc mod\u00fcllerde sa\u011flamakt\u0131r. Ortak kod, bu implementasyonlar\u0131 do\u011frudan \u00e7a\u011f\u0131rmak yerine, bir ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 (bir DI \u00e7er\u00e7evesi veya basit bir fabrika deseni) arac\u0131l\u0131\u011f\u0131yla al\u0131r. Bu, ortak kodun platforma \u00f6zg\u00fc detaylardan tamamen ayr\u0131\u015fmas\u0131n\u0131 sa\u011flar ve test edilebilirli\u011fi art\u0131r\u0131r. Ayr\u0131ca, platforma \u00f6zg\u00fc build konfig\u00fcrasyonlar\u0131 veya \u00f6zellik bayraklar\u0131 da k\u00fc\u00e7\u00fck farkl\u0131l\u0131klar i\u00e7in kullan\u0131labilir.<\/p>\n<p>#KotlinMultiplatform #KMP #expectActual #Yaz\u0131l\u0131mMimarisi #Ba\u011f\u0131ml\u0131l\u0131kEnjeksiyonu #\u00c7okluPlatformGeli\u015ftirme #KodPayla\u015f\u0131m\u0131<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/simulate-kmp-expect-actual-pattern\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/simulate-kmp-expect-actual-pattern<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Kotlin Multiplatform (KMP) ile tek bir kod taban\u0131ndan birden fazla platforma uygulama geli\u015ftirmek heyecan verici bir vaat sunar.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-44471","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kotlin Multiplatform&#039;da &#039;expect\/actual&#039; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kotlin Multiplatform&#039;da &#039;expect\/actual&#039; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?\" \/>\n<meta property=\"og:description\" content=\"Kotlin Multiplatform (KMP) ile tek bir kod taban\u0131ndan birden fazla platforma uygulama geli\u015ftirmek heyecan verici bir vaat sunar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-02T06:05:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-02T06:06:21+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?\",\"datePublished\":\"2026-09-02T06:05:52+00:00\",\"dateModified\":\"2026-09-02T06:06:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\"},\"wordCount\":4248,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\",\"name\":\"Kotlin Multiplatform'da 'expect\/actual' Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-09-02T06:05:52+00:00\",\"dateModified\":\"2026-09-02T06:06:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kotlin Multiplatform'da 'expect\/actual' Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Kotlin Multiplatform'da 'expect\/actual' Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?","og_description":"Kotlin Multiplatform (KMP) ile tek bir kod taban\u0131ndan birden fazla platforma uygulama geli\u015ftirmek heyecan verici bir vaat sunar.","og_url":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-09-02T06:05:52+00:00","article_modified_time":"2026-09-02T06:06:21+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?","datePublished":"2026-09-02T06:05:52+00:00","dateModified":"2026-09-02T06:06:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/"},"wordCount":4248,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/","url":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/","name":"Kotlin Multiplatform'da 'expect\/actual' Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-09-02T06:05:52+00:00","dateModified":"2026-09-02T06:06:21+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-multiplatformda-expect-actual-yaklasimi-varsayilan-tercih-neden-yanlis-olabilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kotlin Multiplatform&#8217;da &#8216;expect\/actual&#8217; Yakla\u015f\u0131m\u0131: Varsay\u0131lan Tercih Neden Yanl\u0131\u015f Olabilir?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=44471"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44471\/revisions"}],"predecessor-version":[{"id":44472,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44471\/revisions\/44472"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=44471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=44471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=44471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}