İçeriğe geç
academia.sh

Ders 14 / 19

Belgelendirme

Bileşen belgesinin zorunlu bölümleri, karşı örneğin taşıdığı bilgi, belgelendirme kapsamının bölüm ve bileşen düzeyinde hesabı ve özellik tablosunun arayüzle karşılaştırılması.

İçindekiler

Adlar eşleştiğinde bir bileşenden söz etmek mümkün olur, ama onu kullanmak için yeterli değildir. acilir-liste bileşeninin hangi durumda arama-alani yerine seçileceği, kip-pencere yerine ne zaman ayrı bir sayfa kullanılacağı ve rozet ile bildirim-seridi arasındaki ayrım adlardan okunamaz.

Belgelendirme bu kararları taşır. Bileşen belgesi bir kullanım kılavuzu değil, bileşenin sözleşmesinin okunabilir hâlidir: ne yapar, ne yapmaz, hangi girdileri alır, hangi durumda seçilmez. Bu ders belgenin zorunlu bölümlerini tanımlar ve kapsamın nasıl ölçüleceğini gösterir.

Belgenin Zorunlu Bölümleri

Bileşen belgesinin bölümleri, kullanan kişinin sırayla sorduğu sorulara karşılık gelir:

  • Amaç. Bileşen hangi işi görür? Tek cümle. Amacı iki cümleyle anlatılan bir bileşen genellikle iki bileşendir.
  • Ne zaman kullanılır. Hangi bağlamda doğru seçimdir. Bu bölüm bileşeni tarif etmez, seçim ölçütü verir.
  • Ne zaman kullanılmaz. Karşı örnek. Yerine hangi bileşenin kullanılacağını söyler.
  • Özellik tablosu. Girdi özelliklerinin adları, aldıkları değerler, varsayılanları ve zorunlu olup olmadıkları.
  • Örnek. Kopyalanıp çalıştırılabilir kullanım. Görsel değil, kaynak metin.
  • Erişilebilirlik notu. Klavye davranışı, odak sırası ve bileşenin kendiliğinden sağladığı ile kullananın sağlaması gerekenin ayrımı.
  • İlgili bileşenler. Komşu bileşenlere bağlantı; kullanan kişi yanlış yerden başlamış olabilir.

Bu yedi bölümün altısı tanıdıktır. Sistemlerin çoğunda en sık eksik kalan iki bölüm, karşı örnek ile ilgili bileşenlerdir; ikisi de aynı işi yapar: kullanıcıyı bu bileşenden uzaklaştırma işini.

Karşı Örneğin Taşıdığı Bilgi

Örnek, bileşenin doğru kullanımını gösterir. Karşı örnek ise başka bir şey gösterir: bileşenin sınırını. İkisi birbirinin yerine geçmez.

Katalog arayüzünden somut bir örnekle: rozet bileşeni bir kaydın durumunu gösterir — “rafta”, “ödünçte”, “ayırtılmış”. bildirim-seridi ise kullanıcıya bir olay bildirir — “ödünç alma işlemi tamamlandı”. İkisi de küçük, renkli, kısa metinli kutulardır ve ikisi de bir durumu anlatır. Ayrımı yalnızca karşı örnek yazılı hâle getirir: rozet bir nesnenin özelliğidir ve nesneyle birlikte durur; bildirim şeridi bir eylemin sonucudur ve eylemden sonra belirir. Bu ayrım özellik tablosundan okunamaz, çünkü iki bileşenin özellikleri neredeyse aynıdır.

Karşı örneğin ikinci işi, kaçış deliğinin kapatılmasıdır. Bileşen Tabanlı Arayüz Geliştirme kursunda gösterildiği gibi bir bileşen çağırana kaçış deliği verir; belge, bu deliğin nerede biteceğini söylemezse her ekip kendi sınırını çizer. “Rozet içine düğme koymayın, tıklanabilir durum için dugme bileşenini kullanın” cümlesi bir kuraldır ve denetlenebilir.

Kapsamın Hesaplanması

Belgelendirmenin “yapıldı” ya da “yapılmadı” olarak izlenmesi işe yaramaz; belgeler kısmen yazılır ve kısmen eskir. Aşağıdaki program kataloğun on dokuz belgelenmiş bileşenini alır, bölüm bazında ve bileşen bazında kapsamı hesaplar, eksikleri kullanım etkisine göre sıralar ve son olarak özellik tablosunu gerçek arayüzle karşılaştırır.

// belge.mjs — belgelendirme kapsaminin bilesen ve bolum duzeyinde hesabi

// Bir bilesen belgesinin zorunlu bolumleri.
const BOLUM = ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"];

// Her bilesen icin var olan bolumler ve kullanim sayisi (01. dersteki katalogla ayni).
const BELGE = [
  { ad: "dugme",           kullanim: 412, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "baglanti",        kullanim: 268, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "rozet",           kullanim: 188, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu"] },
  { ad: "kart",            kullanim: 157, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "metin-alani",     kullanim: 143, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "onay-kutusu",     kullanim:  96, var: ["amac", "ne-zaman", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "arama-alani",     kullanim:  71, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "bildirim-seridi", kullanim:  63, var: ["amac", "ne-zaman", "ozellik-tablosu", "erisim-notu"] },
  { ad: "acilir-liste",    kullanim:  57, var: ["ozellik-tablosu", "ornek"] },
  { ad: "bos-durum",       kullanim:  52, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "kip-pencere",     kullanim:  45, var: ["amac", "ne-zaman", "ozellik-tablosu", "erisim-notu"] },
  { ad: "sayfalama",       kullanim:  41, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "iskelet",         kullanim:  38, var: ["amac", "ne-zaman", "ozellik-tablosu", "ornek"] },
  { ad: "radyo-grubu",     kullanim:  34, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "ilgili"] },
  { ad: "kirinti-yolu",    kullanim:  29, var: ["amac", "ne-zaman", "ne-zaman-degil", "ozellik-tablosu", "ornek", "erisim-notu", "ilgili"] },
  { ad: "sekmeler",        kullanim:  24, var: ["amac", "ne-zaman", "ozellik-tablosu", "ornek"] },
  { ad: "akordeon",        kullanim:  17, var: ["amac", "ozellik-tablosu", "ornek"] },
  { ad: "arac-ipucu",      kullanim:  12, var: ["ozellik-tablosu"] },
  { ad: "tablo",           kullanim:   9, var: ["ozellik-tablosu", "ornek"] },
];

// Bolum bazli kapsam: hangi bolum en cok eksik?
console.log("bölüm             belgesi olan   bileşen payı   kullanım payı");
const toplamKullanim = BELGE.reduce((t, b) => t + b.kullanim, 0);
for (const bol of BOLUM) {
  const olan = BELGE.filter((b) => b.var.includes(bol));
  const k = olan.reduce((t, b) => t + b.kullanim, 0);
  console.log(
    `${bol.padEnd(17)} ${String(olan.length).padStart(9)}/${BELGE.length} ` +
    `${((olan.length / BELGE.length) * 100).toFixed(1).padStart(12)}% ` +
    `${((k / toplamKullanim) * 100).toFixed(1).padStart(13)}%`
  );
}

// Bilesen bazli kapsam ve eksik etkisi.
const satirlar = BELGE.map((b) => {
  const eksik = BOLUM.filter((bol) => !b.var.includes(bol));
  return { ...b, eksik, kapsam: (BOLUM.length - eksik.length) / BOLUM.length, etki: eksik.length * b.kullanim };
}).sort((a, b) => b.etki - a.etki);

console.log("\nbileşen           kapsam   kullanım   eksik etkisi   eksik bölümler");
for (const s of satirlar) {
  if (s.eksik.length === 0) continue;
  console.log(
    `${s.ad.padEnd(17)} ${(s.kapsam * 100).toFixed(0).padStart(5)}% ${String(s.kullanim).padStart(10)} ` +
    `${String(s.etki).padStart(14)}   ${s.eksik.join(", ")}`
  );
}

const hamKapsam = satirlar.reduce((t, s) => t + s.kapsam, 0) / satirlar.length;
const agirlikliKapsam = satirlar.reduce((t, s) => t + s.kapsam * s.kullanim, 0) / toplamKullanim;
console.log(`\nham kapsam (bileşen ortalaması) : %${(hamKapsam * 100).toFixed(1)}`);
console.log(`kullanımla ağırlıklı kapsam     : %${(agirlikliKapsam * 100).toFixed(1)}`);

// Ozellik tablosunun gercek arayuzle karsilastirilmasi.
const ARAYUZ = {
  dugme:        ["tur", "boyut", "durum", "simge", "genislik"],
  "acilir-liste": ["boyut", "durum", "aramali", "coklu"],
  rozet:        ["ton", "boyut"],
  "kip-pencere": ["boyut", "kapatilabilir", "baslik"],
};
const BELGELENEN = {
  dugme:        ["tur", "boyut", "durum", "simge"],
  "acilir-liste": ["boyut", "durum"],
  rozet:        ["ton", "boyut", "ikonlu"],
  "kip-pencere": ["boyut", "baslik"],
};

console.log("\nözellik tablosu sapması");
console.log("bileşen           belgelenmemiş        belgede olup arayüzde olmayan");
for (const ad of Object.keys(ARAYUZ)) {
  const eksik = ARAYUZ[ad].filter((o) => !BELGELENEN[ad].includes(o));
  const fazla = BELGELENEN[ad].filter((o) => !ARAYUZ[ad].includes(o));
  console.log(`${ad.padEnd(17)} ${JSON.stringify(eksik).padEnd(20)} ${JSON.stringify(fazla)}`);
}
const toplamOzellik = Object.values(ARAYUZ).reduce((t, a) => t + a.length, 0);
const belgelenen = Object.keys(ARAYUZ).reduce((t, ad) => t + ARAYUZ[ad].filter((o) => BELGELENEN[ad].includes(o)).length, 0);
console.log(`özellik tablosu kapsamı: ${belgelenen}/${toplamOzellik} (%${((belgelenen / toplamOzellik) * 100).toFixed(1)})`);
bölüm             belgesi olan   bileşen payı   kullanım payı
amac                     16/19         84.2%          95.6%
ne-zaman                 15/19         78.9%          94.6%
ne-zaman-degil           10/19         52.6%          79.4%
ozellik-tablosu          19/19        100.0%         100.0%
ornek                    16/19         84.2%          93.2%
erisim-notu              12/19         63.2%          89.1%
ilgili                   10/19         52.6%          74.2%

bileşen           kapsam   kullanım   eksik etkisi   eksik bölümler
acilir-liste         29%         57            285   amac, ne-zaman, ne-zaman-degil, erisim-notu, ilgili
bildirim-seridi      57%         63            189   ne-zaman-degil, ornek, ilgili
rozet                86%        188            188   ilgili
kip-pencere          57%         45            135   ne-zaman-degil, ornek, ilgili
iskelet              57%         38            114   ne-zaman-degil, erisim-notu, ilgili
onay-kutusu          86%         96             96   ne-zaman-degil
sekmeler             57%         24             72   ne-zaman-degil, erisim-notu, ilgili
arac-ipucu           14%         12             72   amac, ne-zaman, ne-zaman-degil, ornek, erisim-notu, ilgili
akordeon             43%         17             68   ne-zaman, ne-zaman-degil, erisim-notu, ilgili
tablo                29%          9             45   amac, ne-zaman, ne-zaman-degil, erisim-notu, ilgili
radyo-grubu          86%         34             34   erisim-notu

ham kapsam (bileşen ortalaması) : %73.7
kullanımla ağırlıklı kapsam     : %89.4

özellik tablosu sapması
bileşen           belgelenmemiş        belgede olup arayüzde olmayan
dugme             ["genislik"]         []
acilir-liste      ["aramali","coklu"]  []
rozet             []                   ["ikonlu"]
kip-pencere       ["kapatilabilir"]    []
özellik tablosu kapsamı: 10/14 (%71.4)

Bölüm Bazlı Kapsamın Söylediği

İlk tablo, hangi bölümün sistem genelinde eksik kaldığını gösteriyor. Özellik tablosu yüzde yüz doludur; çünkü arayüzden üretilebilir ve genellikle üretilir. Karşı örnek ile ilgili bileşenler ise yüzde 52,6’da kalıyor: her iki bileşenden yalnızca biri bu bölümlere sahip.

Bu dağılım rastgele değildir. Otomatik üretilebilen bölüm dolu, karar yazmayı gerektiren bölüm boş. Belgelendirme eksiği çoğu zaman zaman eksikliği değil, karar eksikliğidir: karşı örnek yazmak için bileşenin sınırının kararlaştırılmış olması gerekir ve o karar verilmemiştir.

İki sütun arasındaki fark da anlamlıdır. Karşı örnek bileşenlerin yüzde 52,6’sında var ama kullanımın yüzde 79,4’ünü kapsıyor; yani eksik olanlar çoğunlukla az kullanılan bileşenler. İlgili bileşenler bölümünde ise fark daha dar: yüzde 52,6’ya karşı yüzde 74,2. Bu, eksikliğin çok kullanılan bileşenlere de sıçradığını gösterir ve ikinci tablo bunu doğruluyor.

Eksiğin Sıralanması

İkinci tablo, kapsam yüzdesiyle iş önceliğinin aynı şey olmadığını gösteriyor. rozet yüzde 86 kapsamla listedeki en iyi durumdaki bileşenlerden biri, ama eksik etkisi 188 ile üçüncü sırada; çünkü 188 yerde kullanılıyor ve tek eksiği herkesi etkiliyor. tablo ise yüzde 29 kapsamla çok daha kötü durumda ama etkisi 45; dokuz yerde kullanılıyor.

Eksik etkisi çarpımı — eksik bölüm sayısı ile kullanım sayısının çarpımı — bu iki bilgiyi tek sıralamada birleştirir. Sıralamanın başındaki acilir-liste, önceki derste de görülmüştü: belgesiz bir aday olmasına karşın 57 yerde kullanılıyor. İki ayrı denetim aynı bileşeni işaret ettiğinde, o bileşen sıradaki iştir.

Ham kapsam ile ağırlıklı kapsam arasındaki 15,7 puanlık fark da okunmalıdır. İki sayı farklı sorulara yanıt verir: ham kapsam “kataloğun ne kadarı belgelendi”, ağırlıklı kapsam “kullanımın ne kadarı belgeli bir bileşene düşüyor” sorusuna. Yalnız ağırlıklı sayıyı raporlamak, az kullanılan bileşenlerin sürekli belgesiz kalmasını gizler; yalnız ham sayıyı raporlamak ise rozet gibi tek eksikli ama yaygın bileşenleri gözden kaçırır. İkisi birlikte raporlanır.

Özellik Tablosunun Eskimesi

Son blok belgenin en sinsi çürüme biçimini gösteriyor: belge var, ama yanlış. dugme bileşeninin genislik özelliği ve acilir-liste bileşeninin iki özelliği arayüze eklenmiş ama tabloya yazılmamış. Bunlar eksik bilgidir; kullanan kişi özelliğin varlığını bilmez, kendi çözümünü yazar ve sapma üretir.

rozet satırı ise farklı bir kusur taşıyor: ikonlu özelliği belgede duruyor, arayüzde yok. Bu yanlış bilgidir ve eksikten daha pahalıdır; kullanan kişi belgeye güvenip özelliği verir, hiçbir şey olmaz, hatanın nedenini kendi kodunda arar.

Bu blok aynı zamanda çözümün yönünü gösterir. Özellik tablosu elle yazıldığı sürece eskimesi kaçınılmazdır; arayüz tanımından üretildiğinde ise sapma yapısal olarak imkânsız hâle gelir. Elle yazılması gereken bölümler — amaç, seçim ölçütü, karşı örnek — zaten üretilemeyen bölümlerdir. Belgelendirme aracının seçimi bu ayrıma göre yapılır: üretilebilir olanı üreten, üretilemeyeni yazmaya zorlayan bir düzen.

Özet

  • Bileşen belgesi yedi bölümden oluşur ve her bölüm kullanan kişinin sorduğu belirli bir soruya karşılık gelir.
  • Karşı örnek, özellik tablosundan okunamayan sınır bilgisini taşır; benzer görünen iki bileşen arasındaki ayrımı yazılı hâle getiren tek bölüm odur.
  • Otomatik üretilebilen bölümler dolu, karar yazmayı gerektiren bölümler boş kalır; belgelendirme eksiği çoğu zaman karar eksikliğidir.
  • Kapsam ham ve kullanımla ağırlıklı olarak birlikte raporlanır; biri az kullanılan bileşenlerin ihmalini, diğeri yaygın bileşenlerdeki tek eksiği gizler.
  • Eksik bölüm sayısı ile kullanımın çarpımı, kapsam yüzdesinden farklı bir iş sıralaması üretir.
  • Belgede olup arayüzde olmayan bir özellik, arayüzde olup belgede olmayandan pahalıdır; özellik tablosu arayüz tanımından üretildiğinde bu sapma yapısal olarak ortadan kalkar.

Sonraki Adım

Belgedeki özellik tablosunun arayüzle karşılaştırılması bir soruyu açıkta bıraktı: dugme bileşenine genislik özelliğinin eklenmesi ile rozet bileşeninden ikonlu özelliğinin kaldırılması aynı ağırlıkta değildir. Birincisi hiçbir kullanımı bozmaz, ikincisi o özelliği veren her yeri bozar. Sonraki ders bu ayrımı sürüm numarasına bağlar: iki sürümün bileşen arayüzlerini karşılaştıran, değişiklikleri sınıflandıran ve sonraki sürüm numarasını hesaplayan bir betik yazar, buradan göç kılavuzunu üretir.

İ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