Ders 04 / 10
Kullanım Senaryosu Diyagramları
Aktör, senaryo ve sistem sınırı gösteriminin taşıdığı olgu ile attığı olgunun ayrı ayrı sayılması: bilerek atılan yedi iç adım, farkında olmadan düşen iki bağ ve aynı diyagrama düşen 512 sistem.
İçindekiler
Önceki konu bir sistemin durağan yanını ölçtü: hangi sınıf hangisine bağlı, bağ hangi yöne gidiyor, aynı sınıf kümesi kaç ayrı bileşen bölüntüsüne düşüyor. Sorulan her soru sistemin çalışmadığı andaki hâline bakıyordu.
Bu konu sistemin çalıştığı ana bakıyor: kim neyi başlatıyor, iletiler hangi sırayla gidiyor, işler hangi sırayla yapılabiliyor, bir nesne hangi durumlardan geçiyor. Dört davranış gösteriminin ilki, dördünün içinde en az bilgi taşıyanıdır — ve bu bir kusur değildir. Kullanım senaryosu gösterimi sistemin içini bilerek boşaltır. Bu dersin işi o boşluğu saymaktır, çünkü sayılmadıkça bir boşluğun bilerek mi bırakıldığı yoksa gözden mi kaçtığı bilinemez.
Dersin sorusu, diyagram türünün hangi soruya uyduğu değildir; o ölçüm Yazılım Mimarlığı müfredatının Mimari Dokümantasyon kursunda on sekiz soruluk bir küme üzerinde yapıldı ve burada tekrarlanmıyor. Buradaki soru tür seçildikten sonra başlar: seçilen tür kaç ayrı sistemi birbirinden ayırt edemiyor.
Gösterimin Taşıdığı Dört Alan
Kullanım senaryosu gösterimi dört tür bilgi taşır: aktör, senaryo, aktörü senaryoya bağlayan bağ, ve neyin sistemin işi neyin komşusunun işi olduğunu söyleyen sistem sınırı. Listenin tamamı budur. Sıra yoktur, koşul yoktur, iç adım yoktur, veri yoktur.
Bakım atölyesinde bu dört alanın karşılığı şudur. İki aktör var: müşteri ve kabul görevlisi. Üç dış olgu var: iş emri açma, durum sorma, teslim alma. Üçü de sistemin dışından başlatılır ve üçü de atölyenin kendi işidir — sınırın söylediği şey budur, ve bu üç sahiplik kararı üç ayrı olgudur. Buna karşılık sistemin içinde yedi iç adım dönüyor — stok ayırma, usta atama, tezgâh ayırma, kalem işleme, belge üretme, maliyet hesabı, kayıt tutma — ve bunların hiçbirini bir aktör başlatmaz.
Toplam 20 olgu: 2 aktör, 3 senaryo, 5 aktör–senaryo bağı, 3 sahiplik, 7 iç adım.
Diyagramın Kurulması ve Sayılması
Aşağıdaki model diyagramı çizmez; diyagramın taşıdığı alanların listesini kurar ve o listeyi üreten kaç ayrı sistem olduğunu tam sayımla bulur. Gerçek bağ kümesi beş bağdır (DD1); çizilmiş diyagram bunların üçünü yazıyor (DD2).
"""Kullanim senaryosu gosterimi: bilerek atilan olgu ile farkinda olmadan dusen olgu ayri ayri sayilir. Sayim tam sayimdir , tahmin degildir.""" from itertools import product IC_OLGULAR = ["stok ayirma", "usta atama", "tezgah ayirma", "kalem isleme", "belge uretme", "maliyet hesabi", "kayit tutma"] DIS_OLGULAR = ["is emri acma", "durum sorma", "teslim alma"] # DD1: atolyenin gercek aktor-senaryo baglari ve her senaryonun sahibi AKTORLER = ["Musteri", "KabulGorevlisi"] GERCEK_BAGLAR = [("Musteri", "is emri acma"), ("Musteri", "durum sorma"), ("Musteri", "teslim alma"), ("KabulGorevlisi", "is emri acma"), ("KabulGorevlisi", "teslim alma")] GERCEK_SAHIP = {s: "sistem" for s in DIS_OLGULAR} # ucu de atolyenin isi # DD2: cizilmis diyagram bes bagin ucunu yaziyor CIZILEN = [("Musteri", "is emri acma"), ("Musteri", "durum sorma"), ("Musteri", "teslim alma")] def gosterim(baglar, ic, sahip, cizilen_bag, cizilen_ic=(), sinir=True): """Gosterim yalnizca sunu tasir: aktor , senaryo , aktor-senaryo bagi , sistem siniri. Cizilmemis bag ve ic adim gosterime hic cikmaz; sinir cizilmezse senaryonun sistemin isi mi komsunun isi mi oldugu yazilmaz.""" return (tuple(AKTORLER), tuple(DIS_OLGULAR) + tuple(sorted(i for i in ic if i in cizilen_ic)), tuple(sorted(b for b in baglar if b in cizilen_bag)), tuple(sahip[s] for s in DIS_OLGULAR) if sinir else None) def simge(cizilen_bag, cizilen_ic=(), sinir=True): return (len(AKTORLER) + len(DIS_OLGULAR) + len(cizilen_bag) + (1 if sinir else 0) + 2 * len(cizilen_ic)) def ayni_gosterime_dusen(cizilen_bag, cizilen_ic=(), sinir=True): """Ayni diyagrami ureten kac ayri sistem var: tam sayim.""" hedef = gosterim(GERCEK_BAGLAR, IC_OLGULAR, GERCEK_SAHIP, cizilen_bag, cizilen_ic, sinir) sayi = 0 for bm in product((0, 1), repeat=len(GERCEK_BAGLAR)): baglar = [b for b, m in zip(GERCEK_BAGLAR, bm) if m] for im in product((0, 1), repeat=len(IC_OLGULAR)): ic = [i for i, m in zip(IC_OLGULAR, im) if m] for sm in product(("sistem", "komsu"), repeat=len(DIS_OLGULAR)): sahip = dict(zip(DIS_OLGULAR, sm)) if gosterim(baglar, ic, sahip, cizilen_bag, cizilen_ic, sinir) == hedef: sayi += 1 return sayi olgu = (len(AKTORLER) + len(DIS_OLGULAR) + len(GERCEK_BAGLAR) + len(DIS_OLGULAR) + len(IC_OLGULAR)) print("SISTEM :", olgu, "olgu =", len(AKTORLER), "aktor +", len(DIS_OLGULAR), "senaryo +", len(GERCEK_BAGLAR), "bag +", len(DIS_OLGULAR), "sahiplik +", len(IC_OLGULAR), "ic adim") print("GOSTERIM:", simge(CIZILEN), "simge") print("BEDEL :", ayni_gosterime_dusen(CIZILEN), "sistem ayni diyagrama dusuyor") print() print(" bilerek atilan (gosterim tasiyamaz) :", len(IC_OLGULAR), "ic adim") print(" farkinda olmadan dusen (tasinabilirdi):", len([b for b in GERCEK_BAGLAR if b not in CIZILEN]), "bag") for b in GERCEK_BAGLAR: if b not in CIZILEN: print(" yazilmamis:", b[0], "->", b[1]) print(" cizilen diyagram : simge", simge(CIZILEN), "| dusen", ayni_gosterime_dusen(CIZILEN)) print(" bes bagin besi yazilsa : simge", simge(GERCEK_BAGLAR), "| dusen", ayni_gosterime_dusen(GERCEK_BAGLAR), "<- gosterimin TABANI") print() print("alan dusurulunce taban ne oluyor") print("alan kumesi simge dusen tasidigi bit") TABAN = ayni_gosterime_dusen(GERCEK_BAGLAR) for ad, bag, sinir in (("aktor+senaryo+bag+sinir", GERCEK_BAGLAR, True), ("bag dusurulur", [], True), ("sinir dusurulur", GERCEK_BAGLAR, False), ("ikisi de dusurulur", [], False)): d = ayni_gosterime_dusen(bag, (), sinir) print(f"{ad:26s} {simge(bag, (), sinir):5d} {d:6d} {(d // TABAN).bit_length() - 1:12d}") print() # DD3: ikinci yapilandirma. Iki ic adim "dahil edilen senaryo" olarak cizilir. EK = ("belge uretme", "maliyet hesabi") print("iki ic adim dahil edilen senaryo olarak cizilirse:") print(" simge", simge(GERCEK_BAGLAR), "->", simge(GERCEK_BAGLAR, EK), "| dusen", TABAN, "->", ayni_gosterime_dusen(GERCEK_BAGLAR, EK)) print(" bedel: aktoru olmayan senaryo sayisi 0 ->", len(EK), "| dis olgu orani", f"{len(DIS_OLGULAR)}/{len(DIS_OLGULAR)}", "->", f"{len(DIS_OLGULAR)}/{len(DIS_OLGULAR) + len(EK)}") # DD4: iki aktor tek bir rolde birlestirilirse OLASI = [(a, s) for a in AKTORLER for s in DIS_OLGULAR] def birlesik(baglar, ic, sahip): """Tek aktorlu diyagram: senaryo basina yalnizca 'bagli bir aktor var mi'.""" return (("Kullanici",), tuple(DIS_OLGULAR), tuple(any(b[1] == s for b in baglar) for s in DIS_OLGULAR), tuple(sahip[s] for s in DIS_OLGULAR)) hedef = birlesik(GERCEK_BAGLAR, IC_OLGULAR, GERCEK_SAHIP) sayi = 0 for bm in product((0, 1), repeat=len(OLASI)): baglar = [b for b, m in zip(OLASI, bm) if m] for im in product((0, 1), repeat=len(IC_OLGULAR)): ic = [i for i, m in zip(IC_OLGULAR, im) if m] if birlesik(baglar, ic, GERCEK_SAHIP) == hedef: sayi += 1 print() print("iki aktor tek rolde birlestirilirse:") print(" simge", simge(GERCEK_BAGLAR), "-> 8 | dusen", TABAN, "->", sayi, "| oran", sayi // TABAN, "kat")
SISTEM : 20 olgu = 2 aktor + 3 senaryo + 5 bag + 3 sahiplik + 7 ic adim
GOSTERIM: 9 simge
BEDEL : 512 sistem ayni diyagrama dusuyor
bilerek atilan (gosterim tasiyamaz) : 7 ic adim
farkinda olmadan dusen (tasinabilirdi): 2 bag
yazilmamis: KabulGorevlisi -> is emri acma
yazilmamis: KabulGorevlisi -> teslim alma
cizilen diyagram : simge 9 | dusen 512
bes bagin besi yazilsa : simge 11 | dusen 128 <- gosterimin TABANI
alan dusurulunce taban ne oluyor
alan kumesi simge dusen tasidigi bit
aktor+senaryo+bag+sinir 11 128 0
bag dusurulur 6 4096 5
sinir dusurulur 10 1024 3
ikisi de dusurulur 5 32768 8
iki ic adim dahil edilen senaryo olarak cizilirse:
simge 11 -> 15 | dusen 128 -> 32
bedel: aktoru olmayan senaryo sayisi 0 -> 2 | dis olgu orani 3/3 -> 3/5
iki aktor tek rolde birlestirilirse:
simge 11 -> 8 | dusen 128 -> 3456 | oran 27 kat
Üç sayı yan yana duruyor: sistem 20 olgu, gösterim 9 simge, bedel 512 sistem. Beş yüz on iki ayrı bakım atölyesi bu diyagramla aynı görünüyor; diyagrama bakan biri hangisine baktığını bilemez.
İki Ayrı Kayıp
Beş yüz on iki sayısı iki farklı kaynaktan geliyor ve ayrılmadıkları sürece hiçbir işe yaramazlar.
Bilerek atılan olgu. Yedi iç adımın hiçbiri gösterimin bilgi kümesinde yer bulmuyor. Kullanım senaryosu gösteriminde iç adımı yazacak bir alan yoktur; olsaydı da yazılmazdı, çünkü bu gösterimin varlık nedeni sistemin içini kapatıp dışını göstermektir. Bu kayıp çizeni değil türü bağlar: her kullanım senaryosu diyagramı bu yedi olguyu atar, ne kadar dikkatli çizilirse çizilsin.
Farkında olmadan düşen olgu. Kabul görevlisinin iki bağı gösterimin taşıyabileceği türdendi — aktör–senaryo bağı, listenin üçüncü kalemi. Yazılmadılar. Bu kayıp türü değil çizeni bağlar ve başka bir diyagram çizmeye gerek kalmadan düzeltilebilir.
İkisi arasındaki fark, diyagrama bakarak görülemez. Okur her iki durumda da aynı şeyi görür: orada olmayan bir bilgi. Bir bilginin kasıtla mı yoksa dikkatsizlikle mi yok olduğu, ancak sistemin kendisi elde tutulup gösterimle karşılaştırıldığında ortaya çıkar. Bu yüzden kayıp sayılmadıkça amaç olduğu bilinemez; sayılmamış bir boşluk savunulmuş bir boşluk değildir, yalnız görülmemiş bir boşluktur.
Taban Belirsizlik Türle Gelir
İki bağ yazıldığında belirsizlik 512’den 128’e iniyor: dört kat. Bu düşüşün tamamı çizenin hesabına yazılır, çünkü ödenen bedel yalnız iki simgedir — 9 simge 11 oluyor.
Yüz yirmi sekiz sayısı ise oradan aşağı inmiyor. Bu, kullanım senaryosu gösteriminin taban belirsizliğidir: yedi iç adımın her biri sistemde ya vardır ya yoktur, gösterim hiçbirini yazmaz, dolayısıyla ayrı sistem aynı diyagrama düşer. Taban çizim ustalığıyla değişmeyen bir sayıdır; türle birlikte gelir.
Bir gösterim değerlendirilirken bakılacak iki sayı budur. Taban, seçilen türün ne kadarını göstermeyi baştan reddettiğini söyler. Taban ile gerçek belirsizlik arasındaki fark, çizenin ne kadarını gereksiz yere kaybettiğini söyler. İlki bir tasarım kararıdır, ikincisi bir kusurdur, ve tek bir sayıyla anıldıklarında ayırt edilemezler.
Bir Simge Her Zaman Bir Bit Değildir
Orta tablo alanları teker teker düşürüp tabanın nereye çıktığını ölçüyor. Beş bağ simgesi düşürülünce taban 128’den 4096’ya çıkıyor: beş simge 5 bit taşıyormuş. Bağ başına tam bir bit, çünkü her bağ sistemde ya vardır ya yoktur.
Sınır ise böyle davranmıyor. Tek bir sınır simgesi düşürüldüğünde taban 128’den 1024’e çıkıyor — bir simge 3 bit taşıyor. Nedeni şu: sınır tek bir olguyu değil, üç senaryonun üçünün birden sahipliğini söylüyor. Sınır çizilmemiş bir diyagramda okur, iş emri açmanın atölyenin işi mi yoksa komşu bir sistemin işi mi olduğunu bilemez; üç senaryo için üç ayrı bilinmeyen kalır.
Bu, yapı gösteriminde ölçülen orandan farklıdır: orada eklenen her simge tam olarak bir bit belirsizlik alıyordu, çünkü her simge tek bir ikili alanı yazıyordu. Kullanım senaryosu gösteriminde bir simgenin taşıdığı bit sayısı, o simgenin kaç olguyu birden sabitlediğine bağlıdır. İkisi düşürüldüğünde taban 32768’e çıkıyor ve gösterim 5 simgeye iniyor: kalan diyagram iki aktör ve üç senaryo adından ibarettir, ve 8 bit bilgi kaybetmiştir. Buradan çıkan kural, simge saymanın tek başına bir ölçü olmadığıdır; sayılacak şey simge değil, simgenin sabitlediği olgudur.
Rolleri Birleştirmenin Sayısı
Aynı ölçü ters yönde de işler. Müşteri ile kabul görevlisi tek bir kullanıcı rolünde birleştirilirse (DD4) diyagram sadeleşir: 11 simge 8’e iner, bağ sayısı beşten üçe düşer, çizim küçülür. Belirsizlik ise 128’den 3456’ya çıkıyor — 27 kat.
Yirmi yedi sayısı doğrudan okunabilir. Tek aktörlü diyagram her senaryo için yalnız “bir kullanıcı buna bağlıdır” diyor; hangi rolün bağlı olduğunu söylemiyor. Üç senaryonun her biri için iki rolden en az birinin bağlı olması gerekiyor, bu da senaryo başına olasılık, üç senaryo için demektir. Yedi iç adımın 128’i ile çarpılınca 3456 çıkıyor.
Burada rolleri ayrı tutmanın gerekçesi bir üslup tercihi değil, ölçülmüş bir bilgi miktarıdır. Üç simge tasarruf edildi ve karşılığında yaklaşık 4,75 bit bilgi verildi. Bir gösterim sadeleştirilirken sorulacak soru, çizimin daha temiz görünüp görünmediği değil, hangi olguların ayırt edilemez hâle geldiğidir.
İç Adımı Gösterime Sokmak
Belirsizliği tabanın altına indirmenin tek bir yolu var: taşınmayan olguyu taşınır kılmak. Belge üretme ile maliyet hesabı, senaryonun içine dâhil edilen ikinci düzey senaryolar olarak çizilebilir (DD3). Sayı hemen düşüyor: taban 128’den 32’ye iniyor, iki bit kazanılıyor, gösterim 11 simgeden 15’e çıkıyor.
Bedel simge sayısı değil. Yeni çizilen iki senaryonun hiçbir aktör bağı yok — hiçbir aktör onları başlatmıyor, çünkü ikisi de sistemin kendi işidir. Aktörü olmayan senaryo sayısı 0’dan 2’ye çıkıyor. Diyagramdaki dış olgu oranı 3/3’ten 3/5’e düşüyor: gösterimin beş senaryosundan yalnız üçü sistemin dışından başlatılıyor.
Bunun anlamı şudur: sistem sınırı artık bir şey ayırmıyor. Sınırın taşıdığı bilgi, “içerisi kapalıdır, dışarısı bu üç kapıdan girer” bilgisiydi; iç adımlar kapının aynı tarafına taşınınca o bilgi geçersizleşiyor. Belirsizlik dört kat azaldı, ama gösterimin söylediği şey değişti — artık dışarıdan görünen yüzü değil, işin bir kısmını anlatıyor. Kazanç 2 bittir ve sayılabilir; kayıp bir alanın anlamıdır ve ancak fark edildiğinde sayılabilir.
Özet
- Kullanım senaryosu gösterimi dört alan taşır: aktör, senaryo, aktör–senaryo bağı, sistem sınırı. Sıra, koşul, iç adım ve veri bu listede yoktur.
- Atölyenin 20 olgusundan (2 aktör, 3 senaryo, 5 bağ, 3 sahiplik, 7 iç adım) çizilen diyagram 9 simge yazıyor ve 512 ayrı sistem aynı diyagrama düşüyor.
- Beş yüz on iki iki kaynaktan gelir: gösterimin taşıyamadığı 7 iç adım ve gösterimin taşıyabileceği hâlde yazılmamış 2 bağ. İkisi diyagrama bakarak ayırt edilemez.
- Eksik iki bağ yazılınca belirsizlik 128’e iner; 128 gösterimin taban belirsizliğidir, türle birlikte gelir ve çizim ustalığıyla değişmez.
- Beş bağ simgesi 5 bit, tek sınır simgesi 3 bit taşıyor: bir simgenin taşıdığı bit, o simgenin kaç olguyu birden sabitlediğine bağlıdır.
- İki aktörü tek rolde birleştirmek 11 simgeyi 8’e indiriyor ama belirsizliği 128’den 3456’ya çıkarıyor: 27 kat. İki iç adımı dâhil edilen senaryo olarak çizmek tabanı 32’ye indiriyor ama aktörü olmayan senaryo sayısını 0’dan 2’ye çıkarıyor ve dış olgu oranını 3/3’ten 3/5’e düşürüyor.
Sonraki Adım
Kullanım senaryosu gösterimi sistemin içini bilerek kapattı ve bunun bedeli sayıldı. Sonraki gösterim tam tersini yapıyor: kapağı kaldırıp içeriyi, iletileri zaman eksenine dizerek gösteriyor. İlk bakışta bu, kaybı sıfırlayan bir seçim gibi görünür — her ileti, her katılımcı, her sıra numarası yazılıdır.
Sonraki ders bunun neden yanlış bir okuma olduğunu ölçer. Atölyenin akışı, ayırmanın iki dalı, usta bulunmasının iki dalı, değişken kalem sayısı ve isteğe bağlı belge üretimi yüzünden 24 ayrı iz üretiyor. Bir sıra diyagramı tanımı gereği tek bir izdir; kapsamı 1/24, yani 0,0417. Dört diyagram 0,1667 yapar. Ders koşullu dal ve döngü gösterimlerinin bu oranı nereye taşıdığını, ve oranı 1,0’a çıkarmanın hangi bedelle geldiğini sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.