---
title: 'Mağaza İnceleme Süreci'
source: 'https://academia.sh/tr/kurslar/ios-uretim/magaza-inceleme-sureci'
course: 'Mimari, Test ve Yayınlama'
language: tr
updated: '2026-10-21T05:03:07+00:00'
license: 'CC BY-SA 4.0'
objectives:
    - 'Mağaza incelemesi öncesinde ekibin kendi hazırlık listesini tuttuğunu ve bu listenin mağazanın kuralı olmadığını ayırır'
    - 'İzin açıklamasının dolu olup olmadığına bakan maddenin boş açıklamayı ayırdığını ölçer'
    - 'Güncelliğini yitirmiş bir maddenin iki sürümde de kalarak listenin bütününü gürültülü yaptığını doğrular'
    - 'Aynı maddenin boş ile yalnız boşluktan oluşan açıklamada kör ya da ayıran olabildiğini gösterir'
---

# Mağaza İnceleme Süreci

Bir hazırlık listesinde izin açıklamasının dolu olup olmadığına bakan maddenin kusuru ayırdığının, listede kalan eski bir maddenin ise iki sürümde de kırmızı kalarak listeyi gürültülü yaptığının ölçümü.

Bir sürüm mağazaya gönderilmeden önce ekipler çoğunlukla bir hazırlık listesinden geçer: ekran görüntüleri yerinde mi, gizlilik bağlantısı çalışıyor mu, izin açıklamaları yazılmış mı. Liste, geçmiş gönderimlerde yaşanan sorunlardan çıkarılır ve her yeni sorunla uzar. Mağazanın inceleme kararı bu listenin dışında verilir; liste ekibin kendi korunma biçimidir.

Kursun ölçü adı **ayrım**dır: aynı denetimi doğru sürüme ve kusurlu sürüme uygulayınca iki yanıt farklı mı. Dört kategori vardır: doğru sürümün geçip kusurlu sürümün kaldığı **ayıran**, ikisinin de geçtiği **kör**, ikisinin de kaldığı **gürültülü** ve doğru sürümün kalıp kusurlu sürümün geçtiği **ters**. Çıktıda bunlar `ayiran`, `kor`, `gurultulu` ve `ters` olarak görünür. Bu ders çekirdek dosyayla ölçer.

```swift
// Separation.swift — bir denetimin dogru surumu kusurlu surumden ayirip ayirmadigini siniflandirir
struct Contrast<Output: CustomStringConvertible> {
    let label: String
    let correct: Output
    let faulty: Output
    let passesCorrect: Bool
    let passesFaulty: Bool

    var separation: String {
        switch (passesCorrect, passesFaulty) {
        case (true, false): return "ayiran"
        case (true, true): return "kor"
        case (false, false): return "gurultulu"
        case (false, true): return "ters"
        }
    }

    func describe() -> String {
        let onCorrect = passesCorrect ? "gecti" : "kaldi"
        let onFaulty = passesFaulty ? "gecti" : "kaldi"
        print("\(label) | dogru=\(correct)/\(onCorrect) kusurlu=\(faulty)/\(onFaulty) -> \(separation)")
        return separation
    }
}

func contrast<Output>(_ label: String, correct: Output, faulty: Output, check: (Output) -> Bool) -> Contrast<Output> {
    Contrast(label: label, correct: correct, faulty: faulty, passesCorrect: check(correct), passesFaulty: check(faulty))
}

func countSeparations(_ results: [String]) {
    for name in ["ayiran", "kor", "gurultulu", "ters"] {
        print("\(name): \(results.filter { $0 == name }.count)")
    }
}
```

Bu dersin kusuru üstverideki bir alandadır: konum izni için kullanıcıya gösterilecek **açıklama metni** boştur. Uygulama konumu isteyebilir, ama izin ekranı kullanıcıya neden istendiğini söylemez. Derleme geçer, imza geçer, test geçer; bu alan hiçbir derleme adımının kontrol ettiği bir şey değildir. Mağaza incelemesinde böyle bir eksiğin gönderimi geri çevirmesi mümkündür; ders bu olasılığı yalnız hazırlık listesinin bir maddesi olarak kodlar.

## Hazırlık Listesinin Modeli

Model bir gönderimi üç alanla tutar: konum izni açıklaması, ekran görüntüsü boyutları ve gizlilik bağlantısının varlığı. Hazırlık listesi üç maddeden oluşur. `izin-aciklamasi-dolu` açıklamanın boş olmadığına bakar ve yalnız boşluklardan oluşan bir metni de boş sayar. `gizlilik-baglantisi-var` bağlantının tanımlı olduğuna bakar. `eski-boyut-gorseli-var` ise ekran görüntüsü kümesinde `eski` adlı bir boyutun bulunmasını ister; bu madde ekibin eski bir gönderiminden kalmadır.

`readiness` her maddeyi gönderime uygular ve `madde:gecti` ya da `madde:kaldi` yazar. `Submission` kendini tek satırda özetler; böylece çıktıda hangi alanın ne taşıdığı görülür.

```swift
// Review.swift — gonderimin alanlari ve ekibin hazirlik listesi
struct Submission: CustomStringConvertible {
    let locationPurpose: String
    let screenshotSizes: [String]
    let privacyLink: Bool

    var purposeState: String {
        if locationPurpose.isEmpty { return "bos" }
        if locationPurpose.allSatisfy({ $0.isWhitespace }) { return "bosluk" }
        return "dolu"
    }

    var description: String {
        "izin=\(purposeState) boyut=\(screenshotSizes.joined(separator: ",")) gizlilik=\(privacyLink ? "var" : "yok")"
    }
}

let readinessItems = ["gizlilik-baglantisi-var", "eski-boyut-gorseli-var", "izin-aciklamasi-dolu"]

func itemPasses(_ item: String, _ submission: Submission) -> Bool {
    switch item {
    case "izin-aciklamasi-dolu": return submission.purposeState == "dolu"
    case "izin-aciklamasi-bos-degil": return !submission.locationPurpose.isEmpty
    case "gizlilik-baglantisi-var": return submission.privacyLink
    case "eski-boyut-gorseli-var": return submission.screenshotSizes.contains("eski")
    default: return false
    }
}

func readiness(_ submission: Submission, items: [String]) -> [String] {
    items.map { "\($0):\(itemPasses($0, submission) ? "gecti" : "kaldi")" }
}

func listPasses(_ submission: Submission, items: [String]) -> Bool {
    readiness(submission, items: items).allSatisfy { $0.hasSuffix(":gecti") }
}

let correctSubmission = Submission(locationPurpose: "Yakindaki magazalari gostermek icin konumunuz kullanilir", screenshotSizes: ["buyuk", "orta"], privacyLink: true)
let emptySubmission = Submission(locationPurpose: "", screenshotSizes: ["buyuk", "orta"], privacyLink: true)
let spaceSubmission = Submission(locationPurpose: "   ", screenshotSizes: ["buyuk", "orta"], privacyLink: true)
```

İki gönderim yalnız açıklama alanında ayrılır. Ekran görüntüleri `buyuk` ve `orta` boyutlarındadır; `eski` boyut ekibin görsel düzeninden kaldırılmıştır ve her iki gönderimde de yoktur. Madde ise listede kalmıştır.

**DG13.** Bu ölçümün hazırlık listesi ekibin kendi listesidir. Maddeler mağazanın yayımladığı bir kural değildir ve mağazanın bir gönderimi hangi gerekçeyle geri çevirdiği ölçülmedi.

## Dört Denetim

Aynı iki gönderime dört denetim uygulanır: açıklama maddesi, eski boyut maddesi, gizlilik maddesi ve listenin bütünü.

```swift
// main.swift — uc madde ve listenin butunu
let purpose = contrast("izin-aciklamasi-dolu", correct: correctSubmission, faulty: emptySubmission) { itemPasses("izin-aciklamasi-dolu", $0) }.describe()
let oldSize = contrast("eski-boyut-gorseli-var", correct: correctSubmission, faulty: emptySubmission) { itemPasses("eski-boyut-gorseli-var", $0) }.describe()
let privacy = contrast("gizlilik-baglantisi-var", correct: correctSubmission, faulty: emptySubmission) { itemPasses("gizlilik-baglantisi-var", $0) }.describe()
let wholeList = contrast("liste-tamami-gecti", correct: correctSubmission, faulty: emptySubmission) { listPasses($0, items: readinessItems) }.describe()

countSeparations([purpose, oldSize, privacy, wholeList])
```

```text
izin-aciklamasi-dolu | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/gecti kusurlu=izin=bos boyut=buyuk,orta gizlilik=var/kaldi -> ayiran
eski-boyut-gorseli-var | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/kaldi kusurlu=izin=bos boyut=buyuk,orta gizlilik=var/kaldi -> gurultulu
gizlilik-baglantisi-var | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/gecti kusurlu=izin=bos boyut=buyuk,orta gizlilik=var/gecti -> kor
liste-tamami-gecti | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/kaldi kusurlu=izin=bos boyut=buyuk,orta gizlilik=var/kaldi -> gurultulu
ayiran: 1
kor: 1
gurultulu: 2
ters: 0
```

Dört satır, listenin üç ayrı davranışını gösterir. İzin açıklaması maddesi doğru gönderimi geçirir, boş açıklamalı gönderimi kaldırır: **ayıran**. Gizlilik bağlantısı maddesi iki gönderimde de geçer; bağlantı iki sürümde de var olduğu için kusuru görmez ve bu yüzden **kör**dür. Kör olmak bir kusur değildir; madde başka bir sorun için yazılmıştır ve bu kusurda söyleyecek sözü yoktur.

Asıl ders eski boyut maddesindedir. Madde iki gönderimde de kalır, çünkü ekran görüntüsü kümesinde `eski` boyut yoktur. Doğru gönderim bile listeyi geçemez. Kusurlu gönderim de kalır, ama kalma nedeni kusurla ilgisizdir. İki yanıt aynı olduğu için madde **gürültülü** sayılır: kırmızı görünür, ayrım taşımaz.

## Gürültünün Bedeli

Listenin tamamı satırında bu bedel görünür. `liste-tamami-gecti` doğru gönderimde de kalır; bunun tek nedeni eski boyut maddesidir. Listeyi okuyan kişi iki durumla karşılaşır. Birincisi, kırmızıyı görüp nedenine bakar, eski bir maddeye takıldığını anlar ve devam eder. İkincisi, kırmızıyı artık bildiği için hiç bakmaz. Ekipler çoğu zaman ikinci yola düşer, çünkü hiçbir şeyi ayırmayan bir kırmızı bir süre sonra görülmez olur.

Bu görmezden gelme alışkanlığı, listede gerçek bir kusur kırmızıya döndüğünde de sürer. İzin açıklaması maddesi kusuru doğru biçimde yakalıyor olabilir; ama liste zaten kırmızı olduğundan yakalanan kusur kalabalığın içinde kaybolur. Maddenin tek başına ayıran olması, listenin işe yaradığı anlamına gelmez. Ayrımı taşıyan şey listenin bütününün davranışıdır ve o, gürültülü maddeyle birlikte gürültülüdür.

**DG14.** Bu ölçüm, maddenin neden eski kaldığını bilmez. Ekran görüntüsü düzeninin değiştiği ve `eski` boyutun artık üretilmediği dersin varsayımıdır. Gerçek bir ekibin listesinde böyle bir maddenin hâlâ gerekli olduğu bir durum da olabilir.

## Eski Madde Nasıl Temizlenir

Gürültülü maddeyle iki şey yapılabilir: silmek ya da güncellemek. Silme, maddenin kapsadığı kaygı artık yoksa doğrudur. Ekran görüntüsü düzeni değiştiyse ve eski boyut hiçbir gönderimde istenmiyorsa madde listeye ait değildir. Güncelleme ise kaygının sürdüğü ama ifade biçiminin eskidiği durumda yapılır: madde bugün istenen boyutları sayar.

Karar verirken sorulacak soru ölçümün sorusudur: bu madde, kusurlu bir gönderimle doğru bir gönderimi bir araya koyduğumda iki yanıtı ayırıyor mu? Ayırmıyorsa ve her gönderimde aynı yanıtı veriyorsa, ya yanıt hep geçtidir ve madde kördür ya da yanıt hep kaldıdır ve madde gürültülüdür. İkisinin de kendine göre bir yeri olabilir. Kör bir madde, yalnızca bir kez yaşanmış bir kusuru kollayan bekçi gibi durabilir; gürültülü madde ise bu işi bile yapmaz.

Silmeden önce de bir ölçüm yapılır. Maddeyi listeden çıkarıp aynı iki gönderimi yeniden denetlemek, listenin bütününün artık doğru gönderimi geçirip kusurluyu kaldırdığını gösterir. Bu, maddenin gerçekten gürültüden ibaret olduğunun kanıtıdır. Kanıt yoksa silme, kuru bir tahmindir.

## Kırmızı Madde ile Gönderim Kararı

Listenin kırmızı çıkması ile gönderimin durdurulması arasında bir karar vardır ve o kararı liste vermez. Ekip, kırmızı maddeyi okuyup gönderimi durdurur, ya da maddenin eski olduğuna karar verip gönderir. Birinci yol güvenlidir ama yavaştır; ikinci yol hızlıdır ama listenin kendi sözünü çiğner. Gürültülü madde tam bu ikilemi her gönderimde yeniden yaratır.

Ayıran bir maddede böyle bir ikilem yoktur. Kırmızı, gönderimde bir şeyin yanlış olduğu anlamına gelir ve yeşil, o şeyin yerinde olduğu anlamına gelir. Karar da buna göre kolaylaşır. Listeyi ölçmenin pratik getirisi budur: kırmızıya bakıp tartışmak yerine kırmızıya bakıp düzeltmek.

Bir de kimin okuduğu sorusu vardır. Hazırlık listesini çoğu zaman gönderimi yapan kişi okur; maddelerin yazıldığı zamanı o hatırlamaz. Maddenin neden listede olduğunu bilmeyen biri, eski boyut maddesini ciddiye alır ve boşuna bir görsel hazırlamaya girişebilir. Gürültülü madde bu yüzden yalnız zaman değil, emek de harcatır.

## Boş ile Yalnız Boşluk

İzin açıklaması maddesi iki biçimde yazılabilir. `izin-aciklamasi-dolu` metnin yalnız boşluklardan oluşmadığına da bakar. `izin-aciklamasi-bos-degil` ise yalnızca metnin sıfır uzunlukta olmadığına bakar. İkisi aynı amaçla yazılmış görünür; ama üç boşluktan oluşan bir açıklama karşısında farklı davranırlar. Kullanıcı ekranında üç boşluk gösteren bir açıklama, boş bir açıklamadan farksızdır; ancak ikinci madde bunu göremez.

Bir sonraki ölçüm aynı iki denetimi üç boşluklu gönderime uygular. Yanına eski boyut maddesini de koyar; böylece gürültülü maddenin girdi değişince de aynı kaldığı görülür.

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

Aynı maddeler, boş açıklama yerine yalnız boşluktan oluşan açıklama taşıyan gönderime uygulanır. Ekranda ikisi de aynı boşluğu gösterir.

```swift
// main.swift — ayni maddeler, bos ve bosluk aciklamasi
let emptyByLength = contrast("bos-degil-bos-aciklama", correct: correctSubmission, faulty: emptySubmission) { itemPasses("izin-aciklamasi-bos-degil", $0) }.describe()
let blankByLength = contrast("bos-degil-bosluk-aciklama", correct: correctSubmission, faulty: spaceSubmission) { itemPasses("izin-aciklamasi-bos-degil", $0) }.describe()
let blankByContent = contrast("dolu-bosluk-aciklama", correct: correctSubmission, faulty: spaceSubmission) { itemPasses("izin-aciklamasi-dolu", $0) }.describe()
let oldSizeOnBlank = contrast("eski-boyut-bosluk-aciklama", correct: correctSubmission, faulty: spaceSubmission) { itemPasses("eski-boyut-gorseli-var", $0) }.describe()

countSeparations([emptyByLength, blankByLength, blankByContent, oldSizeOnBlank])
```

```text
bos-degil-bos-aciklama | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/gecti kusurlu=izin=bos boyut=buyuk,orta gizlilik=var/kaldi -> ayiran
bos-degil-bosluk-aciklama | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/gecti kusurlu=izin=bosluk boyut=buyuk,orta gizlilik=var/gecti -> kor
dolu-bosluk-aciklama | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/gecti kusurlu=izin=bosluk boyut=buyuk,orta gizlilik=var/kaldi -> ayiran
eski-boyut-bosluk-aciklama | dogru=izin=dolu boyut=buyuk,orta gizlilik=var/kaldi kusurlu=izin=bosluk boyut=buyuk,orta gizlilik=var/kaldi -> gurultulu
ayiran: 2
kor: 1
gurultulu: 1
ters: 0
```

Uzunluğa bakan madde boş açıklamada ayıran, boşluk açıklamasında kördür. Aynı kusurun iki görünümü aynı maddeye farklı yanıt verdirir. İçeriğe bakan madde ise ikisinde de ayırır. Eski boyut maddesi girdi ne olursa olsun kırmızı kalır ve bu ölçümde de gürültülüdür.

Sınırlar açıktır. Bu ders mağazanın inceleme kararını ya da süresini ölçmedi; ölçülmesi gereken şey de bu değildir, çünkü o karar ekibin elindeki bir girdi olmaktan çok bir çıktıdır. Ders mağazanın hangi gerekçelerle gönderimleri geri çevirdiğini de ölçmedi. Ret nedenleri sayısızdır: izin açıklamaları, gizlilik metinleri, ekran görüntülerinin içeriği, uygulamanın bildirdiğinden farklı davranması ve daha pek çoğu bunlardandır. Bu sayısızlığın içinden bir listeye girenler, ekibin geçmişte yaşadıklarıdır.

**DG15.** Hazırlık listesindeki her madde mağazanın kuralı değil, ekibin listesidir. Listenin geçmesi incelemenin geçeceği anlamına gelmez; listenin kalması da gönderimin geri çevrileceğini söylemez. Ders yalnız şunu ölçer: listedeki bir madde, ekibin bildiği bir kusuru, o kusursuz bir gönderimden ayırıyor mu.

## Listeyi Dürüst Tutmak

Hazırlık listesi iki yönde çürür. Birincisi, kusur kaynağı ortadan kalktığında maddenin listede kalmasıdır; eski boyut maddesi budur. İkincisi, yeni bir kusurun listeye girmeden geçmesidir. Bir gönderim geri çevrildiğinde yapılacak iş, geri çevirme nedenini bir maddeye çevirmek ve o maddeyi bu dersin ölçümüyle sınamaktır: maddeyi kusurlu gönderime uygula, doğru gönderime uygula, iki yanıtın farklı olduğunu gör.

Bu sınama maddeyi eklemeden önce yapılır, çünkü eklenen her madde bir bakım yükü getirir. Ayıran olmayan bir madde yük getirir ama ayrım getirmez. Kör madde bir sonraki kusuru yakalamaz; gürültülü madde ise listeyi okuyan kişiyi kırmızıya alıştırır. Ters bir madde en kötüsüdür: doğru gönderimi kaldırıp kusurluyu geçirir ve ekibi yanlış yöne iter.

Listenin bakımı bir kişiye ya da bir adıma bağlanırsa işler. Her gönderimden sonra liste tek bir soruyla gözden geçirilir: bu gönderimde hangi madde yalnız kırmızı olup kalmıştı? O madde ya güncellenir ya silinir. Bu alışkanlık, listeyi geçmişin değil bugünün kusurlarını kollayan bir araca çevirir.

## Özet

- Mağaza incelemesi öncesindeki hazırlık listesi, ekibin kendi kusur geçmişinden çıkar; mağazanın yayımladığı bir kural değildir.
- İzin açıklamasının dolu olup olmadığına bakan madde, boş açıklamalı gönderimi doğru gönderimden ayırdığı için ayırandır.
- Güncelliğini yitirmiş bir madde iki sürümde de kırmızı kalır ve listenin bütününü gürültülü yapar.
- Aynı kusurun boş ve yalnız boşluktan oluşan iki görünümü, yalnızca uzunluğa bakan maddeye farklı yanıt verdirir; içeriğe bakan madde ikisini de ayırır.
- Maddeyi listeye almadan ya da listeden çıkarmadan önce, kusurlu ve doğru gönderim üzerinde ölçmek gerekir.
- Bu dersin ayrımı: **gürültülü**.

## Sonraki Adım

Hazırlık listesi gönderimin içeriğini denetler; mağazada kullanıcının gördüğü sayfa ise ayrı bir iştir. Sonraki derste **Mağaza Listelemesi** ele alınacak: ekran görüntüleri ile alt başlığın, kayıtlı bir referansla karşılaştırıldığında kusuru ayırıp ayırmadığı ve eşitlik denetiminin ters çalışabildiği bir durum ölçülecek.
