İçeriğe geç
academia.sh

Ders 07 / 11

Katmanlı Diyagram Yaklaşımı

Aynı sistemin bağlam, kap, bileşen ve kod düzeyinde modellenmesi: düzey başına düğüm ve kenar sayısı, bir sorunun hangi düzeyde yanıtlandığı, yanlış düzeyde bakan okuyucunun okuduğu gereksiz düğüm ve dört düzeyi bakımda tutmanın başabaş noktası.

İçindekiler

Önceki ders sistemi ilgi eksenine göre dört görünüme böldü ve her görünümün yanıtladığı soruyu saydı. Kesilmeyen bir eksen kaldı: ayrıntı. Bölgesel kütüphane ağının dışarıyla ne alışveriş ettiğini soran biri de, gecikme cezası formülünün neyi çağırdığını soran biri de aynı modül listesine bakmak zorunda. Birincisi için liste fazla kalabalık, ikincisi için fazla kaba.

Katmanlı diyagram yaklaşımı bu ekseni keser. Aynı sistem dört ölçek düzeyinde modellenir: bağlam düzeyi sistemi tek bir kutu olarak ve dışarıdaki taraflarla ilişkisini; kap düzeyi sistemin içindeki ayrı çalışan ve ayrı yayınlanan birimleri; bileşen düzeyi bir kabın içindeki sorumluluk parçalarını; kod düzeyi bir bileşenin içindeki işlevleri gösterir. Düzeyler farklı şeyleri değil, aynı şeyi farklı ölçekte gösterir.

İki terimin sınırı yazılı olsun. Kap, ayrı çalışan ve ayrı yayınlanan birimdir — bir uç uygulaması, bir servis, bir veri deposu, bir ileti yolu. Bileşen daha önce modül içi sorumluluk parçası olarak kurulmuştu; buradaki fark bağlamdır: orada bileşen bir kod tabanının içindeki ayrılabilir birimdi, burada bir kabın içindeki ayrılabilir birimdir ve kendi başına yayınlanmaz.

Model

Diyagram çizilmiyor. Çizimin altındaki yapı modelleniyor: düğümler, kenarlar ve düğümleri birbirine bağlayan ağaç. Ağaç elle yazılmıştır (GR5), bileşen düzeyindeki bağımlılıklar da öyle (GR6). Kod düzeyindeki kenarlar ikisinden türetiliyor: her bileşen bağımlılığı kod düzeyinde tek bir öge çiftiyle gerçekleşir (GR7) ve her bileşenin ögeleri kendi içinde bir zincirle bağlanır (GR8). Tohum görünür.

Üst düzeylerin kenarları hesaplanır, yazılmaz: bir kod kenarının iki ucu istenen düzeydeki atalarıyla değiştirilir, kendine dönen kenarlar atılır, kalanlar tekilleştirilir. Buna kenarın yükseltilmesi deniyor. Yöntemin doğruluğu ölçülebilir bir iddiadır ve çıktıda sınanıyor: elle yazılan bileşen kenarları, kod kenarlarından yükseltilince geri gelmelidir.

Soru kümesi yine bir veri yapısıdır (GR9). Her sorunun bir hedef düğümü ve bir yanıt düzeyi var: hedefin komşularının ayırt edilebildiği en sığ düzey. Okuma maliyeti şöyle sayılıyor: yanıt düzeyinde okunan düğüm, hedef ile komşularıdır. Daha derin bir düzeyde okuyan biri hedefin ve komşularının bütün alt düğümlerini okumak zorundadır. Daha sığ bir düzeyde ise hedef kendi atasının içinde kaybolur ve soru yanıtsız kalır.

// gorunum/olcek.mjs — MODEL bolgesel kutuphane agi dort olcek duzeyinde: baglam, kap,
// bilesen, kod. Gercek bir kurum degildir; agac ve bilesen kenarlari elle yazilmistir.

// AGAC — kap > bilesen > kod ogesi (GR5)
const AGAC = {
  "web-portali": { "oturum-ucu": ["giris-akisi", "oturum-cerezi", "sifre-sifirlama"],
    "arama-ucu": ["sorgu-formu", "sonuc-listesi", "suzgec"], "hesap-ucu": ["odunc-listesi", "ceza-ozeti"] },
  "personel-uygulamasi": { "tezgah-ucu": ["odunc-ekrani", "iade-ekrani", "ceza-ekrani"],
    "yonetim-ucu": ["uye-yonetimi", "rapor-ekrani"] },
  "kiosk-ucu": { "kiosk-arayuz": ["kart-okuma", "hizli-odunc"], "kiosk-onbellek": ["yerel-katalog", "yerel-sure"] },
  "odunc-servisi": { "odunc-cekirdek": ["odunc-ac", "iade-al", "uzatma"],
    "odunc-kural": ["sure-hesabi", "limit-denetimi", "gecikme-cezasi"], ayirtma: ["ayirtma-sirasi", "ayirtma-bildirimi"] },
  "uye-servisi": { "uye-kayit": ["uye-olustur", "uye-guncelle", "kart-baglama"], "uye-ceza": ["ceza-birikimi", "ceza-tahsilat"] },
  "katalog-tumlestirme": { "katalog-baglayici": ["dis-sorgu", "kayit-donusturme", "yeniden-deneme"],
    "katalog-onbellek": ["onbellek-anahtari", "gecerlilik-suresi"] },
  "envanter-servisi": { "sube-envanter": ["kopya-durumu", "raf-yeri"], "sube-esitleme": ["esitleme-isi", "catisma-cozumu"] },
  "bildirim-servisi": { "bildirim-kuyruk": ["kuyruga-yaz", "kuyruktan-oku"], "bildirim-eposta": ["ileti-govdesi", "gonderim-denemesi"] },
  "rapor-servisi": { "rapor-gunluk": ["gunluk-toplam", "sube-kirilimi"], "rapor-toplu": ["aylik-ozet", "arsiv-yazimi"] },
  "ana-veritabani": { "iliskisel-sema": ["uye-tablosu", "kopya-tablosu", "odunc-tablosu", "ceza-tablosu"] },
  "olay-yolu": { "konu-yonlendirme": ["konu-tanimi", "abonelik"] },
  onbellek: { "anahtar-deger": ["yazma", "okuma", "sureli-silme"] },
};
const SISTEM = "kutuphane-agi";
const DIS = ["uye", "personel", "dis-katalog", "eposta-gecidi", "kimlik-saglayici"];

// BILESEN_KENAR — bilesen duzeyindeki bagimliliklar (GR6); elle secilmistir
const BILESEN_KENAR = [
  ["uye", "arama-ucu"], ["uye", "oturum-ucu"], ["uye", "hesap-ucu"], ["uye", "kiosk-arayuz"],
  ["personel", "tezgah-ucu"], ["personel", "yonetim-ucu"],
  ["oturum-ucu", "kimlik-saglayici"], ["oturum-ucu", "uye-kayit"],
  ["arama-ucu", "katalog-onbellek"], ["arama-ucu", "sube-envanter"],
  ["hesap-ucu", "odunc-cekirdek"], ["hesap-ucu", "uye-ceza"],
  ["tezgah-ucu", "odunc-cekirdek"], ["tezgah-ucu", "uye-ceza"], ["tezgah-ucu", "sube-envanter"],
  ["yonetim-ucu", "uye-kayit"], ["yonetim-ucu", "rapor-gunluk"],
  ["kiosk-arayuz", "odunc-cekirdek"], ["kiosk-arayuz", "kiosk-onbellek"], ["kiosk-onbellek", "katalog-onbellek"],
  ["odunc-cekirdek", "odunc-kural"], ["odunc-cekirdek", "iliskisel-sema"],
  ["odunc-cekirdek", "konu-yonlendirme"], ["odunc-cekirdek", "sube-envanter"],
  ["ayirtma", "odunc-cekirdek"], ["ayirtma", "bildirim-kuyruk"], ["ayirtma", "iliskisel-sema"],
  ["uye-kayit", "iliskisel-sema"],
  ["uye-ceza", "uye-kayit"], ["uye-ceza", "odunc-kural"], ["uye-ceza", "iliskisel-sema"],
  ["katalog-baglayici", "dis-katalog"], ["katalog-onbellek", "katalog-baglayici"], ["katalog-onbellek", "anahtar-deger"],
  ["sube-envanter", "iliskisel-sema"], ["sube-envanter", "konu-yonlendirme"],
  ["sube-esitleme", "sube-envanter"], ["sube-esitleme", "konu-yonlendirme"], ["sube-esitleme", "katalog-baglayici"],
  ["bildirim-kuyruk", "konu-yonlendirme"], ["bildirim-kuyruk", "iliskisel-sema"],
  ["bildirim-eposta", "bildirim-kuyruk"], ["bildirim-eposta", "eposta-gecidi"],
  ["rapor-gunluk", "iliskisel-sema"], ["rapor-toplu", "iliskisel-sema"], ["rapor-toplu", "sube-envanter"],
];

// ---- agactan turetilen eslemeler ----
const KAPLAR = Object.keys(AGAC);
const UST = { bilesen: {}, kap: {} }; // kod->bilesen, bilesen->kap
for (const k of KAPLAR) for (const b of Object.keys(AGAC[k])) {
  UST.kap[b] = k;
  for (const c of AGAC[k][b]) UST.bilesen[c] = b;
}
const BILESENLER = Object.keys(UST.kap);
const KODLAR = Object.keys(UST.bilesen);
const DUZEY = ["baglam", "kap", "bilesen", "kod"];
const dis = (n) => DIS.includes(n);
const seviye = (n) => (dis(n) ? -1 : n === SISTEM ? 0 : KAPLAR.includes(n) ? 1 : BILESENLER.includes(n) ? 2 : 3);
const temsil = (n, L) => { let m = n; while (!dis(m) && seviye(m) > L) m = seviye(m) === 3 ? UST.bilesen[m] : seviye(m) === 2 ? UST.kap[m] : SISTEM; return m; };
const icerik = { baglam: [SISTEM], kap: KAPLAR, bilesen: BILESENLER, kod: KODLAR };
const dugumler = (L) => [...icerik[DUZEY[L]], ...DIS];
const altlar = (n, L) => (seviye(n) >= L || dis(n) ? [temsil(n, L)] : dugumler(L).filter((m) => temsil(m, seviye(n)) === n));

// ---- kod duzeyi kenarlar: her bilesen kenari tek bir oge ciftiyle gerceklesir (GR7),
// her bilesenin ogeleri kendi icinde zincirle baglanir (GR8) ----
function uretec(tohum) { let s = tohum >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32; }
const rast = uretec(31607); // tohum gorunur
const kodOgesi = (n) => (dis(n) ? n : AGAC[UST.kap[n]][n][Math.floor(rast() * AGAC[UST.kap[n]][n].length)]);
const KOD_KENAR = BILESEN_KENAR.map(([a, b]) => [kodOgesi(a), kodOgesi(b)]);
for (const b of BILESENLER) { const g = AGAC[UST.kap[b]][b]; for (let i = 1; i < g.length; i++) KOD_KENAR.push([g[i - 1], g[i]]); }

const kenarlar = (L) => [...new Set(KOD_KENAR.map(([a, b]) => [temsil(a, L), temsil(b, L)])
  .filter(([a, b]) => a !== b).map(([a, b]) => `${a}->${b}`))].map((s) => s.split("->"));

// ---- duzey basina dugum ve kenar ----
const sut = (s, n) => String(s).padEnd(n);
console.log(sut("duzey", 10) + sut("dugum", 8) + sut("kenar", 8) + "ic dugum + dis taraf");
console.log("-".repeat(52));
DUZEY.forEach((d, L) => console.log(sut(d, 10) + sut(dugumler(L).length, 8) + sut(kenarlar(L).length, 8) + `${icerik[d].length} + ${DIS.length}`));

const geriGelen = new Set(kenarlar(2).map((e) => e.join("->")));
const elYazimi = BILESEN_KENAR.map((e) => e.join("->"));
console.log(`\nel yazimi ${elYazimi.length} bilesen kenarinin ${elYazimi.filter((e) => geriGelen.has(e)).length}'i kod kenarlarindan yukseltilince geri geliyor`);

// ---- soru kumesi: her sorunun yanit duzeyi ve hedefi (GR9) ----
const SORU = [
  { id: "D01", metin: "ag disaridan hangi taraflarla konusuyor", hedef: SISTEM, duzey: 0 },
  { id: "D02", metin: "kimlik saglayici sistemin icinde mi disinda mi", hedef: "kimlik-saglayici", duzey: 0 },
  { id: "D03", metin: "odunc servisi hangi kaplarla konusuyor", hedef: "odunc-servisi", duzey: 1 },
  { id: "D04", metin: "eposta gecidine hangi kap baglaniyor", hedef: "eposta-gecidi", duzey: 1 },
  { id: "D05", metin: "ana veritabanina hangi kaplar yaziyor", hedef: "ana-veritabani", duzey: 1 },
  { id: "D06", metin: "olay yolunu hangi kaplar kullaniyor", hedef: "olay-yolu", duzey: 1 },
  { id: "D07", metin: "odunc kurali bileseni neye bagli", hedef: "odunc-kural", duzey: 2 },
  { id: "D08", metin: "katalog onbellegini hangi bilesenler okuyor", hedef: "katalog-onbellek", duzey: 2 },
  { id: "D09", metin: "ceza hesabi hangi bilesenlere dokunuyor", hedef: "uye-ceza", duzey: 2 },
  { id: "D10", metin: "bildirim kuyruguna hangi bilesen yaziyor", hedef: "bildirim-kuyruk", duzey: 2 },
  { id: "D11", metin: "gecikme cezasi hesabi neyi cagiriyor", hedef: "gecikme-cezasi", duzey: 3 },
  { id: "D12", metin: "sure hesabi hangi ogeye bagli", hedef: "sure-hesabi", duzey: 3 },
  { id: "D13", metin: "uzatma islevi neye dokunuyor", hedef: "uzatma", duzey: 3 },
  { id: "D14", metin: "onbellek anahtari nerede uretiliyor", hedef: "onbellek-anahtari", duzey: 3 },
];

const komsu = (n, L) => { const t = temsil(n, L); return [...new Set(kenarlar(L).filter((e) => e.includes(t)).flat())].filter((m) => m !== t); };
const okuma = (s, L) => (L < s.duzey ? null : L === s.duzey ? 1 + komsu(s.hedef, L).length
  : altlar(s.hedef, L).length + komsu(s.hedef, s.duzey).reduce((t, m) => t + altlar(m, L).length, 0));

console.log("\nsoru  yanit duzeyi  okunan dugum  kod duzeyinde  gereksiz");
console.log("-".repeat(60));
let enAz = 0, hepsiKod = 0;
for (const s of SORU) {
  const az = okuma(s, s.duzey), kod = okuma(s, 3);
  enAz += az; hepsiKod += kod;
  console.log(sut(s.id, 6) + sut(DUZEY[s.duzey], 14) + sut(az, 14) + sut(kod, 15) + (kod - az));
}
console.log("-".repeat(60));
console.log(sut("toplam", 20) + sut(enAz, 14) + sut(hepsiKod, 15) + (hepsiKod - enAz));

console.log("\nayni soru dort duzeyde okunursa:");
console.log((sut("soru", 6) + DUZEY.map((d) => sut(d, 10)).join("")).trimEnd());
for (const id of ["D01", "D03", "D11"]) {
  const s = SORU.find((x) => x.id === id);
  console.log((sut(s.id, 6) + DUZEY.map((d, L) => sut(okuma(s, L) ?? "yanit yok", 10)).join("")).trimEnd());
}

console.log("\nyanit duzeyi dagilimi: " + DUZEY.map((d, L) => `${d}=${SORU.filter((s) => s.duzey === L).length}`).join(", "));
DUZEY.forEach((d, L) => {
  const yanit = SORU.filter((s) => s.duzey <= L);
  const yok = SORU.length - yanit.length;
  console.log(`${sut("yalniz " + d, 18)}yanit ${sut(`${yanit.length}/${SORU.length}`, 8)}yanitsiz ${sut(yok, 4)}okuma ${yanit.reduce((t, s) => t + okuma(s, L), 0)}`);
});

// ---- bakim ve basabas ----
// GR10: bir dugumu okumak ile bir dugumu guncel tutmak esit maliyet sayilir
const bakimDort = DUZEY.reduce((t, d, L) => t + dugumler(L).length, 0);
const bakimKod = dugumler(3).length;
const kazanc = hepsiKod - enAz;
console.log(`\ndort duzey ${bakimDort} dugum bakimda tutar, yalniz kod duzeyi ${bakimKod}; fark ${bakimDort - bakimKod}`);
console.log(`bir soru turu ${kazanc} gereksiz dugum okumasindan kurtariyor (${enAz} yerine ${hepsiKod})`);
console.log(`basabas (GR10): soru kumesi her ${(kazanc / (bakimDort - bakimKod)).toFixed(2)} degisiklik turunda bir kez sorulursa fazla bakim geri odenir`);
duzey     dugum   kenar   ic dugum + dis taraf
----------------------------------------------------
baglam    6       5       1 + 5
kap       17      30      12 + 5
bilesen   28      46      23 + 5
kod       61      79      56 + 5

el yazimi 46 bilesen kenarinin 46'i kod kenarlarindan yukseltilince geri geliyor

soru  yanit duzeyi  okunan dugum  kod duzeyinde  gereksiz
------------------------------------------------------------
D01   baglam        6             61             55
D02   baglam        2             57             55
D03   kap           9             44             35
D04   kap           2             5              3
D05   kap           6             29             23
D06   kap           4             18             14
D07   bilesen       3             8              5
D08   bilesen       5             13             8
D09   bilesen       6             17             11
D10   bilesen       5             12             7
D11   kod           3             3              0
D12   kod           3             3              0
D13   kod           5             5              0
D14   kod           3             3              0
------------------------------------------------------------
toplam              62            278            216

ayni soru dort duzeyde okunursa:
soru  baglam    kap       bilesen   kod
D01   6         17        28        61
D03   yanit yok 9         18        44
D11   yanit yok yanit yok yanit yok 3

yanit duzeyi dagilimi: baglam=2, kap=4, bilesen=4, kod=4
yalniz baglam     yanit 2/14    yanitsiz 12  okuma 8
yalniz kap        yanit 6/14    yanitsiz 8   okuma 51
yalniz bilesen    yanit 10/14   yanitsiz 4   okuma 112
yalniz kod        yanit 14/14   yanitsiz 0   okuma 278

dort duzey 112 dugum bakimda tutar, yalniz kod duzeyi 61; fark 51
bir soru turu 216 gereksiz dugum okumasindan kurtariyor (62 yerine 278)
basabas (GR10): soru kumesi her 4.24 degisiklik turunda bir kez sorulursa fazla bakim geri odenir

Düzeylerin Büyüklüğü

Dört düzeyin düğüm sayısı 6, 17, 28 ve 61; kenar sayısı 5, 30, 46 ve 79. Bağlam düzeyi bir sistem kutusu ve beş dış taraftan ibaret; kod düzeyinde elli altı iç düğüm var. Ölçek düzeyleri arasındaki büyüme kabaca ikişer katlıdır ve bu bilinçli bir tasarımdır: bir düzeyden diğerine geçen okuyucu her adımda gördüğü düğüm sayısını iki katına çıkarır, elli katına değil.

Yükseltme yönteminin doğruluğu çıktının ikinci satırında sınanıyor: elle yazılan kırk altı bileşen kenarının kırk altısı da kod kenarlarından yükseltilince geri geliyor. Üst düzeyler bağımsız belgeler değil, aynı grafın kaba çözünürlükte okunmuş hâlidir — türetildikleri sürece alt düzeyle çelişemezler, elle yazıldıklarında çelişebilirler.

Soru Hangi Düzeyde Yanıtlanır

On dört soru dört düzeye eşit dağılmıyor: ikisi bağlam, dördü kap, dördü bileşen, dördü kod düzeyinde yanıt buluyor. Toplam okuma maliyeti, her soru kendi yanıt düzeyinde okunduğunda 62 düğüm. Bu, dersin ölçüsünün sıfır noktasıdır: on dört sorunun hepsini yanıtlamak için gereken en az okuma.

Aynı on dört soru yalnız kod düzeyine bakılarak yanıtlansaydı okunan düğüm sayısı 278 olurdu. Fark 216 gereksiz düğüm — sorulan şeyin yanıtına katkısı olmayan, sırf doğru ölçek elde olmadığı için okunan düğümler. En pahalısı ilk iki soru: ağın dışarıyla ilişkisini soran biri bağlam düzeyinde altı düğüm okur, kod düzeyinde altmış bir. Elli beş düğüm, yanıtı değiştirmeyen ayrıntıdır.

Kod düzeyindeki dört soruda gereksiz düğüm sıfır; katmanlı yaklaşım onlara bir şey kazandırmıyor. Kazanç, sorunun yanıt düzeyi ile okuyucunun baktığı düzey arasındaki mesafeyle büyüyor.

Yanlış Düzeyin İki Yönü

“Aynı soru dört düzeyde okunursa” tablosu maliyeti tek soru üzerinde gösteriyor. Ağın dış ilişkisini soran D01 bağlam düzeyinde 6, kap düzeyinde 17, bileşen düzeyinde 28, kod düzeyinde 61 düğüm okutuyor — yanıt her düzeyde bulunabiliyor ama bedeli on kata çıkıyor. Ödünç servisinin komşularını soran D03 bağlam düzeyinde yanıtsız: o düzeyde ödünç servisi diye bir düğüm yok, sistem kutusunun içinde kalmış. Gecikme cezası hesabını soran D11 ilk üç düzeyin hepsinde yanıtsız.

İki yön de bir sayı üretiyor ve sayılar simetrik değil. Fazla derine bakmak yanıtı verir ama gereksiz düğüm okutur; ölçülebilir, tahammül edilebilir bir israftır. Fazla yükseğe bakmak yanıt vermez; okuyucu ya vazgeçer ya da tahmin eder. Alt tablo bunu düzen düzeyinde sayıyor: yalnız bağlam düzeyini tutan bir belge on dört sorunun ikisini yanıtlıyor, on ikisi yanıtsız. Yalnız kap düzeyi altısını, yalnız bileşen düzeyi onunu yanıtlıyor. Yalnız kod düzeyi hepsini yanıtlıyor ama 278 düğüm okutuyor.

Bakımın Bedeli

Dört düzeyi birden tutmak 112 düğümü bakımda tutmak demektir; yalnız kod düzeyini tutmak 61. Fark 51 düğümdür ve bu fark bedavaya gelmiyor: kap ve bileşen düzeyindeki her düğümün karşılığı kod tarafında değiştikçe güncellenmesi gerekir.

Karşılığında kazanılan şey soru turu başına 216 gereksiz düğüm okumasıdır. İki büyüklük farklı birimlerde olduğu için bir varsayım gerekiyor: bir düğümü okumak ile bir düğümü güncel tutmak eşit maliyet sayılıyor (GR10). Bu varsayımla başabaş noktası şudur: soru kümesi her 4,24 değişiklik turunda bir kez sorulursa dört düzeyin fazla bakımı geri ödenir. Soru sıklığı bunun altındaysa — yani belgeye kimse bakmıyor, kod ise sürekli değişiyorsa — dört düzeyi tutmak zarar eder.

Sayının kendisi modelin girdilerine bağlıdır; asıl taşınan sonuç şudur: katmanlı düzenin kârı okunma sıklığına bağlıdır, belgenin güzelliğine değil.

Özet

  • Katmanlı yaklaşım aynı sistemi bağlam, kap, bileşen ve kod düzeyinde modeller; düzeyler farklı şeyleri değil aynı şeyi farklı ölçekte gösterir. Kap ayrı çalışan ve ayrı yayınlanan birimdir, bileşen bir kabın içindeki ayrılabilir parçadır ve kendi başına yayınlanmaz.
  • Model ağda düğüm sayıları 6, 17, 28, 61; kenar sayıları 5, 30, 46, 79. Üst düzeylerin kenarları yazılmaz, kod kenarlarının uçları atalarıyla değiştirilerek yükseltilir; elle yazılan 46 bileşen kenarının 46’sı bu yolla geri geliyor.
  • On dört soru kendi yanıt düzeyinde okunduğunda toplam 62 düğüm okunuyor; hepsi kod düzeyinde yanıtlanmaya kalkılırsa 278 düğüm okunuyor ve aradaki 216 düğüm gereksizdir.
  • Fazla derine bakmak yanıtı pahalıya verir (D01 için 6 düğüm yerine 61), fazla yükseğe bakmak hiç vermez: D03 bağlam düzeyinde, D11 ilk üç düzeyin hepsinde yanıtsızdır.
  • Dört düzey 112 düğüm bakımda tutar, yalnız kod düzeyi 61; okuma ile bakım eşit maliyet sayılırsa (GR10) soru kümesi her 4,24 değişiklik turunda bir kez sorulduğunda fazla bakım geri ödenir.

Sonraki Adım

İki ders de düğüm ve kenardan oluşan tek bir yapıyı ölçtü: neyin neye bağlı olduğu. Sorulan soruların hepsi bu türdendi. Ama sonradan gelen birinin soruları hep “ne neye bağlı” biçiminde değil. “Ödünç isteği geldiğinde çağrılar hangi sırayla gider”, “bir kopya hangi durumlardan geçer”, “bu birim hangi makinede koşar” soruları düğüm–kenar yapısına bakarak yanıtlanamaz; sıra, durum ve yerleşim taşımayan bir gösterim bu soruların yanıtını içermez. Sonraki ders diyagram türlerini işlevleriyle ayırır — yapı gösteren, sıra gösteren, durum gösteren, dağıtım gösteren — ve şunu ölçer: soru başına doğru tür hangisi, yanlış türle yanıtlanmaya çalışılan soru hangi bilgiyi eksik bırakır, her tür kod değiştiğinde kaç ögesini güncellemek zorunda kalır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat