Yapısal modelleme: CRC kartları, class ve object diyagramları
Sınıfları metinden çıkarma, CRC kartı, class diagram'da attribute, operation, association, multiplicity, aggregation, composition, generalization ve object diagram. Vizenin en çok puanlı çizim sorusu.
Yapısal model (structural model), sistemin hangi veriyi tuttuğunu ve bu verilerin birbirine nasıl bağlı olduğunu gösterir. Use case “ne yapılıyor” sorusunu, yapısal model “neyle yapılıyor” sorusunu cevaplar. Bu haftanın sınav sorusu neredeyse hep aynı: bir senaryo verilir, sınıfları, attribute’ları, ilişkileri ve multiplicity’leri içeren bir class diagram çizmen istenir. Puan kaybı multiplicity’yi ters uca yazmaktan ve aggregation ile composition’ı karıştırmaktan gelir.
Altın kurallar:
- İsim → sınıf veya attribute, fiil → operation veya ilişki.
- Multiplicity karşı uçtan okunur. “Bir A’nın kaç B’si var?” cevabı B ucuna yazılır.
- Elmas bütün tarafındadır. Boş: parça bağımsız (aggregation). Dolu: parça bütünle ölür (composition).
- Üçgen üst sınıftadır. Ok alt sınıftan çıkar.
Yapısal modelin öğeleri
| Öğe | Anlamı | Örnek |
|---|---|---|
| Class | Aynı türden nesnelerin şablonu | Student, Book |
| Object | Sınıfın bir örneği | ayse : Student |
| Attribute | Sınıfın tuttuğu veri | studentNo, title |
| Operation | Sınıfın yaptığı iş | reserve(), calculateFine() |
| Association | Sınıflar arası ilişki | Student “makes” Reservation |
| Multiplicity | Kaç tane | 1, 0.., 1.. |
Analiz aşamasında model iş dünyasını anlatır (problem domain): veritabanı tablosu, Java tipi ya da getter/setter ayrıntısı henüz yoktur.
Sınıfları bulmak
Metin analizi (textual analysis)
Use case description’lardaki kelimelere bak:
| Kelime türü | Neye dönüşür | Örnek |
|---|---|---|
| Özel isim (common noun) | Sınıf | öğrenci, kitap, rezervasyon |
| Özel ad (proper noun) | Nesne | “Merkez Şube” |
| Sıfat, değer | Attribute | başlık, son tarih, tutar |
| Eylem fiili (doing verb) | Operation | rezerve eder, hesaplar |
| “Sahiptir”, “içerir” | İlişki (aggregation/composition) | sipariş satırlardan oluşur |
| “Bir türüdür” | Generalization | öğrenci bir kişidir |
Diğer yollar: brainstorming (ekip olarak aday sınıfları sırala), ortak nesne listeleri (fiziksel şeyler, olaylar, roller, yerler), patterns (sipariş-sipariş satırı, rezervasyon gibi hazır kalıplar).
CRC kartları
CRC (Class-Responsibility-Collaboration) kartı, her sınıf için bir kartta sorumlulukları ve iş birliği yaptığı sınıfları gösterir.
+---------------------------------------+
| Class: Reservation ID: 4 |
| Type: Concrete, domain |
+---------------------------------------+
| Responsibilities | Collaborators |
|--------------------+------------------|
| Bilmek: | |
| kod, tarih, | |
| bitiş zamanı | |
| Yapmak: | |
| süresi dolmuş mu | |
| kontrol et | |
| kopyayı ayır | Copy |
| öğrenciye bildir | Student |
+---------------------------------------+
Arka yüz: attribute'lar (code, createdAt,
expiresAt), ilişkiler (Student, Copy)
Sorumluluklar iki türdür: knowing (bildiği veri) ve doing (yaptığı iş). Bir sorumluluğu tek başına yapamayan sınıf, iş birliği yaptığı sınıfı sağ tarafa yazar. Role-playing: ekip üyeleri kartları eline alıp bir use case’i adım adım canlandırır; eksik sorumluluk ya da sınıf hemen ortaya çıkar.
Class diagram
Sınıf kutusu
+---------------------------+
| Student |
+---------------------------+
| -studentNo : String |
| -name : String |
| -birthDate : Date |
| -/age : int |
+---------------------------+
| +reserve(c : Copy) : Bool |
| +getActiveCount() : int |
+---------------------------+
| Kısım | Söz dizimi | Örnek |
|---|---|---|
| Attribute | görünürlük ad : tip | -name : String |
| Derived attribute | / ile | -/age : int |
| Operation | görünürlük ad(parametre : tip) : dönüş | +reserve(c : Copy) : Bool |
| Görünürlük | + public, - private, # protected, ~ package |
Operation türleri: constructor (nesne oluşturur), query (durumu değiştirmeden bilgi döner, ör. getActiveCount), update (durumu değiştirir, ör. reserve).
Association ve multiplicity
Association iki sınıf arasında düz çizgidir. Üstüne bir ad (makes, contains) ve okuma yönü yazılabilir. Her uca o uçtaki sınıftan kaç nesne olabileceği yazılır.
| Gösterim | Anlamı |
|---|---|
1 | Tam olarak bir |
0..1 | Sıfır ya da bir |
0..* ya da * | Sıfır ya da daha çok |
1..* | En az bir |
2..5 | 2 ile 5 arası |
3 | Tam olarak üç |
Okuma yöntemi: “Bir Student’ın kaç Reservation’ı var?” → 0..3 → Reservation ucuna yazılır. “Bir Reservation’ın kaç Student’ı var?” → 1 → Student ucuna yazılır.
+---------+ 1 makes > 0..3 +-------------+
| Student |---------------------| Reservation |
+---------+ +-------------+
TUZAK · multiplicity’yi kendi ucuna yazmak. “Bir öğrencinin en fazla 3 rezervasyonu olur” cümlesindeki 3, Student’ın yanına değil Reservation’ın yanına yazılır. Her seferinde “bir X’in kaç Y’si var?” diye sor ve cevabı Y’nin yanına yaz.
Association class
İlişkinin kendisine ait veri varsa kullanılır. Öğrenci ve ders çok-çok ilişkili; not (grade) ne öğrenciye ne derse aittir.
+---------+ * * +--------+
| Student |--------------| Course |
+---------+ : +--------+
:
+------------+
| Enrollment |
+------------+
| grade |
| semester |
+------------+
Aggregation ve composition
İkisi de bütün-parça (part-of) ilişkisidir.
| Aggregation | Composition | |
|---|---|---|
| Sembol | Boş elmas, bütün tarafında | Dolu elmas, bütün tarafında |
| Parça bağımsız yaşar mı | Evet | Hayır, bütünle yok olur |
| Parça birden çok bütüne ait olabilir mi | Olabilir | Hayır, tek bütün |
| Örnek | Team <>- Player, Branch <>- Copy | Order <#>- OrderLine, Building <#>- Room |
+-------+ 1 1..* +-----------+
| Order |<#>------------| OrderLine |
+-------+ +-----------+
(<#> = dolu elmas, Order silinirse satırlar da gider)
+--------+ 1 0..* +--------+
| Branch |<>------------| Copy |
+--------+ +--------+
(<> = boş elmas, şube kapanırsa kopya başka şubeye geçer)
Generalization
“Is-a-kind-of” ilişkisi. Alt sınıf (subclass) üst sınıfın (superclass) attribute ve operation’larını miras alır, kendine özgü olanları ekler.
+----------+
| Person | (abstract, italik)
+----------+
| -name |
| -email |
+----------+
/_\
|
+-------+-------+
| |
+-----------+ +-------------+
| Student | | Librarian |
+-----------+ +-------------+
| -studentNo| | -staffNo |
+-----------+ +-------------+
Abstract class doğrudan nesnesi olmayan sınıftır (kimse sadece “Person” değildir). Concrete class nesnesi olan sınıftır.
TUZAK · generalization ile aggregation karışması. “Öğrenci bir kişidir” → generalization. “Şube kopyalara sahiptir” → aggregation. Sor: “is a kind of” mi, “has a / is part of” mı?
Çözümlü örnek: kampüs kütüphanesi class diagram
Senaryo: “Kütüphanenin birden çok şubesi var. Her kitabın bir ya da daha çok fiziksel kopyası vardır ve her kopya bir şubede durur. Öğrenciler kopyaları ödünç alır; bir ödünç kaydı tek bir öğrenci ve tek bir kopya içindir. Öğrenci aynı anda en fazla 3 rezervasyon yapabilir; bir rezervasyon tek bir kopyayı tutar. Öğrenciler ve kütüphaneciler kişidir; her ikisinin adı ve e-postası tutulur.”
Adım 1: Sınıflar. Branch, Book, Copy, Student, Librarian, Person, Loan, Reservation.
Adım 2: Attribute ve operation.
| Sınıf | Attribute | Operation |
|---|---|---|
| Person (abstract) | name, email | |
| Student | studentNo | +reserve(c : Copy) |
| Librarian | staffNo | +confirmReturn(l : Loan) |
| Book | isbn, title, author | +availableCopies() : int |
| Copy | barcode, status | +setStatus(s : String) |
| Branch | name, address | |
| Loan | loanDate, dueDate, returnDate, /fine | +calculateFine() : Money |
| Reservation | code, createdAt, expiresAt | +isExpired() : Bool |
Adım 3: İlişkiler ve multiplicity.
| İlişki | Tür | Uç 1 | Uç 2 |
|---|---|---|---|
| Book - Copy | Association | Book 1 | Copy 1..* |
| Branch - Copy | Aggregation (Branch bütün) | Branch 1 | Copy 0..* |
| Student - Loan | Association | Student 1 | Loan 0..* |
| Copy - Loan | Association | Copy 1 | Loan 0..* |
| Student - Reservation | Association | Student 1 | Reservation 0..3 |
| Reservation - Copy | Association | Reservation 0..1 | Copy 1 |
| Student, Librarian - Person | Generalization |
Reservation - Copy satırını oku: bir Reservation tam olarak bir Copy tutar (Copy ucunda 1). Bir Copy aynı anda en fazla bir rezervasyonda olabilir (Reservation ucunda 0..1).
Adım 4: Çizim (özet).
Student 1 -------- 0..3 Reservation
Reservation 0..1 ----- 1 Copy
Student 1 -------- 0..* Loan
Copy 1 -------- 0..* Loan
Book 1 -------- 1..* Copy
Branch 1 <>------ 0..* Copy
Student ---|> Person {abstract}
Librarian ---|> Person {abstract}
Her satır bir ilişki: soldaki sayı soldaki sınıfın ucuna, sağdaki sayı sağdaki sınıfın ucuna yazılır. Sınavda bunu kutularla çizersin; önemli olan her uçtaki multiplicity’nin doğru tarafta olması.
Object diagram
Object diagram, belirli bir anda sistemdeki nesneleri ve aralarındaki bağlantıları (link) gösterir. Class diagram’ın bir “fotoğrafı”dır. Nesne adı ad : Sınıf biçiminde, altı çizili yazılır; attribute’lar gerçek değerleriyle gösterilir. Multiplicity yazılmaz.
+------------------+ +------------------+
| ayse : Student |-----| r1 : Reservation |
| studentNo="2041" | | code="R-118" |
+------------------+ +------------------+
| |
| +------------------+
| | c7 : Copy |
| | status="On Hold" |
| +------------------+
+------------------+ +------------------+
| r2 : Reservation |-----| c9 : Copy |
| code="R-131" | | status="On Hold" |
+------------------+ +------------------+
Burada 5 nesne (ayse, r1, r2, c7, c9) ve 4 link var: ayse-r1, ayse-r2, r1-c7, r2-c9. Object diagram, multiplicity’leri test etmenin iyi yoludur: Ayşe’ye dördüncü bir rezervasyon eklemeye çalışırsan class diagram’daki 0..3 kuralını ihlal edersin.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| Multiplicity kendi ucuna yazılır | Karşı uçtan okunur: “bir A’nın kaç B’si” → B ucuna |
| Elmas parça tarafında | Elmas bütün tarafında |
| Composition’da parça başka bütüne geçebilir | Geçemez, bütünle yok olur |
| Generalization oku üstten alta | Alttan üste, üçgen üst sınıfta |
| Her isim bir sınıftır | Bazıları attribute (tarih, tutar) ya da gereksiz (sistem, ekran) |
| İlişkiye ait veriyi bir uca koymak | Association class kullan |
| Object diagram’da multiplicity yazmak | Link’ler tekildir, multiplicity yok |
| Analizde getter/setter yazmak | Analizde yazılmaz; tasarım ayrıntısıdır |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Read the association: Customer 1 ---- 0..* Order. How many orders can one customer have, and how many customers does one order have?
Cevabı göster
Multiplicity karşı uçtan okunur. Order tarafındaki 0..*: "bir Customer'ın 0 ya da daha çok Order'ı var." Customer tarafındaki 1: "bir Order tam olarak bir Customer'a ait."
Give the multiplicity: 'A gym class session has one trainer; a trainer leads between 0 and 10 sessions per week.' (Trainer end, Session end)
Cevabı göster
Bir Session'ın kaç Trainer'ı var? 1, bu sayı Trainer ucuna yazılır. Bir Trainer kaç Session yönetir? 0..10, bu Session ucuna yazılır.
An Order is made of OrderLines; an OrderLine cannot exist without its Order and is deleted with it. Which relationship?
- Association
- Aggregation
- Composition
- Generalization
Cevabı göster
Composition güçlü bütün-parça ilişkisidir: parça tek bir bütüne aittir ve bütünle birlikte yok olur. Dolu (siyah) elmas bütün tarafında, Order'da çizilir.
A Team has Players, but a player can leave and join another team and still exists. Which relationship and which symbol?
Cevabı göster
Aggregation zayıf bütün-parça ilişkisidir: parça bütünden bağımsız yaşayabilir. Boş elmas bütün tarafına çizilir. Composition olsaydı takım dağılınca oyuncular da yok olurdu.
What do the visibility symbols +, -, # mean?
Cevabı göster
+ her yerden erişilir (public), - sadece sınıfın içinden (private), # sınıf ve alt sınıfları (protected). ~ package görünürlüğüdür. Analizde attribute'lar genelde private, operation'lar public yazılır.
In a class, the attribute /age : int appears next to birthDate : Date. What does the slash mean?
Cevabı göster
/ derived (türetilmiş) attribute'u gösterir: saklanmaz, başka attribute'lardan hesaplanır. Bir Order'ın /total'ı satırların toplamından hesaplanır.
'Students take Courses. For each student-course pair we must store the grade and the semester.' Where do grade and semester go?
Cevabı göster
Grade ne Student'a ne Course'a aittir, ikisinin ilişkisine aittir. Association class, ilişki çizgisine kesik çizgiyle bağlanan bir sınıftır: Enrollment (grade, semester). Çok-çok ilişkilerde sık görülür.
From the text 'A courier delivers an order to a customer's address and records the delivery time', identify candidate classes using textual analysis.
Cevabı göster
İsimler sınıf adayıdır: courier, order, customer, address. Fiiller (delivers, records) operation ya da ilişki adayıdır. "Delivery time" bir değerdir, attribute olur (Delivery ya da Order sınıfında). Address basit tutulursa Customer'ın attribute'u da olabilir.
On a CRC card, what goes on the right side?
- Attributes
- Collaborators
- Responsibilities
- Superclasses
Cevabı göster
CRC = Class, Responsibilities, Collaborators. Kartın sol tarafı sorumluluklar (bilmek ve yapmak), sağ tarafı işbirliği yaptığı sınıflardır. Arka yüze attribute'lar ve ilişkiler yazılabilir.
In the object diagram on this page, how many objects and how many links are shown?
Cevabı göster
Nesneler: ayse:Student, r1:Reservation, r2:Reservation, c7:Copy, c9:Copy. Bağlantılar: ayse-r1, ayse-r2, r1-c7, r2-c9. Toplam 5 nesne, 4 bağlantı. Object diagram'da multiplicity yazılmaz, adlar altı çizili gösterilir.
Which statement about generalization is TRUE?
- The arrow goes from superclass to subclass
- A subclass inherits attributes and operations of its superclass
- Composition is a kind of generalization
- An abstract class must have instances
Cevabı göster
Generalization "is-a-kind-of" ilişkisidir; ok alt sınıftan üst sınıfa, boş üçgen üst sınıfta. Alt sınıf üst sınıfın her şeyini miras alır ve ekler. Abstract class'ın doğrudan nesnesi olmaz (adı italik yazılır).
A Copy belongs to exactly one Book; a Book has at least one Copy. Write the multiplicity at each end.
Cevabı göster
Bir Copy'nin kaç Book'u var? 1 → Book ucuna. Bir Book'un kaç Copy'si var? En az 1 → Copy ucuna 1..*.
Doğrulama: Multiplicity, ilişki türü ve sayım soruları UML 2 class diagram kurallarına (multiplicity okuması karşı uçtan yapılır; composition'da parça bütünle birlikte yok olur; generalization alt sınıftan üst sınıfa boş üçgen) göre tek tek kontrol edildi. Object diagram'daki nesne ve bağlantı sayıları sayfadaki çizim üzerinden elle sayıldı ve iki kez karşılaştırıldı.