Ders 02 / 15
Arayüz Anlamı
Beş eksenin bulduğu kümeler ayrıktır ve ikili kesişimlerin toplamı 0'dır; arayüz ekseni kapatıldığında bulunan 22'den 19'a iner ve arayüzsüz on inceleyen, beş eksene bakan tek inceleyenden 3 kusur az bulur.
İçindekiler
Önceki ders beş eksenli bir okumanın 24 kusurun 22’sini bulduğunu, tek eksenli bir okumanın 6’sını bulduğunu gösterdi. Aradaki fark eksen sayısındandı; ama tablo bir şeyi varsaymıştı ve doğrulamamıştı: eksenlerin payları birbirinden ayrı. Beş eksenin toplamı 22 çıkıyorsa, aynı kusuru iki eksenin birden saymadığı kabul edilmiş demektir.
Bu ders o kabulü ölçer ve ölçümü ilk eksende, arayüz ekseninde yapar. Sorusu şudur: bir arayüz kusuru gerçekten yalnız arayüze bakan gözle mi bulunur, yoksa yeterince çok kişi yeterince dikkatli okursa başka bir eksenden de görünür mü.
Genel Arayüzün Sözleşmesi
Bir kod parçasının genel arayüzü, dışarıdan çağrılabilen adların ve onların davranışlarının kümesidir: işlev imzaları, tip alanları, dönüş değerleri, hata biçimleri ve adların kendisi. Bu kümeye arayüz sözleşmesi (interface contract) denir, çünkü çağıran taraf ona güvenerek kod yazar.
Sözleşmenin bozulması bir derleme hatası olmak zorunda değildir. Sürümleme stratejileri ve kırıcı olan ile olmayan değişikliğin sınıflandırması Web API Tasarımı kursunun Hata, Sürüm ve Belge konusunda kuruldu; burada tekrarlanmıyor. Bu dersin ölçtüğü tek şey incelemede nasıl fark edildiğidir: hangi eksene bakan göz bu izi görür, hangisi görmez.
Beş Bozma Biçimi ve İncelemedeki İzi
Zorunlu parametre eklemek. İz imzanın kendisindedir ve değişikliğin içinde okunur. Çağıran kod derlenmez; kusur birleştirmeden sonra derleme aşamasında da yakalanır. İncelemenin buradaki katkısı bulmak değil, erken bulmaktır.
Parametrenin anlamını değiştirmek. İmza aynı kalır — aynı ad, aynı tür — ama beklenen değer başkadır; bir süre alanının birimi saniyeden milisaniyeye geçmiştir. Değişiklikte görünen tek şey gövdedeki bir çarpandır, imzada iz yoktur.
Dönüş değerinin davranışını değiştirmek. Boş liste yerine boş değer dönmek, hata yerine varsayılan dönmek, sıralı yerine sırasız dönmek. İz gövdededir; çağıran taraf derlenir ve sessizce yanlış çalışır.
Atılan hata sınıfını değiştirmek. Yakalama blokları artık eşleşmez; hata yakalanmadan yukarı çıkar ve çağıran taraf bunu derleme sırasında öğrenmez.
Bir adı kaldırmak ya da yeniden adlandırmak. En görünür biçimdir ve değişikliğin içinde doğrudan okunur; kaldırılan adı kimin kullandığı ise değişikliğin dışındadır.
Ortadaki üç biçimin ortak yanı dersin çıkış noktasıdır: derleyici sessizdir, testler geçer, geriye tek savunma olarak inceleme kalır — çünkü testler de aynı değişiklikte yeni davranışa göre güncellenmiştir.
İzin Değişikliğin İçinde, Sonucunun Dışında
Arayüz kusurunun incelemedeki ayırt edici yanı şudur: izi küçüktür, sonucu değişikliğin dışındadır. Gönderilen değişiklikte görünen şey tek bir satırdır — bir imza. O satırın kırdığı kod ise değişikliğin içinde değildir; başka dosyalarda, başka depolarda ya da henüz yazılmamış çağrılardadır.
Bu, arayüz ekseninin neden ayrı bir okuma gerektirdiğini açıklıyor. Gerçekleştirime bakan göz işlevin gövdesini okur ve gövde doğrudur; teste bakan göz testleri okur ve testler geçer, çünkü testler de yeni imzayla birlikte güncellenmiştir. İzi görmek için imzanın eski hâliyle karşılaştırılması gerekir ve bunu yapan tek okuma arayüz ekseninden yapılandır.
# ogretilen inceleme notu ornegi , calistirilmamistir
konu genel islevin imzasi
onceki ayristir(metin)
sonraki ayristir(metin, kip)
not Ikinci parametre varsayilansiz eklenmis; onceki imzayla yapilan
cagri artik gecerli degil. Bu, cagiran koda dokunmadan
yayimlanamayacak bir degisiklik. Iki yol var: kip parametresine
onceki davranisi veren bir varsayilan vermek, ya da onceki
imzayi koruyup yeni davranisi ayri bir adla sunmak.
Not değişikliğin bir yerini gösteriyor, kırılan koşulu adlandırıyor ve iki kapanış yolu öneriyor. Bu blok bir örnektir ve çalıştırılmaz; dersin sayıları yalnız ölçüm bloğundan gelir.
İncelemenin Elindeki Üç Kaynak
Arayüz ekseninde çalışan bir okuma üç kaynağa bakabilir ve üçünün kapsamı farklıdır.
Değişikliğin kendisi eklenen ve silinen satırlardır. Sözleşmenin yeni hâli buradadır, önceki hâli de silinen satırlarda durur; bu iki hâlin karşılaştırılması arayüz ekseninin asıl işidir.
Değişikliğin başlığı ve açıklaması yazanın niyetini taşır. “Kip parametresi eklendi” cümlesiyle “kip parametresi zorunlu olarak eklendi” cümlesi arasındaki fark, incelemenin hangi soruyu soracağını belirler. Bu kaynak eksikse okuma imzayı kendi başına yorumlamak zorunda kalır.
Deponun geri kalanı çağıran kodu içerir ama değişikliğin parçası değildir. Arayüz kusurunun sonucu buradadır ve inceleme bu kaynağa bakmak zorunda değildir; bakması ayrı bir karardır ve ayrı bir okuma isteği doğurur.
Ölçüm bu üç kaynağı ayrı ayrı modellemez; arayüz ekseni açıksa kusur bulunur, kapalıysa bulunmaz. Modelin bu yalınlığı ölçülen şeyi tek bir değişkende tutmak içindir: hangi eksene bakıldığı.
Ölçümün Varsayımları
- IE9 — Ortak kurgu değişmez: 600 satır, 12 öbek, 24 kusur, dikkat 12 öbek. Değişikliğin tamamı okunur; bu derste de okunmamış öbek yoktur.
- IE10 — Bir kusur tek bir sınıfa aittir. Aynı satırda iki sınıftan kusur bulunabilir ama bunlar iki ayrı kusurdur ve ayrı sayılır.
- IE11 — İki eksenin kesişimi, ikisinin de bulduğu kusur numaralarının kümesidir. Sınıflar birbirini dışladığı için bu kesişimin boş çıkması beklenir; ölçüm bunu varsaymaz, sayar.
- IE12 — “Yalnız bu eksende” sütunu, o eksenin bulduğu ve öteki dört eksenin hiçbirinin bulamadığı kusur sayısıdır.
- IE13 — Arayüzsüz kurullarda hiçbir inceleyen arayüz ekseni taşımaz; kalan dört eksen serbestçe dağıtılır ve kişi sayısı artırılabilir.
- IE14 — “On inceleyen, arayüzsüz” kurulunda dört eksenin her birine ikişer kişi ve ayrıca dördünü birden taşıyan iki kişi düşer; toplam on okuma yapılır.
- IE15 — Ölçüm hâlâ tek turludur. Arayüz kusurunun sonradan, çağıran kod kırıldığında bulunması bu tablonun dışındadır ve inceleme bulgusu sayılmaz.
Ölçüm
"""Arayuz ekseni: bir eksenin buldugunu baska eksen buluyor mu. Bolum 1 - bes tek eksenli okuma; kesisim ve yalniz kendi ekseninde gorunen. Bolum 2 - arayuz ekseni olan ve olmayan yapilandirmalar. """ 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 TAM = set(EKSENLER) d = degisiklik(600) tekil = {e: incele(d, {e}) for e in EKSENLER} print(f"{'eksen':<15s} {'bulunan':>7s} {'öteki dört eksende de':>21s} " f"{'yalnız bu eksende':>17s}") for e in EKSENLER: oteki = set().union(*(tekil[o] for o in EKSENLER if o != e)) print(f"{e:<15s} {len(tekil[e]):7d} {len(tekil[e] & oteki):21d} " f"{len(tekil[e] - oteki):17d}") birlesim = set().union(*tekil.values()) kesisim = sum(len(tekil[a] & tekil[b]) for a in EKSENLER for b in EKSENLER if a < b) print(f"beş tekil okumanın birleşimi {len(birlesim)}, " f"ikili kesişimlerin toplamı {kesisim}") print() DORT = TAM - {"arayuz"} KURULLAR = { "tek inceleyen, beş eksen": [TAM], "tek inceleyen, arayüzsüz": [DORT], "üç inceleyen, arayüz dahil": [{"arayuz"}, {"gerceklestirim"}, {"test", "belge"}], "üç inceleyen, arayüz yerine": [{"gerceklestirim"}, {"gerceklestirim"}, {"test", "belge"}], "on inceleyen, arayüzsüz": [{e} for e in sorted(DORT)] * 2 + [DORT] * 2, } print(f"{'kurul':<28s} {'inceleyen':>9s} {'bulunan':>7s} {'kaçan':>5s} " f"{'arayüz kaçan':>12s} {'yazılmayan kaçan':>16s}") for ad, atama in KURULLAR.items(): b = kurul(d, atama) kacan = [k for k in d["kusurlar"] if k["no"] not in b] ar = sum(1 for k in kacan if k["sinif"] == "arayuz") yaz = sum(1 for k in kacan if k["sinif"] == YAZILMAYAN) print(f"{ad:<28s} {len(atama):9d} {len(b):7d} {len(kacan):5d} " f"{ar:12d} {yaz:16d}")
eksen bulunan öteki dört eksende de yalnız bu eksende arayuz 3 0 3 gerceklestirim 6 0 6 test 3 0 3 belge 3 0 3 bicim 7 0 7 beş tekil okumanın birleşimi 22, ikili kesişimlerin toplamı 0 kurul inceleyen bulunan kaçan arayüz kaçan yazılmayan kaçan tek inceleyen, beş eksen 1 22 2 0 2 tek inceleyen, arayüzsüz 1 19 5 3 2 üç inceleyen, arayüz dahil 3 15 9 0 2 üç inceleyen, arayüz yerine 3 12 12 3 2 on inceleyen, arayüzsüz 10 19 5 3 2
Paylar Ayrık
Üst tablonun orta sütunu beş satırda da 0 veriyor ve ikili kesişimlerin toplamı da 0’dır. Beş eksenin hiçbiri ötekinin bulduğu tek bir kusuru bile bulmuyor.
Sağdaki sütun bunun aynadaki görüntüsü: her eksenin bulduğu kusurların tamamı yalnız o eksende görünüyor — arayüzde 3, gerçekleştirimde 6, testte 3, belgede 3, biçimde 7. Toplamları 22 ve bu, beş tekil okumanın birleşimine eşit. Yani bir eksenin katkısı, hangi eksenlerin zaten açık olduğundan bağımsızdır.
Ayrıklık, iki kusurun aynı dosyada ya da aynı satır aralığında bulunamayacağı anlamına gelmiyor; sınıfların ayrı olduğu anlamına geliyor. Aynı işlevin aynı satırında hem bir imza kusuru hem bir biçim kusuru durabilir ve kurgu bunları iki ayrı kusur olarak sayar. Aynı metni okuyan iki göz, aradıkları şey ayrı olduğu için ayrı şeyler bulur.
Bunun pratik karşılığı kesindir: bir eksen kapatıldığında kaybedilen kusur sayısı, o eksenin sınıfındaki kusur sayısıdır. Kapanan ekseni telafi eden bir kalıntı yoktur. Arayüz ekseni kapatılırsa üç kusur gider; başka eksenlere ne kadar okuma eklenirse eklensin o üçü geri getirmez. Alt tablo bu cümleyi sınıyor.
Arayüz Ekseni Kapatılınca
Alt tablonun ilk iki satırı ölçümün çekirdeği. Aynı tek inceleyen, aynı değişiklik, tek fark arayüz ekseninin açık olup olmaması: bulunan 22’den 19’a iniyor, kaçan 2’den 5’e çıkıyor ve fark tam olarak 3 arayüz kusuru. Kayıp, sınıfın büyüklüğü kadar.
Üçüncü ve dördüncü satır aynı ölçümü üç kişilik bir kurulda tekrarlıyor. Arayüz ekseni açıkken üç inceleyen 15 buluyor; arayüze bakan kişinin yerine ikinci bir gerçekleştirim okuması konduğunda 12’ye iniyor. Kişi sayısı değişmedi, okuma sayısı değişmedi, hatta ikinci gerçekleştirim okuması fazladan bir emek. Sonuç 3 kusur eksik. Aynı eksene ikinci kez bakmanın getirisi 0’dır ve bu ölçümde bedeli görünür hâle geliyor.
Son satır dersin en keskin sonucu. On inceleyen arayüz ekseni olmadan çalışıyor: dört eksenin her birine ikişer kişi, ayrıca dördünü birden okuyan iki kişi daha. Bulunan 19. Beş eksene bakan tek inceleyen 22 buluyor. On kişilik bir kurul, tek kişilik bir kuruldan 3 kusur az buluyor — ve fark, on kişinin hiçbirinin bakmadığı tek eksenden geliyor.
Dördüncü satırın yapılandırması uydurma değildir; bir incelemede kusur kaçtığında verilen ilk karar çoğu zaman bir inceleyen daha eklemektir. Eklenen kişiye hangi eksene bakacağı söylenmezse, en tanıdık eksene bakar — gerçekleştirime. Tablo o kararın sayısal sonucunu veriyor: kurul büyüdü, okuma sayısı arttı, bulunan sayı 15’ten 12’ye indi. Sayının düşmesinin nedeni yeni kişinin bir şeyi bozması değil, yerine geçtiği okumanın başka bir eksende olmasıdır.
Aradaki fark 3/24, yani 0,125’tir; kümenin çözünürlüğü 1/24 = 0,042 olduğuna göre bu farkın üç katıdır ve ölçüm bandının içindedir. Sayının küçüklüğü aldatıcı olabilir: kaçan üç kusurun her biri, değişikliğin dışındaki kodu kıran bir sözleşme bozulmasıdır ve incelemenin bulamadığı yerde ancak çağıran taraf kırıldığında görünür.
Ekseni açmanın ucuz bir yolu vardır ve tabloda görünmez: arayüz ekseni, değişikliğin tamamını yeniden okumadan da açılabilir. Genel bildirimlerin geçtiği satırlar değişikliğin küçük bir parçasıdır ve önce onlara bakan bir okuma, arayüz sınıfının üç kusurunu ötekilerden önce görür. Eksen açmak her zaman kurula bir kişi eklemek değildir; bazen yalnız okuma sırasını değiştirmektir. Kurgu bu ayrımı ölçmez — eksen ya açıktır ya kapalıdır — ama tablonun söylediği ikisi için de aynıdır: kapalı bir ekseni telafi eden bir kişi sayısı yoktur.
Sözleşmenin Yazılmamış Yanı
Arayüz ekseni sözleşmenin yazılmış hâlini karşılaştırır. İmza, dönüş türü ve hata sınıfı metindir ve metin okunabilir. Sözleşmenin bir de yazılmamış yanı vardır: çağıran tarafın güvendiği ama hiçbir yerde belirtilmemiş davranışlar — çağrının yinelenmesinin güvenli olup olmadığı, dönen listenin sırasının kararlı olup olmadığı, aynı girdiye aynı yanıtın verilip verilmeyeceği.
Bu davranışlar bozulduğunda arayüz ekseni bir iz bulamaz, çünkü karşılaştırılacak bir önceki metin yoktur. Kurgudaki karşılığı doğrudandır: böyle bir kusur arayüz sınıfına değil, altıncı sınıfa — eksik gereksinim sınıfına — düşer ve arayüz ekseni açık olsa bile kaçmaya devam eder. Alt tablonun son sütununun beş satırda da 2 vermesinin nedeni budur.
Ayrım tek bir soruya iner: bozulan şey bir yerde yazılı mı? Yazılıysa arayüz ekseninin işidir ve eksen açıldığında bulunur. Yazılı değilse hiçbir eksenin işi değildir ve incelemenin dışında, sözleşmenin yazıldığı yerde kapatılır.
Özet
- Genel arayüz, dışarıdan çağrılabilen adların ve davranışlarının kümesidir; sözleşmesi beş ayrı biçimde bozulabilir ve bunların üçü çağıran kodu kırmadan yanlış çalıştırır.
- Arayüz kusurunun izi değişikliğin içinde tek bir satırdır, sonucu ise değişikliğin dışındadır; bu yüzden imzanın önceki hâliyle karşılaştırılmasını gerektirir.
- Beş eksenin bulduğu kümeler ayrıktır: ikili kesişimlerin toplamı 0, her eksenin bulduğunun tamamı yalnız o eksende görünür ve beşinin birleşimi 22’dir.
- Bir eksen kapatıldığında kaybedilen kusur, o sınıfın büyüklüğü kadardır: arayüz ekseni kapatılınca bulunan 22’den 19’a iner, kaçan 2’den 5’e çıkar.
- Arayüze bakan kişinin yerine ikinci bir gerçekleştirim okuması konduğunda üç kişilik kurul 15 yerine 12 buluyor; arayüzsüz on inceleyen ise 19 ile beş eksene bakan tek inceleyenin 22’sinin altında kalıyor.
- Sözleşmenin yazılmamış yanı bozulduğunda arayüz ekseninin karşılaştıracağı metin yoktur; bu kusur altıncı sınıfa düşer ve eksen açık olsa bile kaçar.
Sonraki Adım
Tabloda en büyük tekil payı gerçekleştirim ekseni taşıyor: 6 kusur, 24’ün 0,250’si. Arayüz ekseninin bulgusu imzanın karşılaştırılmasıyla çıkıyordu; gerçekleştirim ekseninin bulgusu için karşılaştırılacak bir önceki hâl yoktur — kodun ne yapması gerektiği ile ne yaptığı arasındaki farka bakılır. Sonraki ders bu ekseni ölçer: eksenler tek tek açıldığında bulunan sayı hangi eğriyle büyür, gerçekleştirim ekseninin kendi payı bu eğrinin neresinde durur ve tek başına en çok bulan eksen olması onu ne kadar yeterli kılar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.