Senaryoların Gerçeklenmesi (Use-Case Realization)

Benzer belgeler
Senaryoların Gerçeklenmesi (Use-Case Realization)

Tasarım Örnekleri. Senaryoların Gerçeklenmesi (Use-Case Realization)

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

Tasarım Modelinin (Design Model) Oluşturulması

Tasarım Modelinin (Design Model) Oluşturulması

Tasarım Modelinin (Design Model) Oluşturulması

Nesneler yan yana gösterilir. Etkileşimler (mesajlar) oluştukları sıra ile yukarıdan aşağıya doğru çizilirler.

Uyguluma (Problem) Domeninin Modellenmesi

Sistem Analizi ve Tasarımı

YAZILIM MODELLEME VE TASARIM

Sistem Analizi ve Tasarımı

YZM 2105 Nesneye Yönelik Programlama

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 6. Yrd.Doç.Dr.Hacer Karacan

NESNEYE YÖNELİK PROGRAMLAMA. Yrd.Doç.Dr. Zeynep ORMAN

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

2. Iterasyon. Bu bölümde ele alınan problemler:

Structural Patterns: Adapter Bridge Composite Decorator Facade Flyweight Proxy

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

BLG Sistem Analizi ve Tasarımı. Öğr. Grv. Aybike ŞİMŞEK

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

ARDIŞIL DİYAGRAM YAPI DİYAGRAMI. Sistem Analizi ve Tasarımı Dersi

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

NESNEYE YÖNELİK TASARIM SÜRECİ

Balon & Banka Teslim tarihi: 17 Kasım 2008

T.C. Damla Ok Mesutcan Kurt Ağustos Ali Murat Tiryaki

BİL-141 Bilgisayar Programlama I (Java)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Diziler İndisli Değişkenler

BİL-142 Bilgisayar Programlama II

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

YAZILIM MODELLEME VE TASARIM

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Yazılım Kodlama ve İ simlendirme Standartları v1.0

TARİHÇE. Versiyon Tarih Düzenleyen Açıklama Engin DURMAZ İlk versiyon

Nesne Yönelimli Programlama

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

Java dili, aşağıdakiler de dahil olmak üzere çok çeşitli denetleyici türlerine sahiptir.

Şablon Türler (Generics)

Bölüm 10. Altprogramların gerçeklenmesi ISBN

Spring Framework Eğitimi

Sunum İçeriği. Programlamaya Giriş

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

BMH-303 Nesneye Yönelik Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

YZM 2105 Nesneye Yönelik Programlama

BİL132 Bilgisayar Programlama II

C# ile NJ Simulatöre Bağlanmak

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

"Şirket" Sunucusu ve Başarı Mobile Arasındaki HTTP Veri Aktarımı için Etkileşim Teknik Protokolü

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Nesneye Dayalı Programlama

BTEP243 Ders 3. class Yazım Kuralı:

Yazılım Nedir? 2. Yazılımın Tarihçesi 3. Yazılım Grupları 4 Sistem Yazılımları 4 Kullanıcı Yazılımları 5. Yazılımın Önemi 6

YZM 2105 Nesneye Yönelik Programlama

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 8: Sınıf (Class) Yapılarına Giriş

YZM 2105 Nesneye Yönelik Programlama

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Kurucu Fonksiyonlar (Constructors)

TÜMLEŞİK MODELLEME DİLİ. UML (Unified Modeling Language)

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

GÜZ YY. - MKT103 - GÖRSEL PROGRAMLAMA DERSİ - ARA SINAVI

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) Varlık Bağıntı Modeli

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

EBE-368 Veri Tabanı Yönetim Sistemleri Veri Tabanı Tasarımı

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

HSancak Nesne Tabanlı Programlama I Ders Notları

Veritabanı İşlemleri

Ruby. Prof.Dr.Timur Karaçay Başkent Üniversitesi

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

Bilişim Sistemleri. Modelleme, Analiz ve Tasarım. Yrd. Doç. Dr. Alper GÖKSU

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) Varlık İlişki Modeli

MOBİL UYGULAMA GELİŞTİRME

Sınıf Diyagramları Amaç: Sınıf Diyagramları Nasıl Çizilir?

BM208- Nesneye Dayalı Analiz ve Tasarım. Sunum 7

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Unified Modeling Language

«BM364» Veritabanı Uygulamaları

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Nesneye Dayalı Programlama

NESNEYE YÖNELİK PROGRAMLAMA Unified Modelling Language (UML) Bütünleşik Modelleme Dili

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Transkript:

Senaryoların Gerçeklenmesi (Use-Case Realization) Bu bölümde; senaryoların birbirleriyle etkileşimde olan (işbirliği yapan) yazılım sınıfları ve nesneler şeklinde nasıl tasarlanacağı ele alınacaktır. Bu aşamada senaryolardan ve uygulama uzayı modelinden yola çıkılır. Karmaşık işlemlerin yer aldığı sistemlerde sözleşmelerden de yararlanılır. Tasarımın Adımları:. Sorumluluklar kullanım senaryolarından (ve/veya sözleşmelerden) belirlenir. 2. Sorumluluğu atayacak uygun sınıf aranır. Öncelikle daha önce oluşturulan yazılım sınıfları taranır. Eğer daha önce yaratılmış uygun bir yazılım sınıf yoksa uygulama uzayındaki (analiz modeli) kavramsal sınıflar incelenir. Uygulama uzayından (gerçek dünya) uygun bir kavramsal sınıf alınır. Aynı isimde bir yazılım sınıfı oluşturulur ve sorumluluk bu sınıfa verilir. Gerekli durumlarda gerçek dünyada olmayan yapay sınıflar da oluşturulur. 3. Sorumluluk atama kararları verilirken tasarım prensipleri ve kalıplarından yararlanılır. 4. Oluşturulan tasarım UML sınıf ve etkileşim diyagramları ile ifade edilir. 5. Tasarımın Bileşenleri: Senaryolar Sözleşmeler "6. System calculates " Postconditions Sorumluluklar Sınıf isimleri İlişkiler Nitelikler Kalıplar ve prensipler kararlar Tasarım: Sorumlulukların atanması sınıfların kaynağı Uygulama Uzayı Modeli Yazılım sınıfları diyagramları Ardışıl etkileşim diyagramları İletişim diyagramları Tasarım Modeli 5.2

2 İletişim diyagramları ve ardışıl diyagramların kullanımı: İletişim (communication) diyagramları kullanılması durumunda her sistem olayı (giriş) için ayrı bir diyagram çizmek gerekir. makenewsale() :???() enteritem() :???() endsale() :???() makepayment() :???() 5.3 Ardışıl (sequence) diyagramlarda ise tüm sistem olayları (giriş) aynı diyagram üzerinde gösterilebilir. makenewsale() enteritem (itemid, quantity) endsale() makepayment() : Register spec := getproductspec( itemid ) addlineitem( spec, quantity )......... create() : ProductCatalog : Sale Şekillerin karışık olmaması için ardışıl (sequence) diyagramlar da sistem olaylarına göre ayrı ayrı çizilir. : Register : ProductCatalog : Sale makenewsale() : Register create() enteritem (itemid, quantity) : Sale spec := getproductspec( itemid ) addlineitem( spec, quantity )... 5.4

3 Tasarım Örnekleri Örnek : Satışın Başlatılması makenewsale Bu örnekte makenewsale işlemine ilişkin sözleşmeden (contract) yararlanılarak sorumluluklar belirlenecek ve bu sorumluluklar GRASP kalıplarının yardımıyla uygun sınıflara atanacaktır. Contract CO: makenewsale Operation: makenewsale() Cross References: Use Cases: Process Sale Preconditions: none Postconditions: - A Sale instance s was created (instance creation). - s was associated with the Register (Association formed). - Attributes of s were initialized. Sözleşmenin son koşulları incelenerek sorumluklar belirlenir: Sale sınıfından s nesnesinin yaratılması, s nin uygun Register nesnesi ile bağlanması, s nin başlangıç koşularının sağlanması. Bu sorumlulukların atanacağı sınıflar daha önce elde edilmiş olan yazılım sınıfları arasında aranır. Eğer uygun bir yazılım sınıf yoksa analiz modelindeki kavramsal sınıflar taranır. Bizim örneğimizde tasarıma yeni başladığımız varsayılırsa elimizde hiç yazılım sınıfı olmayacaktır. Bu durumda analiz modelindeki kavramsal sınıflar bize kaynak olacaktır. 5.5 Örnek sistemimizde bütün girişler terminale yapıldığından Register sınıfı denetçi (controller) olarak atanmaya uygundur. Analiz modeli incelendiğinde satış ile ilgili bilgiler de terminalden geçtiği ve satışı terminalin yoğun olarak kullandığı görülür. Yaratıcı kalıbına göre Sale nesnelerini Register sınıfının yaratması uygun olacaktır. Bu işlem sonucunda zaten Sale nesnesi Register nesnesine bağlanmış olacaktır. Analiz modeline göre Sale nesnesi satış kalemleri içermektedir. Bu nedenle başlangıç işlemi olarak satış kalemlerini içerebilen boş bir liste yaratılır. Denetçi makenewsale() create() Yaratıcı'ya göre Sale yaratılır Yaratıcı'ya göre Sale boş bir nesne grubu (liste yaratır create() lineitems: List<SalesLineItem> Sale'in kurucusu (constructor) Boş bir nesne kümesidir. 5.6

4 UML.5 te : Yaratıcı ve Denetçi'ye göre makenewsale() create() Yaratıcı'ya göre Sale yaratılır Yaratıcı'ya göre Sale boş bir nesne grubu (liste yaratır create() s LineItem Sale'in kurucusu (constructor) Nesne değil. Boş bir nesne kümesidir. 5.7 Örnek 2 : Ürün Girişi enteritem Contract CO2: enteritem Operation: enteritem(itemid: ItemID, quantity: integer) Cross References : Use Cases: Process Sale Preconditions: There is a sale underway Postconditions: - A SalesLineItem instance sli was created (instance creation). - sli was associated with the current Sale (association formed). - sli.quantity became quantity (attribute modification) - sli was associated with a ProductSpec. based on itemid match (association formed) Sözleşmenin sağlanması için yapılması gerekenler: Denetçi nesne: Tüm sistem için görüntü denetçi olarak Register kullanılır. SalesLineItem yaratma: Uygulama modeli incelendiğinde Sale sınıfının SalesLineItem sınıflarını içerdiği görülür. Sale, SalesLineItem yaratır. SalesLineItem'da yer alan quantity, Register tarafından Sale'e gönderilmeli. SalesLineItem yaratılırken (constructor) bu değer parametre olarak kullanılır. Register'dan Sale'e makelineitem mesajı gitmeli. Bu mesaj gerekli parametreleri içermeli. SalesLineItem nesnesi uygun ProductSpecification ile ilişkilendirilmeli. Belli bir itemid'ye bağlı olarak ProductSpecification'ı bulmak kimin sorumluluğudur? ProductCatalog, ProductSpecification'ları içerir. getspecification metoduna sahip olmalı 5.8

5 Burada ortaya bir problem çıkmaktadır: Müşterinin satın aldığı ürünün kodu (bar kod numarası) terminal üzerinden sisteme girilmektedir. Bu itemid ye bakarak o ürünün hangisi olduğunu (ProductSpecification) bulmak kimin sorumluluğudur? Ürünlerle ilgili bilgilerin (tanım, fiyat) yer aldığı nesneler (ProductSpecification) bir katalog nesnesinde (ProductCatalog) tutulmaktadır. Register ve ProductCatalog nesnelerinin sistemin başlangıcında birlikte yaratıldıkları varsayılabilir. Bu durumda kataloğa getproductspecification mesajını gönderip o ürüne ait ProductSpecification nesnesini almak sorumluluğu Register nesnesinde olabilir. Önce Register nesnesine enteritem(id, qty) mesajıyla satın alınan ürünün kodu ve miktarı girilmektedir. Register nesnesi ProductCatalog nesnesine getproductspecification(id) mesajıyla ilgili ürünün tanımlayıcı nesnesini sormaktadır. ProductCatalog nesnesi sahip olduğu nesne grubuna (Map) find(id) mesajını göndererek ilgili ürünün tanımlayıcı nesnesini arar ve bulunan tanımlayıcıyı Register nesnesine iletir. Böylece kod numarası sisteme girilmiş olan ürünün ne olduğu belirlenmiş olur. Kataloğu tarama sorumluluğu Sale nesnesine de verilebilirdi ancak bu durumda Sale nesnesi ProductCatalog nesnesine bağlanmış olurdu. Ürünün tanımlayıcı bilgisini alan Register nesnesi bu bilgiyi ve miktarı Sale nesnesi makelineitem(spec, qty) mesajıyla iletir. nesnesi bu bilgileri içeren bir slslineitem nesnesi yaratır ve bu nesneyi kendi satış kalemlerini tuttuğu listeye ekler. 5.9 enteritem işlemine ilişkin iletişim diyagramı: Denetçi Yaratıcı enteritem(id, qty) 2: makelineitem(spec, qty) : spec := getspecification(id) 2.: create(spec, qty) Uzman :Product Catalog.: spec := find(id) :Map<id,ProductSpecification> 2.2: add(sli) lineitems: List<SalesLineItem> sli: SalesLineItem Yeni yaratılan sli kümeye (liste) ekleniyor find mesajı gruba (map) gönderilir. Gruptaki tüm nesnelere değil 5.0

6 Etkileşim diyagramları ile birlikte yazılım sınıfları diyagramları da oluşturulur. Bu diyagramlar ile ilgili daha fazla bilgi ileriki bölümlerde verilecektir. ProductCatalog catalog getspecification() descriptions Map.. ProductSpecification description : Text price : Money itemid : ItemID Register. enteritem(). currentsale Sale date : Date iscomplete : Boolean time : Time makelineitem() lineitems ordered SalesLineItem quantity : Integer description 5. Örnek 3: Satışın Bitirilmesi endsale Contract CO3: endsale Operation: Cross References: PreConditions: PostConditions: endsale() Use Cases: Process Sale There is a sale underway - Sale.isComplete became true (attribute modification) Denetçi nesne: Tüm sistem için görüntü denetçi olarak Register kullanılıyor. iscomplete değişkenini true yapmak kimin sorumluluğudur? Uzman kalıbına göre Sale'in sorumluluğudur. Denetçi Uzman endsale() : becomecomplete() 5.2

7 Örnek 4: Satışın toplam bedelinin hesaplanması Önceki tasarım örneklerinde sorumluluklar sözleşmelerden elde edilmişti. Bu örnekte ise sorumluluk senaryolardan elde edilecektir. Main Success Scenario (or Basic Flow):. Customer arrives at POS checkout with goods and/or services to purchase. 2. Cashier starts a new sale. 3. Cashier enters item identifier. 4. System records sale line item and presents item description, price, and running total. Price calculated from a set of price rules. Cashier repeats steps 3-4 until indicates done. 5. System presents total with taxes calculated. Senaryoya göre satışın toplam bedelinin hesaplanması gerekiyor. Uzman kalıbına göre gerekli bilgilere Sale ulaşabilir. Toplam bedel = tüm satış kalemlerinin toplamı Satış kalemi bedeli = ürün miktarı ürün birim fiyatı Gerekli bilgiler ve uzmanları: Bilgi ProductSpecification.Price SalesLineItem.quantity Bir satıştaki tüm kalemler Uzman ProductSpecification SalesLineItem Sale 5.3 Uzman st = lineitems[i].quantity lineitems[i].spec.price Uzman t := gettotal() [i:=..n] st := getsubtotal().: price := getprice() lineitems[i]: SalesLineItem :Product Specification // constraint public int gettotal() int tot = 0; for each SalesLineItem, sli tot = tot + sli.getsubtotal(); return tot; 5.4

8 Örnek 5: Ödeme Yapılması makepayment GRASP kalıplarından Uzman ve Yaratıcı'ya göre Ödeme (Payment) nesnesini yaratmak için iki aday vardır: Register ve Sale. Az bağımlılık (Low coupling) kalıbına göre Ödeme'nin Satış tarafından yaratılması daha uygundur. Denetçi Yaratıcı ve az bağımlılık makepayment(cachtendered) :makepayment(cachtendered).: create(cachtendered) : Payment Birden fazla seçenek olduğunda uyum ve bağımlılık unsurlarını dikkate almak yazılımın daha sağlam olmasını ve tekrar kullanılabilmesini sağlayacaktır. 5.5 Örnek 6: Para üstünün hesabı Process Sale senaryo grubuna göre para üstünün hesaplanması ve gösterilmesi gerekiyor. Biz arayüz katmanı ile ilgilenmediğimizden para üstünün ekranda nasıl gösterildiğinin değil, nasıl hesaplandığı üzerinde duracağız. Para üstünü hesaplamak için toplam satış bedeline ve müşterinin ödediği miktar bilgisine gerek vardır. Uzman kalıbına göre para üstünü hesaplayacak bilgilere Satış (Sale) ve Ödeme (Payment) sınıfları sahip olabilir. Eğer bu sorumluluk Payment sınıfına verilirse toplam bedeli öğrenmek için Sale sınıfına başvurmasını gerektirir. Bu da önceden olmayan yeni bir bağımlılık yaratır. Sorumluluk Sale sınıfına verilirse o da Payment sınıfına gerek duyar. Sale sınıfı Payment nesnelerinin yaratıcısı olarak zaten bu sınıf hakkında bilgi sahibi olmak zorundadır. Bu durumda yeni bir bağımlılık yaratılmış olmaz. bal:= getbalance() : amt := getamount() : Payment 2: t := gettotal() 5.6

9 Örnek 7: Satış kayıtlarının tutulması Sonlandırılan satışları bilmek ve kayıtlarını tutmak kimin sorumluluğundadır? Uygulama modeli incelendiğinde satışlarla ilgili bilgilere sahip olan Dükkan (Store) sınıfıdır. Eğer Store sınıfı başka sorumluluklar ile fazla yüklenmediyse bu sorumluluğu alabilir. Eğer Store çok yüklü ise satışların kayıtlarını tutmak için SatışDefteri (SalesLedger) adlı yeni bir sınıf düşünülebilir. Hatta bu sınıf geri dönülerek uygulama modeline de eklenebilir. Store SalesLadger addsale(s: Sale) Sale logs-completed Store satışların kaydını tutabilir. addsale(s: Sale) logs-completed Sale SalesLedger satışların kaydını tutabilir. 5.7 Biz örneğimizde sorumluluğu Store sınıfına verdiğimizi varsayalım: makepayment(cachtendered) :makepayment(cachtendered) s Register Store a bağımlı olur Uzman 2: addsale(s) 2.: add(s) :Store completedsales: List<Sale>.: create(cachtendered) Aynı nesneye referans : Payment 5.8

0 Başlangıç İşlemleri: Sistemlerin ilk çalışmaya başladıklarında olması gerekenler de ayrı bir senaryo grubu (use-case) olarak yazılabilir. Başlangıç aşamasında yapılacak işleri tasarım en son aşamasında belirlemek uygundur. Nesneye dayalı yöntemde bir başlangıç nesnesi (initial domain object) belirlenir. Bu nesne program çalışmaya başladığında yaratılacak ilk nesnedir. Başlangıç nesnesi, doğrudan içerdiği diğer nesneleri yaratma ve aralarındaki bağlantıyı (görünürlüğü) sağlama sorumluluğunu üstlenecektir. Başlangıç nesnesinin yaratılma yeri programlama diline göre değişebilir: public class Main // Java public static main( String[] args) // Store is initial domain object Store store = new Store(); Register register = store.getregister(); // register Store da yaratılıyor ProcessSaleJFrame frame = new ProcessSaleJFrame(register); // Frame ile register.. // bağlandı 5.9 C++ da ise başlangıç nesnesi aşağıdaki şekilde yaratılabilir: int main( ) // C++ // Store is initial domain object Store store; Register register = store.getregister(); ProcessSaleJFrame frame = new ProcessSaleJFrame(register);.. Başlangıç nesnesi tüm programın çalışmasını denetleyen temel bir nesne olarak da düşünülebilir. Bu durumda başlangıç nesnesi yaratıldıktan sonra ve başlangıçla ilgili diğer işlemler yerine getirildikten sonra başlangıç nesnesine çalış (run) mesajı gönderilerek sistem harekete geçirilebilir. Sistemin denetimi (ana döngüsü) başlangıç nesnesinde olmak zorunda değildir. Denetim ana programda (main) ya da arayüz nesnelerinde olabilir. 5.20

Örnek sistemde başlangıç işlemleri: Register ile pc ve Store bağlantısı sağlanıyor st biten satışları saklamak için gerekli create() st:store 2: create(pc,st) : create().: create() Boş bir nesne grubu (list, map) yaratılıyor pc: ProductCatalog.2.2: add(id,ps) specifications: Map<id,ProductSpecification>.2: loadprodspecs().2.: create(id, price, description) ps: ProductSpecification : Mesajın bir döngü içinde tekrarlandığını gösterir 5.2 Arayüz ile uygulama arasındaki bağlantının sağlanması: Başlangıç aşamasında arayüz nesnelerine denetçi nesnelerin referansları gönderilir. Denetçi kullanılması katmanların ayrılmasını sağlar. Ancak tüm mesajların denetçi üzerinde geçmesi yavaşlamaya neden olabilir Bu nedenle bazı durumlarda arayüz nesnelerinin iş katmanındaki nesnelere doğrudan erişmesine izin verilebilir. Yandaki örnekte arayüz nesnesi (SaleJFrame) Sale nesnelerine bağımlı olmuştur. : Cashier Arayüz (Interface) Katmanı (Layer) presses button JFrame actionperformed( actionevent ) 3: t := gettotal( ) : enteritem(itemid, qty) Sale sınıfının kararlı (çok değişmeyen) bir sınıf olduğu varsayılırsa bu bağımlılık problem yaratmayacaktır. Uygulama (Domain) Katmanı (Layer) 2: [s = NULL] s := getsale() : Sale.:makeLineItem(itemID,qty) : Register 5.22

2 Görünürlük (Visibility) B nesnesinin A nesnesine görünür olması, A'nın B'ye erişebilmesi anlamına gelir. Görünürlük Türleri: Nitelik Görünürlüğü (Attribute visibility): B, A'nın bir niteliğidir (üyesidir). Parametre Görünürlüğü (Parameter visibility): B, A'nın bir metodunun parametresidir. Yerel Görünürlük (Local visibility): B, A'nın bir metodunda yerel değişkendir. Global Görünürlük (Global visibility): B, A'nın global uzayındadır. A nesnesinin B nesnesine mesaj gönderebilmesi için B A'ya görünür olmalıdır. Nitelik Görünürlüğü: Bir nesne diğerinin üyesi class Register olduğundan, görünürlük nesnenin yaşam.. süresince devam eder. private ProductCatalog catalog;.. : Register : ProductCatalog // atama Kurucu metodta enteritem (itemid, quantity) spec := getproductspec( itemid ) public void enteritem(itemid,qty).. spec= catalog.getproductspec(itemid);.. 5.23 Parametre Görünürlüğü: Bir metodun içinde geçerlidir. enteritem(id, qty) 2: makelineitem(spec, qty) : spec := getspecification(id) 2.: create(spec, qty) :Product Catalog sli: SalesLineItem makelineitem(productspecification spec, int qty) sli = new SalesLineItem(spec,qty); // SalesLineItem kurucu metodu SalesLineItem(ProductSpecification spec, int qty) description = spec; // parametreden niteliğe 5.24

3 Tasarım (Yazılım) Sınıfı Diyagramları (Desgin Class Diagrams-DCD) Tasarım aşamasında etkileşim diyagramları oluşturulurken buna paralel olarak yazılım sınıflarını ifade eden UML sınıf diyagramları da çizilir. Bu diyagramlarda; yazılım sınıflarının nitelikleri, niteliklerin tipleri, metotların parametreleri ve üyelerin erişim hakları büyük ölçüde belirtilir. Ayrıca yazılım sınıfları arasındaki ilişkiler ve bağımlılıklar yönlü olarak gösterilir. Yazılım sınıfları arasındaki bağlantılar (Navigability): İki yazılım sınıfı arasında doğrudan bir bağlantı olması çoğunlukla bir nitelik görünürlüğünün sonucudur. B nesnesi A nesnesinin üyesidir ve A, B'ye mesaj göndermektedir. Sınıf diyagramlarında bunu ifade etmek için A sınıfından B sınıfına bir ok çizilir. Uygulama uzayındaki bağlantılar oluşturulurken iki kavramsal sınıf arasında gerçek dünyada bir ilişki olup olmadığı araştırılmıştı. Tasarım aşamasındaki sınıf diyagramlarında ise gerçekten iki yazılım sınıfı arasında bir görünürlük ilişkisi olup olmadığı araştırılır. Yazılım sınıfları arasındaki bağlantılar (navigability) iletişim diyagramlarının incelenmesiyle bulunabilir. Örneğin 5.5, 5.9, 5.3 teki diyagramlar incelenebilir. 5.25 Store address : Address name : Text addsale() Tasarımda sınıflar arasında yeni ilişkiler keşfedilebilir. Örneğin uygulama modelinde Register ile ProductCatalog arasında bir ilişki yoktu. register Register endsale() enteritem() makenewsale() makepayment() Biten satışları Store saklıyorsa Bkz. 5.7 catalog currentsale completedsales ordered catalog ProductCatalog getspecification() Sale date : Date iscomplete : Boolean time : Time becomecomplete() makelineitem() makepayment() gettotal() descriptions Map.. lineitems ordered payment ProductSpecification description : Text price : Money itemid : ItemID description SalesLineItem quantity : Integer getsubtotal() Payment amount : Money 5.26

4 Bağımlılık İlişkisi (Dependincy Relationship): UML'de bağımlılık en genel haliyle, bir birimin (sınıf, senaryo) başka bir birim ile ilgili bilgilere sahip olması gerekliliğini ifade eder. Tasarım aşamasında ise bağımlılık, yazılım sınıfları arasındaki nitelik görünürlüğü dışındaki görünürlükleri ifade eder. Örneğin; yansı 5.9'da Register nesnesi ProductCatalog nesnesine getspecification mesajını gönderdiğinde ProductSpecification tipinden bir yanıt alır. Bu yanıt enteritem metodunda bir yerel değişken olarak saklanır. Bu nedenle Register nesnesinin ProductSpecification nesnesine bir bağımlılığı vardır (yerel görünürlük). Ayrıca Sale nesnesi makelineitem mesajının içinde ProductSpecification tipinden bir parametre alır. Bu nedenle Sale ProductSpecification'a bağımlıdır (parametre görünürlüğü). UML diyagramlarında bağımlılık kesik çizgili bir ok ile ifade edilir. 5.27 Store address : Address name : Text addsale() register Register endsale() enteritem() makenewsale() makepayment() currentsale completedsales ordered catalog ProductCatalog getspecification() Sale date : Date iscomplete : Boolean time : Time becomecomplete() makelineitem() makepayment() gettotal() descriptions Map.. lineitems ordered payment ProductSpecification description : Text price : Money itemid : ItemID SalesLineItem quantity : Integer getsubtotal() Payment amount : Money description 5.28

5 Üyelerin veri tipleri ve erişim hakları belli olduğu ölçüde sınıf diyagramlarında gösterilir. Store Register + endsale() + enteritem(id : ItemID, qty : Integer) + makenewsale() + makepayment(cashtendered : Money) - address : Address - name : Text + addsale(s : Sale) - date : Date - iscomplete : Boolean - time : Time ProductCatalog + getspecification(id: ItemID) : ProductSpecification Sale + becomecomplete() + makelineitem(spec : ProdSpecification, qty : Integer) + makepayment(cashtendered : Money) + gettotal() : Money ProductSpecification - description : Text - price : Money - itemid : ItemID SalesLineItem - quantity : Integer + getsubtotal() : Money Payment - amount : Money 5.29