Ders 03 / 15
Gerçekleştirim Anlamı
Bir eksenin marjinal katkısı hangi eksenlerin zaten açık olduğundan bağımsızdır: gerçekleştirim iki ayrı sırada da 6 kusur ekler ve aynı eksene bir, üç ya da on iki kişi bakması 6 sayısını değiştirmez.
İçindekiler
Önceki ders beş eksenin bulduğu kümelerin ayrık olduğunu ölçtü: ikili kesişimlerin toplamı 0 ve her eksenin bulduğu yalnız o eksende görünüyor. Bundan bir sonuç doğrudan çıkar ama henüz sınanmadı — eğer paylar ayrıksa, bir eksenin katkısı hangi eksenlerin zaten açık olduğundan bağımsız olmalıdır.
Bu ders o sonucu sınar ve sınamayı en büyük tekil payın sahibi olan eksende, gerçekleştirim ekseninde yapar. Ölçüm iki soru sorar: eksenler farklı sıralarla açıldığında eğri değişir mi, ve aynı eksene daha çok kişi bakması o eksenin payını büyütür mü.
Gerçekleştirim Ekseni Ne Sorar
Gerçekleştirim (implementation) ekseni, kodun ne yapması gerektiği ile ne yaptığı arasındaki farkı arar. Arayüz ekseninden ayrılan yanı buradadır: arayüzde karşılaştırılan iki metin vardı — imzanın önceki ve sonraki hâli. Gerçekleştirimde karşılaştırmanın bir tarafı metin değildir. Bir tarafta gövdenin yaptığı iş durur, öteki tarafta okuyanın o gövdenin yapması gerektiğini düşündüğü iş.
Eksen üç alt soruya ayrılır.
Doğruluk. Gövde, adının ve açıklamasının söylediği işi yapıyor mu. Bu soru en çok görünen kusuru üretir çünkü kodun kendisi delildir: yanlış karşılaştırma yönü, ters çevrilmiş koşul, yanlış değişkenin döndürülmesi.
Kenar durum (edge case). Gövde, alışılmış girdinin dışında da doğru mu. Boş koleksiyon, tek elemanlı koleksiyon, sınır değerin kendisi, sıfıra bölme, taşma, eşzamanlı erişim. Kenar durum kavramı Yazılım Kalitesi ve Test müfredatının test derslerinde kuruldu; burada onun inceleme tarafı ölçülüyor.
Karmaşıklık. Gövdenin dallanma sayısı, iç içe geçme derinliği ve tek bir yerde topladığı sorumluluk. Adlandırma, işlev uzunluğu ve karmaşıklık ölçütlerinin kendisi Temiz Kod kursunda kuruldu ve burada tekrarlanmıyor. Bu derste bunlar bir kural listesi değildir; bir inceleme bulgusudur — incelemenin gördüğü, not düştüğü ve kapanmasını istediği şeydir. Aradaki fark önemlidir: kural listesi değişikliğe uygulanır, bulgu ise değişikliğin belirli bir yerini gösterir.
# ogretilen inceleme notu ornegi , calistirilmamistir
dogruluk Toplam hesaplanirken son eleman disarida kaliyor; ust sinir
dahil olmali. Ayni girdi icin beklenen deger 15, donen 10.
kenar durum Liste bos oldugunda ilk eleman okunuyor. Bos girdi icin bir
erken donus ya da bos degerin acikca ele alinmasi gerekiyor.
karmasiklik Bu govdede dort ic ice kosul var ve ucuncusu ilk ikisinin
disinda hicbir durumda calismiyor. Kosul ayri bir yardimci
islevle disari alinirsa dallanma ikiye iner.
Üç notun ortak biçimi şudur: nerede, ne, hangi koşulda. Üçü de değişikliğin bir yerini gösteriyor ve kapanma koşulunu adlandırıyor. Bu blok bir örnektir ve çalıştırılmaz; dersin sayıları yalnız ölçüm bloğundan gelir.
Doğruluğun Kâhini Nerede
Arayüz ekseninin karşılaştıracağı iki metin vardı; gerçekleştirim ekseninin bir tarafı yoktur. Okuyan, kodun ne yapması gerektiğini bir yerden çıkarmak zorundadır ve o yer değişikliğin içinde olmayabilir.
Üç kaynak kullanılabilir. Değişikliğin açıklaması niyeti tarif eder; kısa yazıldığında okuyan niyeti gövdeden çıkarmaya çalışır ve bu döngüseldir — gövdenin doğru olup olmadığı, yine gövdeye bakılarak karara bağlanamaz. Testler beklenen davranışı örnekle verir; ama testler aynı değişiklikte yazıldıysa gövdeyle aynı yanlış anlayışı paylaşabilirler. Belge davranışı sözle verir ve değişiklikle birlikte güncellenmemişse eski davranışı anlatır.
Üç kaynağın da kusurlu olabileceği açık ve bu bir rastlantı değil: aynı değişiklikte üçü de aynı elden çıkar. Gerçekleştirim ekseninin pahalı olmasının nedeni budur — okuyan, kodun ne yapması gerektiğine dair bağımsız bir yargıya sahip olmak zorundadır.
Bunun ölçümdeki karşılığı yoktur ve olmaması bilinçlidir. Kurgu her ekseni eşit maliyette sayar: eksen açıksa sınıfı bulunur. Gerçek bir incelemede gerçekleştirim ekseni kusur başına en pahalı eksendir ve biçim ekseni en ucuzu. Tablo bulunan kusuru sayar, harcanan dikkati saymaz; iki sayının ayrı olduğu bu kursun son dersine kadar açık tutulur.
Katkı Sıraya Bağlı mı
Bir eksenin marjinal katkısı, o eksen açıldığında bulunan kusur sayısının ne kadar arttığıdır. Paylar ayrıksa bu artış her zaman sınıfın büyüklüğü kadar olmalıdır ve açılma sırası hiçbir şey değiştirmemelidir.
Bunun sınanması gerekir, çünkü sezgi tersini söyler. Bir incelemede eksenler gerçekten sırayla açılır: okuma bir yerden başlar ve ilerledikçe okuyanın bakışı değişir. Sezgi, ilk açılan eksenin “kolay” kusurları toplayacağını ve sonrakilere daha az iş kalacağını söyler. Ölçüm bu sezgiyi iki ayrı sırayla sınar: biri gerçekleştirimden başlar, öteki biçimden.
Ölçümün Varsayımları
- IE16 — Ortak kurgu değişmez: 600 satır, 12 öbek, 24 kusur, dikkat 12 öbek. Okunmamış öbek yoktur.
- IE17 — Eğri, tek bir inceleyenin eksen kümesinin adım adım büyütülmesidir. Her adımda aynı değişiklik yeniden okunur; okuma bütçesi adım sayısıyla tükenmez.
- IE18 — Marjinal katkı, o adımdaki kümülatif bulunan sayısından bir önceki adımınkinin çıkarılmasıdır.
- IE19 — İki sıra aynı beş ekseni içerir ve yalnız açılma düzenleri farklıdır; sıra B, sıra A’nın tersidir.
- IE20 — İkinci bölümde aynı eksene bakan inceleyenler birbirinin aynıdır; kurgu, ikinci bir okumanın birincinin gözünden kaçanı yakalaması gibi bir pay içermez. Bu yalınlaştırma bilerek yapılır ve ölçümün sonucunu tek bir değişkene bağlar.
- IE21 — “Okuma” sütunu yapılan inceleme sayısıdır; aynı kişinin iki kez okuması ile iki kişinin birer kez okuması bu kurguda ayırt edilmez.
- IE22 — Oran, bulunanın 24’e bölümüdür. Kümenin çözünürlüğü 1/24 = 0,042’dir.
Ölçüm
"""Gerceklestirim ekseni: eksen ekleme egrisi ve ayni eksene kisi ekleme. Bolum 1 - eksenler iki ayri sirayla acilinca kumulatif bulunan ve marjinal. Bolum 2 - gerceklestirim ekseni acik, kapali ve cok okumayla. """ TOHUM = 20260815 EKSENLER = ("arayuz", "gerceklestirim", "test", "belge", "bicim") YAZILMAYAN = "eksik gereksinim" SINIFLAR = EKSENLER + (YAZILMAYAN,) DIKKAT = 12 OBEK = 50 def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def degisiklik(satir, kusur_sayisi=24, tohum=TOHUM): r, kusurlar = uretec(tohum), [] obek_sayisi = max(1, satir // OBEK) for i in range(kusur_sayisi): kusurlar.append({"no": i + 1, "sinif": SINIFLAR[r(6)], "obek": r(obek_sayisi)}) return {"satir": satir, "obek": obek_sayisi, "kusurlar": kusurlar} def incele(d, eksenler, dikkat=DIKKAT): okunan = set(range(min(dikkat, d["obek"]))) return {k["no"] for k in d["kusurlar"] if k["sinif"] in eksenler and k["obek"] in okunan} def kurul(d, atamalar, dikkat=DIKKAT): bulunan = set() for eksenler in atamalar: bulunan |= incele(d, eksenler, dikkat) return bulunan def egri(d, sira): """Eksenler tek tek acilir; her adimda kumulatif ve marjinal.""" acik, satirlar, onceki = set(), [], 0 for e in sira: acik.add(e) n = len(incele(d, acik)) satirlar.append((e, n, n - onceki)) onceki = n return satirlar TAM = set(EKSENLER) d = degisiklik(600) A = egri(d, ("gerceklestirim", "arayuz", "test", "belge", "bicim")) B = egri(d, ("bicim", "belge", "test", "arayuz", "gerceklestirim")) print(f"{'adım':>4s} {'sıra A':<15s} {'toplam':>6s} {'marjinal':>8s} " f"{'sıra B':<15s} {'toplam':>6s} {'marjinal':>8s}") for i, (a, b) in enumerate(zip(A, B), start=1): print(f"{i:4d} {a[0]:<15s} {a[1]:6d} {a[2]:8d} " f"{b[0]:<15s} {b[1]:6d} {b[2]:8d}") print() DORT = TAM - {"gerceklestirim"} KURULLAR = { "bir inceleyen, gerçekleştirim": [{"gerceklestirim"}], "üç inceleyen, gerçekleştirim": [{"gerceklestirim"}] * 3, "on iki inceleyen, gerçekleştirim": [{"gerceklestirim"}] * 12, "bir inceleyen, dört eksen": [DORT], "bir inceleyen, beş eksen": [TAM], } print(f"{'kurul':<33s} {'okuma':>5s} {'bulunan':>7s} {'kaçan':>5s} " f"{'gerçekleştirim kaçan':>20s} {'oran':>5s}") for ad, atama in KURULLAR.items(): b = kurul(d, atama) kacan = [k for k in d["kusurlar"] if k["no"] not in b] gk = sum(1 for k in kacan if k["sinif"] == "gerceklestirim") print(f"{ad:<33s} {len(atama):5d} {len(b):7d} {len(kacan):5d} " f"{gk:20d} {len(b) / 24:5.3f}")
adım sıra A toplam marjinal sıra B toplam marjinal 1 gerceklestirim 6 6 bicim 7 7 2 arayuz 9 3 belge 10 3 3 test 12 3 test 13 3 4 belge 15 3 arayuz 16 3 5 bicim 22 7 gerceklestirim 22 6 kurul okuma bulunan kaçan gerçekleştirim kaçan oran bir inceleyen, gerçekleştirim 1 6 18 0 0.250 üç inceleyen, gerçekleştirim 3 6 18 0 0.250 on iki inceleyen, gerçekleştirim 12 6 18 0 0.250 bir inceleyen, dört eksen 1 16 8 6 0.667 bir inceleyen, beş eksen 1 22 2 0 0.917
Eğri Sıradan Bağımsız
Üst tablonun iki yarısı aynı beş ekseni açıyor, biri gerçekleştirimden biri biçimden başlayarak, ve iki eğri de 22’de bitiyor.
Marjinal sütunlar ölçümün asıl sonucu. Gerçekleştirim, sıra A’da ilk açılan eksen ve katkısı 6; sıra B’de son açılan eksen ve katkısı yine 6. Biçim, B’de ilk sırada 7 ekliyor, A’da son sırada yine 7. Arayüz, test ve belge her iki sırada da 3 ekliyor.
Bir eksenin katkısı, ondan önce kaç eksenin açıldığına bakmıyor. “Kolay kusurlar önce toplanır, sonraya az iş kalır” sezgisi bu kurguda yanlış çıkıyor ve nedeni önceki derste ölçülmüştü: paylar ayrık olduğu için tüketilecek ortak bir havuz yok. Her eksen kendi sınıfını getiriyor ve o sınıfı başka hiçbir eksen zaten toplamış olamıyor.
Bağımsızlığın sınırı da bellidir. Bu derste dikkat tükenmiyor, çünkü değişiklik dikkat kadar. Okuma sırasının önem kazandığı tek durum, okumanın bitmeden kesildiği durumdur: o zaman hangi eksenin sonraya bırakıldığı doğrudan hiç bakılmayan eksen hâline gelir. Bu konunun ölçümlerinde böyle bir kesilme yoktur.
Bunun doğrudan bir kullanımı var. Bir kurulun bulacağı kusur sayısı, kimin önce baktığına ya da okumanın hangi dosyadan başladığına bakmadan, yalnız açık eksenlerin sınıf büyüklüklerinin toplamı olarak önceden hesaplanabilir. Sıra bir plan değişkeni değildir; kapsam olan tek değişkendir.
Aynı Eksene Kişi Eklemek
Alt tablonun ilk üç satırı tek bir sayıyı üç kez veriyor: 6.
Bir inceleyen gerçekleştirime bakıyor ve 6 buluyor. Üç inceleyen aynı eksene bakıyor, yine 6. On iki inceleyen aynı eksene bakıyor, yine 6. Okuma sayısı bire karşı on iki oranında arttı ve bulunan kusur 0 arttı. Oran üç satırda da 0,250’de duruyor.
Bu, kursun ikinci iddiasının en sert biçimidir: inceleyen eklemek kusur bulmaz. Buradaki “bulmaz” mecaz değil, ölçülen sayıdır — on bir fazladan okumanın getirisi sıfırdır. Kurgu bunu bir yalınlaştırmayla elde ediyor: aynı eksene bakan ikinci okuma birincinin gördüğünü görür. Gerçek bir incelemede ikinci okumanın küçük bir ek payı olabilir, ama bu payın büyüklüğü hiçbir zaman yeni bir eksen açmanın payı kadar olmaz, çünkü ikinci okuma tanımı gereği aynı sınıfın içinde arar.
Bu, ikinci okumanın hiçbir işe yaramadığı anlamına gelmiyor; bulma dışında bir işe yaradığı anlamına geliyor. İlk dersin üç işi burada ayrışır: aynı eksene bakan ikinci okuma kusur bulmaz ama bilgi yayar — o kodun ikinci bir okuru olur ve sonraki değişikliklerde gerçekleştirim ekseninde bakabilecek kişi sayısı artar. Yeni katılan birinin deneyimli birinin baktığı eksende okuma yapması da aynı sınıfa girer; bu bir öğrenme kararıdır.
Ayrım şurada keskinleşir: ikinci okuma bir bulma kararıysa ölçülebilir ve getirisi 0’dır; bir yayma kararıysa bu tabloda ölçülmez. İkisi birbirinin yerine geçtiğinde sonuç yanlış olur. Bir kusur kaçtıktan sonra verilen “bir kişi daha baksın” kararı, sayının söylediğine göre bulma tarafında karşılıksızdır. Karşılığı olan karar, bakılmayan bir ekseni açmaktır.
Son iki satır aynı ölçümün öteki ucunu veriyor. Gerçekleştirim ekseni kapatıldığında, kalan dört eksene bakan tek bir inceleyen 16 kusur buluyor ve kaçan 8’in 6’sı gerçekleştirim sınıfından. Eksen geri açıldığında bulunan 22’ye çıkıyor: oran 0,667’den 0,917’ye. Tek bir ekseni açmanın getirisi 6 kusur; on bir fazladan okumanın getirisi 0.
Üç Alt Sorunun Ayrı Ağırlığı
Ölçüm gerçekleştirim sınıfını tek bir sayı olarak veriyor — 6 — ve içindeki üç alt soruyu ayırmıyor. Bu bir kurgu kararıdır; ama ayrımın pratikte bir sonucu var ve tablonun dışında kalıyor.
Doğruluk kusurunun bir kanıtı vardır: yanlış sonucu üreten bir girdi gösterilebilir. Bulgu tartışmaya kapalıdır ve kapanması tek bir düzeltmeyle olur.
Kenar durum kusurunun kanıtı da bir girdidir, ama o girdinin gerçekten oluşup oluşmadığı tartışılabilir. Bulgu bu yüzden bazen bir düzeltmeyle değil, bir kararla kapanır: o durumun kapsam dışı olduğunun yazılı hâle getirilmesiyle.
Karmaşıklık kusurunun gösterilebilir bir girdisi yoktur. Bulgu bugünkü bir yanlışı değil, sonraki değişikliklerin maliyetini işaret eder ve bu yüzden kapanması için ortak bir ölçüt gerekir. Ölçütün kendisi Temiz Kod kursunun konusudur; incelemede kalan iş, bulguyu değişikliğin belirli bir yerine bağlamak ve neyin kapanmış sayılacağını yazmaktır.
Üçü de aynı sınıfta sayılır çünkü üçü de aynı eksenin okumasıyla bulunur. Kaç turda kapandıkları ise ayrı bir değişkendir ve bu konunun ölçümlerine girmez.
Özet
- Gerçekleştirim ekseni kodun ne yapması gerektiği ile ne yaptığı arasındaki farkı arar ve üç alt soruya ayrılır: doğruluk, kenar durum, karmaşıklık.
- Karmaşıklık burada bir kural listesi değil, bir inceleme bulgusudur: değişikliğin belirli bir yerini gösterir ve kapanma koşulunu adlandırır.
- Bir eksenin marjinal katkısı açılma sırasından bağımsızdır: gerçekleştirim iki sırada da 6, biçim iki sırada da 7, kalan üç eksen 3’er kusur ekler ve iki eğri de 22’de biter.
- Bir kurulun bulacağı sayı, açık eksenlerin sınıf büyüklüklerinin toplamıdır; okuma sırası bir plan değişkeni değildir.
- Aynı eksene bir, üç ve on iki okuma 6 kusur bulur; oran 0,250’de sabit kalır. On bir fazladan okumanın getirisi 0, tek bir yeni eksenin getirisi 6 kusurdur.
- Aynı eksendeki ikinci okumanın karşılığı bulmada değil bilgi yaymadadır; ikisi birbirinin yerine konduğunda “bir kişi daha baksın” kararı bulma tarafında karşılıksız kalır.
Sonraki Adım
Buraya kadar iki eksen ölçüldü ve ikisinde de kaçan kusurun nedeni aynıydı: o eksene kimse bakmıyordu. Ama kaçmanın ikinci bir nedeni daha olabilir — kusurun bulunduğu metnin hiç okunmamış olması. Bu derste böyle bir kaçış yoktu, çünkü değişiklik dikkat kadardı. Sonraki ders test ekseninde bu ikisini birbirinden ayırır: testin kendisinin taşıdığı kusurlar okunmuş öbeklerin içinde mi duruyor, aynı öbeği başka eksenlerden okuyan inceleyenler o kusurun üzerinden kaç kez geçiyor, ve geçtikleri hâlde neden görmüyorlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.