---
title: 'Biçem Seçimi ve Ödünleşim Çözümlemesi'
source: 'https://academia.sh/tr/kurslar/mimari-bicemler/bicem-secimi-ve-odunlesim-cozumlemesi'
course: 'Mimari Biçemler'
language: tr
updated: '2026-08-17T18:10:36+00:00'
license: 'CC BY-SA 4.0'
---

# Biçem Seçimi ve Ödünleşim Çözümlemesi

Biçem kararının ölçülebilir bir savunmaya çevrilmesi: aynı üç kuralın iki sınır yerleşiminde ortak temelde ölçülmesi, üç nitelik senaryosunun eşiğine karşı geçme durumunun hesaplanması, hiçbir düzenin üç eşiği birden geçmemesinin gösterilmesi ve kararı çeviren eşiğin bulunması.

Beş dağıtım düzeni beş ayrı sayı kümesi bıraktı: birlikte yayınlanan dosya sayısı, sınır geçişi,
sınırdan geçen bayt, bir birim durduğunda ayakta kalan birim sayısı, yeni bir yetenek için
düzenlenen dosya sayısı. Hiçbir düzen bu ölçülerin hepsinde önde değildi; her kazanç bir başka
sayıyı büyüttü. Bu ders o durumda seçimin nasıl yapıldığını ve bir seçimin savunmasının neye
dayandığını ele alır.

Kalite niteliği ve nitelik senaryosu Kalite ve Test Temelleri kursunun Kalite Nitelikleri dersinde
kuruldu. Burada tanımlanmazlar, karar aracı olarak kullanılırlar.

## Kararı Taşıyan Üç Parça

Bir biçem savunması üç parçadan oluşur. Birincisi **senaryo**: hangi nitelik, hangi uyaran altında,
hangi ortamda sorulmaktadır. İkincisi **eşik**: o niteliğin yanıt ölçütünde kabul edilen değer.
Üçüncüsü **ölçülen değer**: düzenin o ölçütte gerçekten aldığı sayı. Üçünden biri eksikse savunma
yoktur, yalnız tercih vardır. "Mikroservis daha esnektir" cümlesinde üçü de eksiktir: hangi
değişikliğin, hangi eşiğin ve hangi ölçünün konuşulduğu belirsizdir.

Ödünleşim de aynı biçimden çıkar. Bir düzen bir eşiği geçmek için başka bir ölçütün değerini
büyütür; ödünleşim, bu iki sayının aynı karar içinde yan yana durmasıdır. İki düzeni karşılaştıran
bir ölçüm bu yüzden tek bir sayı üretmez, bir vektör üretir.

## Ortak Temel

Karşılaştırmanın önkoşulu ortak temeldir: aynı kurallar, aynı girdi, aynı sayma yordamı. Aksi
hâlde ölçülen fark biçemden değil, iki gerçekleştirimin ayrıntı farkından gelir. Bu yüzden üç kural
tek bir dosyada durur ve iki düzen de aynı dosyayı kullanır. Değişen tek şey sınırların yeridir.

```js
// karar/kural.mjs — uc kural: iki duzen de ayni kurallari kullanir, degisen yalniz sinirlarin yeri
const TARIFE = { kademe: [[1, 3000], [5, 4800], [20, 9600]], bolge: { "34": 100, "06": 115, "35": 125 }, asgari: 2500 };
const AGAC = { "34": ["34"], "06": ["34", "06"], "35": ["34", "41", "35"] };

export const KURAL = {
  fiyat(g) {
    const kademe = TARIFE.kademe.find(([k]) => g.agirlik <= k) ?? [0, 9600];
    const taban = Math.max(TARIFE.asgari, Math.round((kademe[1] * TARIFE.bolge[g.bolge]) / 100));
    return { net: taban - Math.round(taban * Math.min(g.oran, 0.4)) };
  },
  plan(g) {
    const rota = AGAC[g.bolge] ?? ["34"];
    return { gun: rota.length, tasiyici: rota.length > 2 ? "MT" : "AN" };
  },
  hacim(g, durum) {
    durum.set(g.sozlesmeNo, (durum.get(g.sozlesmeNo) ?? 0) + g.agirlik);
    return { hacim: [...durum.values()].reduce((t, a) => t + a, 0) };
  },
};
```

Düzen bir listedir: hangi kuralın hangi dağıtım biriminde durduğunu söyler. Tek birimli düzende üç
kural aynı birimdedir ve aralarında sınır yoktur; üç birimli düzende her kural kendi birimindedir ve
gövde her sınırda serileşir. Koşturucu ikisini aynı sayaçlarla ölçer ve bir birimi durdurma
seçeneği taşır.

```js
// karar/duzen.mjs — ayni uc kurali iki duzende kosturur: tek dagitim birimi ve uc ayri birim
import { KURAL } from "./kural.mjs";

export const DUZEN = {
  "tek birim": [["fiyat", "plan", "hacim"]],
  "uc birim": [["fiyat"], ["plan"], ["hacim"]],
};

export function kostur(birimler, gonderiler, duran = null) {
  const olcu = { gecis: 0, donusum: 0, bayt: 0, yanit: 0, ayakta: 0, son: {} };
  const durum = new Map();
  for (const g of gonderiler) {
    const sonuc = {};
    for (const birim of birimler) {
      if (birim.includes(duran)) continue;
      const metin = birimler.length === 1 ? null : JSON.stringify(g);   // sinir varsa govde serilesir
      if (metin !== null) olcu.donusum += 2, olcu.bayt += metin.length;
      olcu.gecis += 1;
      for (const ad of birim) Object.assign(sonuc, KURAL[ad](metin === null ? g : JSON.parse(metin), durum));
    }
    if ("net" in sonuc) olcu.yanit += 1;                               // ucret olmadan istek yanitsizdir
    olcu.son = sonuc;
  }
  olcu.ayakta = birimler.filter((b) => b.includes(duran) === false).length;
  return olcu;
}
```

## Üç Senaryo ve Bir Eşik

Üç senaryo üç ayrı nitelik ailesinden gelir ve her biri tek bir yanıt ölçütüne indirilmiştir.
Sürdürülebilirlik senaryosu tarife kuralı değiştiğinde onunla birlikte yayınlanması gereken kural
sayısını sorar ve en çok 1 kabul eder. Başarım verimliliği senaryosu üç gönderi için sınırdan geçen
baytı sorar ve en çok 100 kabul eder. Güvenilirlik senaryosu hacim biriminin durduğu ortamda
yanıtlanan istek sayısını sorar ve en az 3 ister. Betik üç eşiği iki düzene uygular, sonra her eşiği
düzenin ölçülen değerine taşıyarak kararın hangi eşikte döndüğünü arar.

```js
// karar/olc.mjs — iki duzeni uc nitelik senaryosunun esigine karsi olcer ve karari ceviren esigi arar
import { DUZEN, kostur } from "./duzen.mjs";

const GONDERI = [
  { id: "G1", agirlik: 4, bolge: "35", sozlesmeNo: "S7", oran: 0.15 },
  { id: "G2", agirlik: 1, bolge: "34", sozlesmeNo: "S7", oran: 0 },
  { id: "G3", agirlik: 12, bolge: "06", sozlesmeNo: "S9", oran: 0.25 },
];
const SENARYO = [
  { ad: "S1 surdurulebilirlik", olcut: "birlikte yayinlanan kural", esik: 1, enCok: true },
  { ad: "S2 basarim verimliligi", olcut: "sinirdan gecen bayt", esik: 100, enCok: true },
  { ad: "S3 guvenilirlik", olcut: "yanitlanan istek", esik: 3, enCok: false },
];
const ALAN = ["dagitim birimi", "birlikte yayinlanan kural", "sinir gecisi", "donusum noktasi",
  "sinirdan gecen bayt", "yanitlanan istek", "ayakta kalan birim"];

const olcum = Object.entries(DUZEN).map(([ad, birimler]) => {
  const tam = kostur(birimler, GONDERI);
  const arizali = kostur(birimler, GONDERI, "hacim");
  return {
    ad, son: tam.son,
    "dagitim birimi": birimler.length,
    "birlikte yayinlanan kural": birimler.find((b) => b.includes("fiyat")).length,
    "sinir gecisi": tam.gecis,
    "donusum noktasi": tam.donusum,
    "sinirdan gecen bayt": tam.bayt,
    "yanitlanan istek": arizali.yanit,
    "ayakta kalan birim": `${arizali.ayakta}/${birimler.length}`,
  };
});

console.log(`${"olcu".padEnd(26)}${olcum.map((o) => o.ad.padStart(11)).join("")}`);
for (const a of ALAN) console.log(`${a.padEnd(26)}${olcum.map((o) => String(o[a]).padStart(11)).join("")}`);
for (const o of olcum) console.log(`${o.ad.padEnd(10)} son gonderinin sonucu = ${JSON.stringify(o.son)}`);

const gecti = (o, s) => (s.enCok ? o[s.olcut] <= s.esik : o[s.olcut] >= s.esik);
for (const s of SENARYO) {
  const okuma = olcum.map((o) => `${o.ad} = ${o[s.olcut]} ${gecti(o, s) ? "gecti" : "kaldi"}`);
  console.log(`${s.ad}: ${s.olcut} ${s.enCok ? "<=" : ">="} ${s.esik} -> ${okuma.join(", ")}`);
}
for (const o of olcum) console.log(`${o.ad.padEnd(10)} gectigi senaryo = ${SENARYO.filter((s) => gecti(o, s)).length}/3`);
console.log(`ucunu birden gecen duzen sayisi = ${olcum.filter((o) => SENARYO.every((s) => gecti(o, s))).length}`);

for (const s of SENARYO) {
  for (const o of olcum.filter((x) => gecti(x, s) === false)) {
    console.log(`${s.ad} esigi ${s.esik} yerine ${o[s.olcut]} olmadikca "${o.ad}" gecmez`);
  }
}
for (const s of SENARYO) {
  const kalan = SENARYO.filter((x) => x !== s);
  const gecen = olcum.filter((o) => kalan.every((x) => gecti(o, x))).map((o) => o.ad);
  console.log(`${s.ad} birakilirsa kalan ikisini gecen duzen = ${gecen.join(", ") || "yok"}`);
}
```

```sh
node karar/olc.mjs
```

```
olcu                        tek birim   uc birim
dagitim birimi                      1          3
birlikte yayinlanan kural           3          1
sinir gecisi                        3          9
donusum noktasi                     0         18
sinirdan gecen bayt                 0        588
yanitlanan istek                    0          3
ayakta kalan birim                0/1        2/3
tek birim  son gonderinin sonucu = {"net":8280,"gun":2,"tasiyici":"AN","hacim":17}
uc birim   son gonderinin sonucu = {"net":8280,"gun":2,"tasiyici":"AN","hacim":17}
S1 surdurulebilirlik: birlikte yayinlanan kural <= 1 -> tek birim = 3 kaldi, uc birim = 1 gecti
S2 basarim verimliligi: sinirdan gecen bayt <= 100 -> tek birim = 0 gecti, uc birim = 588 kaldi
S3 guvenilirlik: yanitlanan istek >= 3 -> tek birim = 0 kaldi, uc birim = 3 gecti
tek birim  gectigi senaryo = 1/3
uc birim   gectigi senaryo = 2/3
ucunu birden gecen duzen sayisi = 0
S1 surdurulebilirlik esigi 1 yerine 3 olmadikca "tek birim" gecmez
S2 basarim verimliligi esigi 100 yerine 588 olmadikca "uc birim" gecmez
S3 guvenilirlik esigi 3 yerine 0 olmadikca "tek birim" gecmez
S1 surdurulebilirlik birakilirsa kalan ikisini gecen duzen = yok
S2 basarim verimliligi birakilirsa kalan ikisini gecen duzen = uc birim
S3 guvenilirlik birakilirsa kalan ikisini gecen duzen = yok
```

## Sayıların Okunması

İki düzenin son gönderi için ürettiği sonuç birebir aynı: `{"net":8280,"gun":2,"tasiyici":"AN","hacim":17}`.
Bu satır kararın ne hakkında *olmadığını* söylüyor. Doğruluk iki düzende de aynıdır; biçem seçimi
işlevsel beklenti üzerine değil, onun etrafındaki sayılar üzerine verilir.

Vektörün geri kalanı iki düzeni ters yönde ayırıyor. Tek birimli düzende sınır geçişi 3, dönüştürme
noktası 0, sınırdan geçen bayt 0 — üç kural aynı bellek alanında çağrıldığı için sınır maliyeti
yoktur. Karşılığında tarife kuralı değiştiğinde onunla birlikte yayınlanan kural sayısı 3'tür ve
hacim kuralı durduğunda yanıtlanan istek 0/3'e, ayakta kalan birim 0/1'e iner: aynı birimde
oldukları için biri durunca hepsi durur. Üç birimli düzende ilk üç sayı büyüyor — geçiş 9, dönüşüm
18, bayt 588, yani gönderi başına yaklaşık 65 baytın dokuz kez taşınması — ama birlikte yayınlanan
kural 1'e, yanıtlanan istek 3/3'e çıkıyor.

Bu iki satırın ilk ve üçüncü derste ölçülenlerle akrabalığı vardır; yeni olan altlarındaki üç
satırdır. Üç eşiğe karşı tek birimli düzen 1/3, üç birimli düzen 2/3 geçiyor ve üçünü birden geçen
düzen sayısı 0. Bu bir ölçüm eksiği değil, yanıtın biçimidir: eşik kümesi çelişkiliyse hiçbir düzen
onu karşılamaz ve karar eşikleri sıralamaya döner.

Sıralamanın hangi eşikte döndüğü de hesaplandı. Kararı çeviren eşik S2'dir: yalnız o bırakıldığında
kalan iki senaryoyu geçen bir düzen çıkıyor, üç birimli düzen. S1 ya da S3 bırakıldığında geçen düzen
yok, çünkü ikisi de tek birimli düzenin kaldığı ölçütlerdir. Aynı hesap eşiklerin ne kadar oynaması
gerektiğini de veriyor: S2 eşiği 100'den 588'e çıkarılmadıkça üç birimli düzen geçmez, S1 eşiği
1'den 3'e ve S3 eşiği 3'ten 0'a inmedikçe tek birimli düzen geçmez. Bir savunma bu biçimde yazılır:
"üç birimli düzen seçilmiştir, çünkü S1 ve S3 eşikleri korunmuş ve S2 eşiği 588 bayta gevşetilmiştir."

Son olarak ölçülmemiş eksen. Betik yalnız üç ölçüt biliyor; bir düzeni dördüncü bir nitelikte
değerlendirmesi istenseydi karşılığında bir sayı bulamazdı. Ölçülmemiş bir eksen karar taşımaz —
tartışmada ağırlığı olmaz, çünkü hangi düzenin geçtiği hesaplanamaz. Kursun her dersinde bir ölçü
tanımlanmasının nedeni budur.

## Özet

- Bir biçem savunması üç parçadan oluşur: nitelik senaryosu, eşik ve ölçülen değer; biri eksikse
  ortada savunma değil tercih vardır.
- Karşılaştırma ortak temel ister: iki düzen aynı üç kuralı, aynı üç gönderiyi ve aynı sayaçları
  kullandı ve son gönderi için birebir aynı sonucu üretti.
- Tek birimli düzen sınır maliyetini sıfırda tuttu (geçiş 3, dönüşüm 0, bayt 0) ama birlikte
  yayınlanan kuralı 3'e, hacim durduğunda yanıtlanan isteği 0/3'e bıraktı.
- Üç birimli düzen aynı işi 9 geçiş, 18 dönüşüm ve 588 baytla yaptı; karşılığında birlikte
  yayınlanan kural 1, yanıtlanan istek 3/3, ayakta kalan birim 2/3 oldu.
- Üç eşiği birden geçen düzen sayısı 0 çıktı; bu bir ölçüm eksiği değil, çelişkili eşik kümesinin
  sonucudur ve kararı eşikleri sıralamaya çevirir.
- Kararı çeviren eşik hesaplandı: yalnız S2 bırakıldığında üç birimli düzen kalan iki senaryoyu
  geçiyor; S2 eşiği 100'den 588'e çıkmadıkça geçmiyor.

## Kurs Kapanışı

Kurs, üç konuya yayılmış biçemleri tek bir soruyla ele aldı: aynı gönderi ücretlendirme ve
yönlendirme kitaplığı o düzende kurulduğunda hangi sayı küçülür, hangisi büyür. Derslerin bıraktığı
ölçüler aşağıdaki karar tablosunda toplanıyor.

| Ders | İyileşen nitelik | Ölçülen kazanç | Ödenen sayı |
|---|---|---|---|
| Katmanlı Mimari | sürdürülebilirlik | açık ilan okuma isteğini 4 katmandan 2'ye, 4 sınırdan 1'e indirdi | aynı istek iki ayrı yerden karşılanabilir hâle geldi |
| Altıgen ve Soğan Mimari | sürdürülebilirlik | onarımdan sonra halka kenarı 5'ten 3'e, iki kuralın ihlali 0'a indi | her kural ötekinin gördüğü kusura kör: altıgen 4, soğan 6 kenar yasaklıyor |
| Temiz Mimari | sürdürülebilirlik | çıktı modeli geçirildiğinde erişilebilir ad 10'dan 4'e, JSON 174'ten 81 karaktere indi | sınırda ayrı bir model türü ve bir dönüştürme noktası |
| Bileşen Tabanlı Mimari | sürdürülebilirlik | yeteneğe göre bölünmede dışa açılan ad 8'den 6'ya, birlikte yayın oranı 0.39'dan 0.27'ye indi | yüzeyleri atlayan tek tüketici dışa açılan adı 6'dan 10'a çıkardı |
| Mikroçekirdek ve Eklenti Mimarisi | sürdürülebilirlik | çekirdek 4 eklenti adı yerine 0 taşıyor, ithal kapanışı 5 dosyadan 1'e indi | adlar kapanışı 6 dosya olan bileşim köküne taşındı; sözleşme koşum anında denetlenir |
| Kara Tahta Mimarisi | genişletilebilirlik | dokuz dosyanın yedisinde başka birim adı 0; beşinci çözümleyici 1 dosya ekletti | aynı sonuç 3 tur, 5 yoklama ve 7 okuma harcadı; ilk yazan kazanır kuralı 24 sıralamada 3 ayrı tutar üretti |
| İstemci–Sunucu | sürdürülebilirlik | teslimat tarafının bildiği modül 3'ten 1'e, ad 4'ten 1'e indi | hata ithal anından koşum anına kaydı; üç değişimi öğrenmek 12 soru, 9'u boş |
| Eşler Arası | güvenilirlik | kritik birim yıldızda 1, halkada ve tam ağda 0 | bilinen komşu 10'dan 30'a; halkada 18 ileti ve 3 tur |
| Model–Görünüm Aileleri | sürdürülebilirlik | görünümün tanıdığı model adı 5'ten 0'a, ithal kapanışı 2'den 1'e indi | sınırdan geçen 62 bayt 115'e, değişen dosya 1'den 2'ye çıktı |
| Borular ve Süzgeçler | sınanabilirlik | altı adımın altısı tek başına koşturuldu, yeni adımı ekleyen dosya 0 alan adı tanıyor | süzgeç girişlerinden geçen 28 alanın 17'si okunmadan taşındı |
| Yayımla–Abone Ol | sürdürülebilirlik | yayımcının bildiği modül 3'ten 1'e, ithal kapanışı 4'ten 2 dosyaya indi | "bu olayı kim işliyor" sorusu 1 dosya yerine 7 modül tarattı |
| Mesaj Kuyrukları ve Akışlar | başarım verimliliği | yayımcı 60 iş biriminin 0'ını kendi zamanından harcadı | ikinci tüketiciyle bitiş sırası 3 yerde bozuldu, 8 ileti 9 kez teslim edildi |
| Tek Parça Mimari | başarım verimliliği | sınır geçişi 4, dönüşüm noktası 0, sınırdan geçen bayt 0 | 1 dosyalık değişiklik 4 dosya yayınlattı; kusurda ayakta kalan birim 0/2 |
| Servis Yönelimli Mimari | uyumluluk | öğrenilecek gövde biçimi 1'e indi | kanonik alan 10, istek gövdesi 427 bayt; `bolge` değişince 3 dosya |
| Mikroservis Mimarisi | güvenilirlik | yeniden yayınlanan dosya 1, ücret durduğunda 3 uçtan 2'si 200 döndürdü | 18 satır sunucu tekrarı, sonuç durumu 4, öğrenilecek sözleşme 3 |
| Olay Güdümlü Mimari | sürdürülebilirlik | üçüncü tüketici yayıncıda 0 satır düzenletti, tüketici düştüğünde 3/3 | dönüşüm noktası 0'dan 9'a, bayt 0'dan 476'ya; biriktirende sapma 12 |
| Sunucusuz Mimari | sürdürülebilirlik | koşum satırı 0, yeni bileşim için düzenlenen işlev dosyası 0 | soğukta kurulum 2'den 6'ya; modül durumunda sapma 5, depo 13 erişim |

Tablonun tek bir okuması var: sağ kolon hiçbir satırda boş değil. Her biçem bir niteliği ölçülebilir
biçimde iyileştirdi ve karşılığında başka bir sayıyı büyüttü. Sağ kolonun boş göründüğü bir karar,
ölçülmemiş bir karardır.

Bu kurs, Yazılım Tasarımı ve Mimari İlkeler müfredatının altı kursunun son basamağıdır ve basamakların
tamamı ölçeğin büyümesiyle sıralanır. Temiz Kod satırı ve adı ölçtü; Programlama Paradigmaları aynı
işin farklı hesaplama biçimlerinde nasıl yazıldığını; Tasarım İlkeleri modülün ve sınıfın sorumluluk
sınırını; Tasarım Kalıpları birlikte çalışan nesne kümelerinin yinelenen düzenlerini; Alan Odaklı
Tasarım bir uygulamanın alan modelini ve bağlam sınırlarını; bu kurs ise uygulamanın kendisinin
dağıtım birimlerine bölünüşünü. Her basamakta ölçünün birimi değişti: satır sayısından ad sayısına,
ad sayısından ithal kapanışına, ithal kapanışından sınır geçişine, sınır geçişinden birlikte
yayınlanan dosya ve ayakta kalan birim sayısına.

Bir basamak daha vardır ve orada soru bu kursun sorusundan ayrılır. Bu kurs biçemleri bir *tasarım
kararı* olarak karşılaştırdı: aynı kitaplığın düzenlenişleri, tek makinede modellenmiş sınırlarla.
Sonraki müfredat Sistem Tasarımı ve Dağıtık Sistemler aynı birimleri gerçek bir sistemin kısıtları
altında ele alır: ölçek, gecikme, tutarlılık ve arıza davranışı. Bu dersteki 588 bayt orada bir ağ
bütçesine, 3/3 yanıt oranı bir erişilebilirlik hedefine, hacim kuralının tuttuğu durum bir tutarlılık
modeline dönüşür. Biçem seçimi orada da aynı üç parçayla savunulur; değişen, eşiklerin nereden
geldiğidir.
