---
title: 'Mağaza ve Yayın Kısıtları'
source: 'https://academia.sh/tr/kurslar/capraz-platform-yaklasimlari/magaza-ve-yayin-kisitlari'
course: 'Çapraz Platform Yaklaşımları'
language: tr
updated: '2026-10-21T05:02:50+00:00'
license: 'CC BY-SA 4.0'
objectives:
    - 'Uygulama mağazası kurallarının ve mağaza incelemesinin kodun paylaşımını nasıl etkilediğini açıklar'
    - 'Yalnız bir platformda yazılan uygulama içi güncelleme akışını tek olarak ölçer'
    - 'Güncelleme kararını veren ortak işlev ile akışı yürüten platform koduna ayrı paylaşım atar'
    - 'Bayrakla kapatılan kodun pakete girmesine rağmen dallı sayıldığını gösterir'
---

# Mağaza ve Yayın Kısıtları

Uygulama mağazası kuralları, mağaza incelemesi ve uygulama içi güncelleme kodun paylaşımını da belirler. Ders, güncelleme akışını yalnız bir platformda yazılan tek olarak sınıflar ve bayrakla kapatılan kodun dallı sayıldığını ölçer.

Önceki ders başarım gerekçesinin kodu ikize çevirebildiğini gösterdi. Bunların hepsi uygulamanın çalışma anıyla ilgiliydi. Kodun kullanıcıya ulaşması ise ayrı bir sınırdan geçer: uygulama mağazası. Kursun sorusu burada da aynı kalır: **bu özelliğin kodu platformlar arasında nasıl paylaşılıyor?** Dört yanıtın tanımı açılış dersindeki gibidir ve burada yeniden yazılmaz.

Kuralı çekirdek verir ve her derste aynı dosyayla gelir.

```javascript
// sharing.mjs — bir ozelligin kodunun platformlar arasinda nasil paylasildigini siniflandirir
export const PLATFORMS = ["ios", "android"];

export class Sharing {
  constructor(label, impl, samples) {
    this.label = label;
    this.total = samples.length;
    this.missing = PLATFORMS.filter((p) => typeof impl[p] !== "function");
    const present = PLATFORMS.filter((p) => !this.missing.includes(p));
    this.code = new Set(present.map((p) => impl[p])).size;
    if (this.missing.length > 0) {
      this.differ = null;
      this.verdict = "tek";
      return;
    }
    this.differ = samples.filter((s) => {
      const outs = PLATFORMS.map((p) => JSON.stringify(impl[p](s, p)));
      return new Set(outs).size > 1;
    }).length;
    if (this.code > 1) this.verdict = "ikiz";
    else this.verdict = this.differ === 0 ? "ortak" : "dalli";
  }

  line() {
    const detail = this.differ === null
      ? `eksik=${this.missing.join(",")}`
      : `fark=${this.differ}/${this.total}`;
    console.log(`${this.label}: kod=${this.code} | ${detail} -> ${this.verdict}`);
  }
}

export function countSharing(items) {
  for (const name of ["ortak", "dalli", "ikiz", "tek"]) {
    console.log(`${name}: ${items.filter((s) => s.verdict === name).length}`);
  }
}
```

## Mağaza Kuralları ve Mağaza İncelemesi

Her platformun kendi uygulama mağazası, kendi yayın konsolu ve kendi yayın kuralları vardır. Bir uygulama yayımlanmadan önce mağaza incelemesinden geçer: paket, mağazanın o platform için koyduğu kurallara göre değerlendirilir. Çapraz platform kod tabanı tek olsa da bu hat tek değildir. Aynı düzeltme iki paketle iki ayrı mağaza hattından geçer ve kullanıcıya iki ayrı anda ulaşabilir.

Bu, paylaşım sorusunu iki yönden etkiler. Birincisi, kuralların kendisi platforma özgüdür: bir mağazanın izin verdiği bir davranış öbüründe kabul edilmeyebilir, ve bunu ortak kod bilemez. İkincisi, mağazanın sağladığı özellikler platforma özgüdür: bir platform kullanıcıya mağaza dışında bir güncelleme akışı sunabilir, öbürü sunmayabilir. İlk yön kodun hangi davranışı taşıyabileceğini sınırlar; ikinci yön ise kodun hangi platformda yazılabileceğini sınırlar. İki yön de paylaşım sınıfına yansır, ve bu ders ikincisini ölçer.

Her platformun paketi kendi sürüm kimliğini de taşır. Ortak koddan bağımsız olarak, platform tarafında şuna benzer parçalar bulunur.

```kotlin
// Platform kodu: AndroidVersionIdentity
android {
    defaultConfig {
        versionCode = 14
        versionName = "2.1"
    }
}
```

```swift
// Platform kodu: IosVersionIdentity
import Foundation

func installedVersion() -> String? {
    Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}
```

İki parça sürümü iki ayrı yerde, iki ayrı biçimde tutar. Parçalar çıktı vermez; yalnız sürüm bilgisinin ortak kodun dışında, platform tarafında durduğunu gösterir.

**PG1.** Model, bu paylaşımın kuralını kurar; model çerçevenin kendisi değildir. Modelde güncelleme kararı ve güncelleme akışı iki ayrı işlevdir. Sürüm numaraları ve durum adları örnektir; gerçek bir uygulamanın sürüm şemasını göstermez.

## Güncelleme Kararı Ortaktır

Uygulama içi güncelleme (in-app update), kullanıcıyı mağazaya götürmeden yeni sürümün kurulmasını öneren akıştır. Akışın iki parçası vardır. Birincisi karardır: kurulu sürüm, sunucunun istediği en düşük sürümün altında mı? İkincisi akışın kendisidir: kullanıcıya teklifi göstermek, indirmeyi başlatmak, kurulumu tamamlamak. Karar saf bir karşılaştırmadır. Akış ise platformun mağaza altyapısına dayanır.

Önce kararı ölçelim. Üç örnek var: kurulu sürüm en düşük sürümün altında, eşit, üstünde.

```javascript
// main.mjs — guncelleme kararini veren islev iki platformda ayni
import { Sharing } from "./sharing.mjs";

const versions = [
  { installed: 12, minimum: 14 },
  { installed: 14, minimum: 14 },
  { installed: 15, minimum: 14 },
];

function isBelowMinimum(version) {
  return version.installed < version.minimum;
}

new Sharing(
  "guncelleme-karari",
  { ios: isBelowMinimum, android: isBelowMinimum },
  versions,
).line();
```

```text
guncelleme-karari: kod=1 | fark=0/3 -> ortak
```

Karar ortaktır: aynı işlev, üç örnekte de iki platformda aynı sonuç. Sürüm kimliği platform tarafında durur ama karşılaştırma bir sayı ile bir sayı arasındadır, ve bu ortak koda taşınabilir.

## Akış Yalnız Bir Platformda

Şimdi akışı ölçelim. Bu modelde uygulama içi güncelleme akışının yalnız Android tarafında yazıldığını varsayıyoruz. iOS tarafında akışın karşılığı yok: kullanıcı mağazaya kendisi gider.

```javascript
// main.mjs — uygulama ici guncelleme akisi yalniz bir platformda yazilmis
import { Sharing } from "./sharing.mjs";

const states = ["surum-eski", "surum-guncel", "surum-zorunlu"];

function androidUpdate(state) {
  if (state === "surum-guncel") return "islem-yok";
  return state === "surum-zorunlu" ? "kurulum-baslatildi" : "guncelleme-teklif-edildi";
}

const inAppUpdate = { android: androidUpdate };

new Sharing("uygulama-ici-guncelleme", inAppUpdate, states).line();
```

```text
uygulama-ici-guncelleme: kod=1 | eksik=ios -> tek
```

`eksik=ios` çıktısı, iOS anahtarının tabloda hiç bulunmadığı anlamına gelir. Kural bir işlev bulamadığı için fark hesaplamaz; `fark` yerine `eksik` basılır ve sınıf tek olur. Kod bir, çünkü tek bir platformda tek bir işlev var.

**PG2.** Güncelleme akışının hangi platformda yazılabileceği bu derste bir varsayımdır. Modelde Android tarafı vardır, iOS tarafı yoktur. Bir platformun mağaza altyapısının gerçekte neyi sunduğu, derste ölçülmez ve bir platform adına bir iddia olarak yazılmaz; yalnız tablonun biçimi gösterilir.

Burada bir ayrım yapmak gerekir, çünkü iki soru birbirine karışır. Bu kod üretime çıkıyor mu? M12/K05'te sorduğumuz bu sorunun cevabı evet: Android paketine girer ve kullanıcıya ulaşır. Ama tek, kodun pakete girmemesi değil, bir platformda hiç yazılmamış olmasıdır. Pakete girmek ile yazılmış olmak ayrı sorulardır: ilki paketin içeriğini, ikincisi iki platformdaki kodun varlığını sorar.

Karar ortak, akış tek. Aynı özellik iki parçaya ayrılınca iki ayrı sınıf çıktı. Kural özelliği bütün olarak sınıflamaz; hangi parçanın ölçüldüğüne bakar.

## Sonradan İndirilen Kod

Bir yayın kısıtı daha vardır, ve bu ders onu ölçmez. Bazı çerçeveler uygulama mağazasından geçmiş paketin dışında, sonradan indirilen kodla davranışı değiştirebilir. Bu, mağaza incelemesini beklemeden düzeltme çıkarmayı vaat eder.

**PG3.** Sonradan indirilen kodun mağaza kuralları içinde nereye kadar izinli olduğu bu derste bir varsayımdır ve ölçülmez. Sınır mağazanın kurallarına bağlıdır, kurallar değişebilir ve platformdan platforma ayrılabilir. Ekip bu yolu kullanmadan önce kendi yayınının geçerli kurallarına bakmalıdır; ders bir sınır yazmaz.

Paylaşım sorusu açısından bu yol bir şey değiştirmez: sonradan indirilen kod da bir kod tabanında durur ve kural onu aynı üç soruyla sınıflar.

## Sınırlayıcı Ölçüm

Son sınırı bir bayrak çizer. Güncelleme kodunu iki pakete de koyalım, ama iOS paketinde sabit bir bayrakla kapatalım. Kod aynı işlevdir; bayrak platforma göre açık ya da kapalıdır.

```javascript
// main.mjs — ayni guncelleme kodu iki pakete girer, bir platformda bayrakla kapali
import { Sharing, countSharing } from "./sharing.mjs";

const states = ["surum-eski", "surum-guncel", "surum-zorunlu"];
const updateEnabled = { ios: false, android: true };

function androidUpdate(state) {
  if (state === "surum-guncel") return "islem-yok";
  return state === "surum-zorunlu" ? "kurulum-baslatildi" : "guncelleme-teklif-edildi";
}

function guardedUpdate(state, platform) {
  if (!updateEnabled[platform]) return "kapali";
  return androidUpdate(state);
}

const single = new Sharing("uygulama-ici-guncelleme", { android: androidUpdate }, states);
const flagged = new Sharing(
  "bayrakli-guncelleme",
  { ios: guardedUpdate, android: guardedUpdate },
  states,
);

single.line();
flagged.line();
countSharing([single, flagged]);
```

```text
uygulama-ici-guncelleme: kod=1 | eksik=ios -> tek
bayrakli-guncelleme: kod=1 | fark=3/3 -> dalli
ortak: 0
dalli: 1
ikiz: 0
tek: 1
```

Aynı özellik iki ayrı sınıf aldı. Bir platformda yazılmışken tek çıktı; iki pakete girip bir platformda bayrakla kapatılınca dallı. Kod bir, çünkü iki platform da aynı `guardedUpdate` işlevini taşıyor. Fark üçte üç, çünkü kapalı platformda her örnek `kapali` döner, açık platformda ise örneğe göre değişen bir sonuç döner.

Bu, ayrımı somutlaştırır. Bayrakla kapalı kod pakete girer ama davranışı yalnız bir platformda çalışır. Kural onu tek saymaz, çünkü işlev iki platformda da vardır; dallı sayar, çünkü sonuç platforma göre ayrışır.

Kural yapıyı görür, bedeli görmez. İki paketin ikisinde de taşınan ve bir tanesinde hiç çalışmayan kod, pakete yük bindirir, sınanması gerekir ve bayrağın unutulduğu gün kullanıcıya ulaşır. Bunların hiçbiri sınıfa yansımaz. Bakım bedelini düzyazı söyler.

**PG4.** Bayrak modelde sabit bir tablodur. Gerçek bir uygulamada bayrak sunucudan gelebilir, sürüme göre değişebilir ya da derleme anında kodu paketten tamamen çıkarabilir; son durumda kod pakete girmez ve ölçülen model değişir. Bu ders yalnız paketin içinde kalan, çalışma anında kapatılan kodu ölçer.

## Kapanış Tablosu

Kurs on ders boyunca aynı soruyu sordu. Tablo her dersin ölçtüğü özelliği, aldığı paylaşımı ve dersi sınırlayan ölçümü yan yana koyar.

| Ders | Ölçülen özellik | Paylaşım | Sınırlayıcı ölçüm |
|---|---|---|---|
| Çapraz Platform Gerekçesi | Sepet toplamı, iki platformda aynı işlev | ortak | Rozet işlevi üç örnekle ortak; dördüncü örnek eklenince dallı |
| Web Görünümü Tabanlı Yaklaşım | Liste satırını çizen işlev | ortak | Güvenli alan payı kabuktan okununca dallı |
| Köprü Tabanlı Yaklaşım | Düğümü platform bileşenine eşleyen tek işlev | dallı | Eşleme iki ayrı işleve bölününce ikiz |
| Kendi Çizim Motoruyla Yaklaşım | Kutu konumlarını hesaplayan düzen işlevi | ortak | Metin genişliği platform yazı tipinden gelince dallı |
| Paylaşılan Mantık, Yerel Arayüz | Arayüz işlevleri; doğrulama ortak | ikiz | Bir arayüz alanı unutulunca fark sıfırdan büyük, yine ikiz |
| Yaklaşım Seçim Ölçütleri | Yalnız bir platformda yazılan ana ekran parçası | tek | Aynı altı özellik iki düzenekte sayılınca dağılım değişir, tek kalır |
| Platform Tasarım Dilleri Farkı | Ekran türünden gezinme kalıbını seçen tek işlev | dallı | Uyarlanmış tasarımda ortak |
| Yerel Modül İhtiyacı | Biyometrik doğrulama modülü | ikiz | Yalnız bir platformda bulunan yetenek tek |
| Başarım Beklentileri | Küçük resim çözme | ikiz | Aynı hesap ortak kodda tek işlevle ortak; köprü geçişi 1'den 6'ya |
| Mağaza ve Yayın Kısıtları | Uygulama içi güncelleme akışı | tek | Bayrakla kapalı kod dallı |

On dersin dağılımı: ortak 3, dallı 2, ikiz 3, tek 2. Bu, açılış dersindeki ortak 1, dallı 1, ikiz 1, tek 1 dağılımıyla aynı şey değildir. Çekirdek dört özelliği sınadı ve her sınıftan bir örnek verdi; tablo on dersi sayar ve her dersin ana özelliği tek bir satırdır. İki sayı ayrı ölçümlerin sonucudur ve birbirinden türetilmez.

Tabloda dikkat çeken şey, hiçbir sınıfın boş kalmaması ve hiçbirinin baskın çıkmamasıdır. Ama bu bir dağılımdır, bir öneri değildir. Dersler özellik seçimini kendisi yapmıştır; başka özellikler seçilseydi dağılım başka olurdu. Tablo bir yaklaşımın iyi ya da kötü olduğunu söylemez; yalnız her dersin ölçtüğü özelliğin kodunun nasıl paylaşıldığını gösterir.

## Özet

- Bu dersin paylaşımı: tek. Uygulama içi güncelleme akışı yalnız bir platformda yazıldığı için kural `eksik=ios` bastı ve özelliği tek saydı.
- Güncelleme kararını veren işlev iki platformda aynıdır ve ortaktır; aynı özelliğin iki parçası iki ayrı sınıf alabilir.
- Tek, kodun pakete girmemesi değildir; bir platformda hiç yazılmamış olmasıdır. Pakete girmek ile yazılmış olmak ayrı sorulardır.
- Aynı kod iki pakete girip bir platformda bayrakla kapatılınca özellik dallı oldu; kural yapıyı görür, kapalı kodun bakım bedelini görmez.
- Sonradan indirilen kodun mağaza kuralları içindeki sınırı bu derste bir varsayımdır ve ölçülmez.

## Kurs Kapanışı

Kurs tek bir soruyu sordu: bu özelliğin kodu platformlar arasında nasıl paylaşılıyor? Kapanış tablosu, dört cevabın dördünün de verildiğini gösterir: ortak, dallı, ikiz ve tek. Her cevap en az iki derste gerçek bir ölçümle karşılandı. Kursun kazanımı bu ayrımı bir özelliğin kodu üzerinde yapabilmek, ve ayrımın kuralın yapıyı gördüğünü, bedeli görmediğini bilmektir. Sıradaki kurs kendi sorusunu kendi açılış dersinde koyar.
