NESNEYE YÖNELİK PROGRAMLAMA Yrd.Doç.Dr. Zeynep ORMAN ormanz@istanbul.edu.tr Nesne Tabanlı Programlama Kavramları • Nesne Tabanlı Programlama (OOP) tekniği, gerçek dünyadaki somut nesnelerin bir yazılımın sunduğu soyut modelde birer karşılığı olmasına dayanır. • Bu karşılıklara da Nesne (object) denir. • Nesne tabanlı programlama ile gerçek dünyadaki varlıklar ile bu varlıkların yer aldığı ilişkilerin bire bir modellenmesi ve bu modele göre kod yazılması mümkündür. Nesne Tabanlı Programlama Kavramları • Örneğin, Bir insanın sahip olabileceği iki varlık ve bu üçlünün yazılıma eşlenmesi Nesne Tabanlı Programlama Kavramları • Nesne tabanlı geliştirmede de diğer sistem geliştirme süreçlerinde olduğu gibi modelleme aynı zamanda bir sadeleştirmedir. Ne kadar sade modellerimiz olursa o kadar sade kodlarımız olur. • Örneğin bir bordro programında insanların boy ve kilolarının önemi olmaz. • Bazı durumlarda da aynı kişi tamamen aynı verilerden beslenen başka bir role sahip olabilir. Örneğin, sağlık sisteminde aynı veriler bir hastayı simgeleyecektir. Örnek: (Personel Sadeleştirmesi - Bordro) (Personel Sadeleştirmesi – Sağlık) Nesne Tabanlı Programlama Kavramları • Bu sadeleştirmeler sonucunda işimize yarayan ve yazılım bakış açısından görülen veriler ve bu veriler üzerinde tanımlanmış işlemler içeren bir modele ulaşırız. • Bu modele alan modeli (domain model) adı verilir. • Bu modeli kullanarak benzer özellikleri olan birden fazla nesnenin üzerinde işlemler tanımlayabiliriz. Nesne Tabanlı Programlama Kavramları • Nesneye Yönelik programlamada üzerinde işlem yapılacak bu nesnelerin yaratılması ve tanınması gerekir. • Nesnelerin programda nasıl yaratılacağı dilden dile farklılık gösterir (C++, Java). • Ancak nesnenin yaratılması için nesnenin bir plana ihtiyacı vardır. Bu plana sınıf (class) denir SINIF Bir sınıf, ortak özellikleri ve davranışları olan nesnelerin sözkonusu ortak özelliklerini ve ortak davranışlarını barındıran soyut bir kavramdır. • Yani bir sınıf temel olarak bir tanımdır. • Bir özellik ve davranış yığını sunar ve bu yığına topluca erişmemiz için bize birer isim verir. • Bu ismi taşıyan nesneler bu yığındaki özellik ve davranışlara sahip olurlar. • Bu ilişkiyi nesne sınıfa aittir (belongs to) diyerek açıklarız. • ***Bir nesne bir sınıfta tanımlanan özellik ve davranışlara sahipse o sınıfa aittir. NESNE • Sınıf nesne ilişkisinde kullanılan önemli diğer bir kavramda bir nesnenin ait olduğu sınıfın bir örneği (instance) olmasıdır. Bir nesne, uygulama çalışırken bellekte ya da başka bir kayıt ortamında (dosya, veritabanı, vs) bulunan ve ait olduğu sınıfın tanımladığı davranış biçimlerine uyan bir örnektir. Nesne Tabanlı Programlama Kavramları • Bir uygulama çalışırken bir sınıfa ait değişik sayılarda örnek (yani nesne) bulunabilir. • Herhangi bir anda o sınıfa ait hiç nesne olmayabileceği gibi bir yada daha fazla sayıda nesne de olabilir. • Bir nesne genelde yalnızca bir sınıfın örneğidir. (Ancak C++ gibi dillerde bir nesnenin birden fazla sınıfın örneği olmasına izin vardır ama tercih edilmez) Örnek: (Nesnenin sınıfı örneklemesi) Bir sınıftan birden fazla nesnenin bulunması Nesne Tabanlı Programlama Kavramları • Sınıflar ve nesnelerden bahsederken sürekli olarak nesnelerin özellikleri ve davranışlarından bahsederiz. • Bir nesnenin özellikleri (attributes), o nesnenin içindeki veriler ve bu verilerin yapısını kapsar. • Özellikler değişik seviyelerdeki soyutlamaları içerebilir. • Yani bir nesnenin bir özelliği başka bir nesne olarak ifade edilebilir. • Bu diğer nesne aynı sınıftan ya da farklı bir sınıftan olabilir. • Örnek: Bir Ev sınıfı düşünün; komşu özelliği de bir başka Ev nesnesi olabilir. Nesne Tabanlı Programlama Kavramları • Bir nesne üzerindeki işlemler (operations) ile nesnenin davranışını (behavior) niteleriz. • Davranış nesnenin sistemde kullanıldığı zaman yapacakları ve yapacaklarının sistemin durumu üzerinde yol açacağı değişikliklerden oluşur. • Davranış sonunda değişime uğrayan sadece nesne olmak zorunda değildir. Çevresi de değişime uğrayabilir. • Bazen davranış sonucu nesnenin kendisi hiç değişmezken çevresindeki diğer nesneler değişebilir. Nesne Tabanlı Programlama Kavramları • Örneğin, elimizde bir ütümüz olsun. Ütünün markası, modeli, rengi, çalıştığı elektrik voltajı, ne tür kumaşları ütüleyebildiği bu ütüye ait özelliklerdir (veri). • Aynı zamanda ütümüzü ısıtabiliriz, ütüleme işinde kullanabiliriz ve soğumaya bırakabiliriz. Bunlar ise ütünün fonksiyonlarıdır (metot). Nesne Tabanlı Programlama Kavramları • Eğer ütü ile ilgili bir program yapmış olsak ve nesne tabanlı programlama tekniğini kullansak hemen bir ütü sınıfı (class) oluştururduk. • Bu sınıfta ütüye ait bilgiler (veriler) ve ütü ile yapabileceğimiz işler (metot) bulunurdu. • O zaman nesne tabanlı programlamada bir sınıfta, sınıfa ait veriler ve bu verileri işleyip bir takım faydalı sonuçlar üreten fonksiyonlar metotlar bulunur. • Dahası, biz bir tane ütü sınıfı tasarlarsak bu sınıftan istediğimiz sayıda değişik ütüler (Object veya instance) yapabiliriz. Nesne Tabanlı Programlama Kavramları • Bir nesne üzerindeki kısıtlamalar (constraints), nesnenin uyması gereken kuralları simgeler. • Bu kurallar genellikle nesnenin özellikleri ile ilgilidir. • Nesnenin veri bütünlüğünün korunması için gereken şeylerdir. • Bu kısıtlamalar sayesinde nesnenin özellikleri anlamlı olmaya devam eder. • (Kısıtlamalar kötü bir şey olarak algılanmamalıdır.) Nesne Tabanlı Programlama Kavramları • Örneğin, bir araba için sürücünün iki ayağı olacağından, debriyaj, fren ve gaz pedallarından aynı anda en çok ikisine basılabilir. • Bunu bir kural olarak tanımlarsak, Araba sınıfından nesneler için bir kısıtlama olacaktır. Nesne Tabanlı Programlama Kavramları • Kısıtlamalara benzer diğer bir kavram da bir nesnenin uyması beklenen sözleşmesi (contract) dir. • Sözleşme, nesnenin üzerindeki işlemler gerçekleştirilirken nasıl davranması gerektiği üzerine kurallardır. • Kısıtlamalar ise nesnenin özelliklerinin her zaman uyması gereken kurallardır. • Sözleşmelerin daha çok davranışa, kısıtlamaların ise veriye odaklı kurallar olduğunu söyleyebiliriz. UML Sınıf ve Nesne Şemaları • UML (Unified Modelling Language), nesne tabanlı sistemlerin modellenmesinde kullanılan bir modelleme dilidir. • Sınıflar ve nesneler için çeşitli notasyonlar sunar. • Bu notasyonlar grafik notasyonlardır. • bir miktar metin katkısına da izin verirler. • UML sınıf şeması 3 bölümlü bir dikdörtgenden oluşur: • En üst bölüm sınıfın adını, • Ortadaki bölüm özellikleri • En son bölümde yöntemleri (metotları) gösterir. UML Sınıf ve Nesne Şemaları Nokta x: double y: double no:Nokta x = x0 y = y0 Nesne Şeması n1:Nokta Sınıf Şeması x = x1 y = y1 UML Sınıf ve Nesne Şemaları • Nesne şemalarında isimlerin altı çizili ve nesnenin özelliklerine değer atanması durumunda atama işareti (=) kullanılmıştır. • UML’de nesnelerin özelliklerinin tiplerini belirlemek mümkündür. • Özelliğin adından sonra iki nokta üst üste işareti (:) ile ayrılarak tipinin adı belirtilir. • Aynı tipten birden fazla özellik olsa bile her özelliğin tipi tek tek belirtilecektir. • Örneğin, double UML Sınıf ve Nesne Şemaları • İyi bir sınıf tasarımı iyi bir modeldir ve iyi modellerde bulunması gereken özellikler şunlardır: gerçek dünyayı doğru ifade etmelidir. işlevi tasarımdan ayırmalıdır. bütün önemli özellikleri doğrudan sunmalıdır. • Sınıfları tasarlarken karşımıza çıkan en önemli tasarım kriteri sade ve genel olması gerekliliğidir. • Gereksiz özellikler olmamalıdır!! • Ancak çoğu kez, bir sınıfın programlama diline bağlı olarak zenginleştirilmesi gerekebilir. UML Sınıf ve Nesne Şemaları • Örnek: Gelişen nokta sınıfı Nokta x: double y: double equals(o:Object):boolean toString():String Yöntemler (metotlar) • Java’da equals() ve toString() yöntemleri oldukça kullanılan ve yararlı yöntemlerdir ve yazılmaları önerilir. • Uygulama Java’da yazılacaksa sınıfı genişletmek gerekir. Nesne Tabanlı Programlama Kavramları- Devam • Nesneye-yönelik programlamanın temel ilkeleri şunlardır: Soyutlama Saklama, Paketleme SINIF Kalıtım SINIF HİYERARŞİSİ Çok biçimlilik Nesne Tabanlı Programlama Kavramları- Devam • Nesneye-yönelik programlamanın temel kavramları, 1. büyük programlar yazmayı kolaylaştıran soyutlama ve programları değiştirmeyi ve korumayı kolaylaştıran saklama 2. kalıtım ve çok biçimliğe izin veren ve programları kolayca genişletilebilir kılan sınıf hiyerarşisidir. • Herhangi bir programlama dilinde bu kavramları uygulayabilirsiniz; fakat, nesneye-yönelik programlama dilleri salt bu amaçla tasarlanmışlardır. Soyutlama • “Soyutlama” önemli özelliklere odaklanabilmek için ayrıntıları göz ardı etme sürecidir. • Geleneksel olarak, bir programlama dili soyutlama yapmaya izin verdiği ölçüde yüksekdüzeyli (high-level) kabul edilir. • C++ (ve diğer nesneye-yönelik programla dilleri) verilen bir işi C’den daha soyut bir tarzda tanımlama imkanı verirken, C de Birleştirici Dillerden daha soyut bir ortam sunar. Soyutlama “Soyutlama” , belirli bir bakış açısından, önemli özelliklere odaklanabilmek için ayrıntıları göz ardı etme sürecidir. PROSEDÜREL SOYUTLAMA • İşlemlere ilişkin ayrıntıları göz ardı etmemize izin veren “prosedürel soyutlama” en yaygın soyutlama tarzıdır. • Programlarda kişileştirilmiş kod kullanmak yerine, belirli görevleri gerçekleştirmek için standart fonksiyonların oluşturulması bir prosedürel soyutlamadır. • Kendi fonksiyonlarınızı yazarak, programın yaptığı bir dizi işleme bir isim vermiş olursunuz. PROSEDÜREL SOYUTLAMA • Belirli bir dilde bir program yazarken programcı kendisini bu dilin sunmuş olduğu soyutlama düzeyiyle sınırlamak zorunda değildir. Birçok dil kullanıcı-tanımlı fonksiyonlar (rutinler, prosedürler) yardımıyla prosedürel soyutlama düzeyini daha yukarılara taşımaya izin verir. • Prosedürel soyutlama ile kod tekrarlarından kurtulmak mümkündür. Veri Soyutlaması • Bir veri tipinin nasıl yapılandığının ayrıntılarını göz ardı etmemize izin veren soyutlama tarzına “veri soyutlaması” denir. • Örneğin, bilgisayardaki her tür veri ikili sayılar olarak düşünülebilir. Fakat, birçok programcı ondalık sayılarla düşünmeyi tercih ettiği için, dillerin çoğu tam ve “floating” sayıları destekler. • Basic dili karakter katarı (string) tipini bir veri soyutlaması olarak destekler. Diğer yandan, C dili string soyutlamasını doğrudan desteklemez. Bu dilde stringler ardışık bellek hücrelerini işgal eden bir dizi karakter olarak tanımlanmıştır. Veri Soyutlaması • Prosedürel soyutlama kapasitelerinin aksine, birçok dil yeni veri soyutlaması düzeyleri konusunda sınırlı destek sağlarlar. yaratmak • C kullanıcı tanımlı veri tiplerini “structure”lar ve “typedef”ler aracılığıyla destekler. •C dili, içsel olarak birbirlerine bağlı olmalarına rağmen, prosedürel soyutlamayı ve veri soyutlamasını iki ayrı teknik olarak sunar. • Bu tekniklerin birleştiği noktada nesne-tabanlı ya da nesneye-yönelik programlama yaklaşımı doğar. Saklama, Paketleme (Encapsulation) • Saklama (Paketleme), soyutlamayı desteklemek ya da güçlendirmek için bir sınıfın iç yapısının gizlenmesidir. • Bu şekilde veriler fonksiyonlarla gizlenebilir. • Nesnenin içindeki kod, veri veya her ikisi bu nesneye private (özel) veya public (genel) olabilir. Saklama, Paketleme (Encapsulation) • Private kod ve veriler, sadece o nesneye ait bileşenler tarafından bilinebilir ve erişilebilir. Programda nesneye ait olmayan bileşenler, bu private kod ve verilere erişemez. • Kod ve verilerimiz public ise, belirli bir nesnenin içinde tanımlansalar da programın diğer parçaları tarafından erişilebilirler. • Nesnelere ait public elemanları, private elemanlara denetlenebilir şekilde erişebilmek amacıyla kullanırız. Sınıf Hiyerarşisi • Nesneye-yönelik programlamanın, prosedürel programlamada bulunmayan, bir özelliği, tip hiyerarşisi tanımlayabilme yeteneğidir. • Nesneye-yönelik programlama, bir sınıfın başka bir sınıfın alt-tipi olarak tanımlanmasına; sınıflar arası benzerlikleri bir ortak üst-sınıf altında toplamaya izin verir. • Birkaç sınıf için ortak bir üst-sınıf tanımlama da bir tür soyutlamadır. • Sınıfların ortaklaşa taşıdıkları bazı yönler üzerinde odaklaşıp diğerlerini göz ardı etmeye izin verir. Sınıf Hiyerarşisi •“Aslan”, “kaplan”, “ayı” ve “inek” türünün üstsınıfı ne olabilir? KALITIM (MİRAS ALMA) - Inheritance Kalıtım, bir sınıfa ait özellikler ve işlemlerin yeni bir sınıfa birebir aktarılmasıdır. Yeni sınıf eski sınıfın özellikleri ve işlemlerine sahip olmasına ek olarak kendisi de özellikler ve işlemler tanımlayabilir. KALITIM (MİRAS ALMA) - Inheritance • Kalıtım yolu ile eldeki sınıflardan yeni sınıflar türetilir. • Türeyen sınıflar türedikleri sınıfın özelliklerini kalıtım yoluyla devralırlar ve kendisi de yeni özellikler tanımlayabilir. • Türetme ile sınıflar arasında hiyerarşik bir yapı kurulabilir. KALITIM • Bir sınıf hiyerarşisi tanımlamanın 2 pratik faydası vardır: • Türetilmiş sınıf üst-sınıfın kodunu paylaşabilir (Kod Kalıtımı) • Türetilmiş sınıf üst-sınıfın arayüzünü paylaşabilir (Arayüz Kalıtımı) KOD KALITIMI • Eğer yeni bir sınıf tanımlıyorsanız ve mevcut bir sınıfın işlevselliğinden yararlanmak istiyorsanız, yeni sınıfınızı mevcut sınıftan türetirsiniz. • Bu durumda kalıtım mekanizmaları size mevcut kodu yeniden kullanma imkanı sağlar. • Örnek: Veri Girişi Formlarının tasarlanması. ARAYÜZ KALITIMI • Bir diğer kalıtım stratejisi, türetilmiş sınıfın üst- sınıfının eleman fonksiyonlarının yalnızca isimlerini kalıtım yoluyla almasıdır. • Türetilmiş sınıf bu fonksiyonlar için kendi kodunu kullanır. • Arayüz kalıtımının temel faydası çokbiçimliliğe izin vermesidir. • Örnek: Farklı veri tiplerindeki form girişleri ayrı ayrı alınır. ÇOK BİÇİMLİLİK (Polymorphism) • Genel anlamı ile bir adın birbiriyle alakalı fakat teknik açıdan farklı iki veya daha fazla amaç için kullanılabilmesi yeteneğidir. • NYP’de ise oluşturulan nesnelerin gerektiğinde başka bir nesne gibi davranabilmesine denir. • Çok biçimlilikle programdaki her nesne kendi davranışını değiştirmeden, kalıtım hiyerarşisine göre farklı biçimlerde görülebilir. Bir Çok Biçimlilik Örneği • Örneğin C dilinde, mutlak değer bulma işlemi için üç farklı fonksiyon tanımlıdır: abs(), labs() ve fabs(). • Fakat çok biçimliliği destekleyen C++'da bu fonksiyonlar, abs() gibi tek bir isimle adlandırılırlar. • Fonksiyonu çağırmak için kullanılan veri tipi, gerçekte hangi fonksiyonun çalışacağını belirler. • Böylece bir fonksiyon adının birkaç farklı amaç için kullanılması mümkündür. • Buna fonksiyonların aşırı yüklenmesi denir. Bir Çok Biçimlilik Örneği UML DİYAGRAMLARI Kullanım Senaryoları ve Kullanım Durum Diyagramları (Use Case Diagrams) Kullanım Durumlarının Tanımı • Kullanım durumları, sistemin kullanıcılara sunacağı bir hizmetin senaryo şeklinde anlatımıdır. • Sistem gereksinimlerinin anlaşılmasını ve ifade edilmesini sağlayan bir yöntemdir. • Senaryo, anlamlı bir sonuca (amaca) ulaşmak için aktör ile sistem arasında gerçekleşen olayların belli bir zinciridir. • Bir sistemin çalışması sırasında birden fazla senaryo gerçekleşebilir • Olası tüm senaryolar, kullanım durumlarını (use case) oluştururlar. Kullanım Senaryoları • Yazılım dünyasındaki önemli isimleri kullanım senaryoları ile ilgili orijinal tanımları aşağıda verilmiştir: •(Jacobson, Booch &Rumbaugh, 1999): • “Bir Kullanım Senaryosu, bir sistemin gerçekleştirdiği ve belirli bir aktör için gözlemlenebilir bir sonuç ortaya çıkaran ve çeşitli varyasyonlar içeren eylemler serisini ifade eder." •(Cockburn, 2000): • “Bir Kullanım Senaryosu, tasarlama aşamasındaki bir sistem ve harici aktörler arasında belirli bir hedefe yönelik gelişen olası etkileşim serilerinin koleksiyonudur." Senaryo 1 - a Senaryo 1 - b Senaryo 1 - c Senaryo 1 - d Senaryo 1 - e Senaryo 2 - a Senaryo 2 - b Senaryo 2 - c Senaryo 2 - d Aktör Birincil Aktör ve Sistemin Sınırları • Üzerinde çalıştığımız sistemi hangi düzeyde incelediğimize ve sınırlarını ne şekilde çizdiğimize bağlı olarak birincil aktörler değişiklik gösterir. • Kullanım senaryolarını yazarken sistemin sınırlarını doğru olarak belirlemek, nelerin dışarıda nelerin içeride olacağına doğru karar vermek gerekir. Birincil Aktör ve Sistemin Sınırları Birincil Aktör ve Sistemin Sınırları Birincil Aktör ve Sistemin Sınırları Birincil Aktör ve Sistemin Sınırları Kullanım Senaryolarının Yazılması • İhtiyaçların ve istenen özelliklerin listelenmesi şeklinde DEĞİL. • Sistem kara kutu olarak ele alınır. Sistemin iç yapısı görülmez, sistemin dışarıya (aktörlere) karşı sorumlulukları ifade edilir. • Aktörler ile sistem arasındaki etkileşim etken cümleler ile ifade edilir. • "Ne yapar?" sorusu cevaplanır, "Nasıl yapar?" değil. Kullanım Senaryolarının Yazılması • Sistemin sorumluluklarını nasıl yerine getireceği daha sonra gelinecek olan tasarım aşamasında ele alınacak bir problemdir. • Kullanım senaryolarını yazdığımız şimdiki aşamada ise sadece istekler anlaşılmaya çalışılıyor. • Sistemin bitmiş hali hayal edilerek bu sistem çalıştığında oluşabilecek senaryolar yazılır. Kullanım Senaryolarında Yer Alan Bölümler • Her kullanım senaryoları grubunun (use case) bir adı ve numarası vardır. İsimden sonra şağıdaki bölümler gelir. Önsöz (Preface) Bölümü Önsöz (Preface) Bölümü • Birincil aktör, destek aktörü ve diğer aktörlerin belirlenmesi sistemin sınırlarını çizer. • Kullanım senaryoları ilgililerin (aktörlerin) tüm beklentilerini karşılayan tüm olayları ve sadece onları içerir. • Tüm ilgililerin ve beklentilerin ilk başta belirlenmesi önemlidir. • Aksi durumda senaryolarda bazı durumlar unutulabilir ve bu eksiklik ancak ileriki aşamalarda anlaşılabilir. Ana Başarılı Senaryo (Temel Akış) Bölümü Ana Başarılı Senaryo (Temel Akış) Bölümü Uzantılar (Alternatif Akışlar) Bölümü Uzantılar (Alternatif Akışlar) Bölümü Diğer Bölümler Sıra Dışı Durumlar Bölümü (Exceptions) : • Sistemde hatalar oluştuğunda yapılacaklar sıralanır. Bazı tasarımcılar bu bölümdeki olayları da uzantılar bölümünde ele alırlar. Özel İstekler Bölümü (Special Requirements) : • İşlevler ile ilgili olmayan istekler bu bölümde belirtilir. Bu istekler genellikle hız, güvenilirlik, rahat kullanım gibi kalite kriterlerine yöneliktir. Teknolojik Beklentiler Bölümü : • Kullanıcıların ön gördükleri donanım özellikleri burada sıralanır. Örneğin giriş/çıkış işlemlerinin hangi cihazlar ile yapılması istendiği bu bölüme yazılır. ÖRNEK • Senaryo Grubu (Use Case) SG1: Satış İşlemleri • Konu: Market Sistemi • Birincil Aktör: Kasa Görevlisi • İlgililer (Aktörler) ve Beklentileri (Stakeholders and Interests): Kasa Görevlisi: Bilgilerin doğru ve hızlı girilmesi, toplamın doğru hesaplanması, para üstünün doğru hesaplanması Satış Elemanı: Komisyonun doğru hesaplanması ve kayıt edilmesi Müdür: Yetkili işlemleri (kasa görevlisinin yapamadığı) kolaylıkla yapabilmek ÖRNEK • İlgililer (Aktörler) ve Beklentileri (Stakeholders and Interests): Vergi Dairesi: Vergilerin doğru hesaplanabilmesi ve toplanabilmesi Kredi Kartı Asıllama Merkezi: Ödeme bilgilerinin doğru formatta gelmesi ve asıllama bilgilerinin kayıt edilmesi ÖRNEK • Ön Koşullar (Preconditions): Kasa görevlisi sisteme giriş yapmıştır. • Son Koşullar (Postconditions): Satış bilgileri kayıt edilmiştir. Vergi doğru olarak hesaplanmıştır. Muhasebe ve envanter kayıtları güncellenmiştir. Komisyon kayıt edilmiştir. Fatura oluşturulmuştur. Kredi kartı onayı kayıt edilmiştir. ÖRNEK • Ana Başarılı Senaryo (Doğal Akış) ÖRNEK • Ana Başarılı Senaryo (Doğal Akış) ÖRNEK • Uzantılar (Alternatif Akışlar): •*a. Herhangi bir anda müdür yetkili bir işlem yapmak ister ve şifresini girer: 1.Sistem müdür-yetkisi konumuna geçer. 2.Müdür yetkili bir işlem gerçekleştirir. Örneğin satışı iptal eder, bir ürünün fiyatını indirir vs. 3.Müdür sistemden çıkar. 4.Sistem normal konuma (kasa görevlisi yetkisi) geçer. ÖRNEK Uzantılar (Alternatif Akışlar): •*b. Herhangi bir anda sistemde bir hata oluşur: Bu durumlarda bilgilerin kayıt edilmesi ve sistemin kaldığı yerden devam edebilmesi istenir. 1. Kasa görevlisi sistemi yeniden başlatır, sisteme giriş yapar ve sistemin önceki durumdan devam etmesini ister. 2. Sistem önceki durumu oluşturur. 2a. Sistem önceki durumu oluştururken anormallik sezer. 1. Sistem hata uyarısı verir, hatayı kayıt eder ve temiz (başlangıç) duruma geçer. 2. Kasa görevlisi yeni bir satış başlatır. ÖRNEK Uzantılar (Alternatif Akışlar): 3a. Geçersiz bir ürün kodu (Sistemde bulunamadı): 1. Sistem hata uyarısı verir, ürünü reddeder. 2. Kasa görevlisi hataya tepki verir: 2a. Ürünün üstünde okunabilir bir kod vardır: 1. Kasa görevlisi kodu sisteme elle (manual) girer. 2. Sistem ürünün tanıtıcı bilgisini ve fiyatını gösterir. 2b. Ürünün üstünde kod yoktur, ama fiyatı yazılıdır: 1. Kasa görevlisi müdürden yetkili bir işlem yapmasını ister. 2. Müdür şifresini girer. 3. Kasa görevlisi fiyatı elle girer. ÖRNEK • Uzantılar (Alternatif Akışlar): 3b. Aynı üründen bir taneden fazla alınmıştır (5 şişe içecek): 1. Kasa görevlisi ürün kodunu ve adetini sisteme girer. 3-6a. Müşteri kasa görevlisine bir ürünü almaktan vazgeçtiğini söyler: 1. Kasa görevlisi satıştan çıkarılacak ürünün kodunu sisteme girer. 2. Sistem ürünü satıştan çıkarır ve geçerli toplamı gösterir. 3-6b. Müşteri alışverişten vazgeçtiğini söyler: 1. Kasa görevlisi satışı iptal eder. ÖRNEK 5. Müşteri indirim hakkı olduğunu söyler (müşteri kartına sahiptir): 1. Kasa görevlisi müşteri kodunu sisteme girer. 2. Sistem indirimi uygular ve yeni toplamı gösterir. 7a. Nakit ödeme: 1. Kasa görevlisi ödenen nakit miktarı sisteme girer. 2. Sistem para üstünü gösterir ve para çekmecesini açar. 3. Kasa görevlisi müşteriden ödemeyi alır ve para üstünü verir. 4. Sistem nakit ödemeyi kayıt eder. 7b. Kredi kartı ile ödeme: 1. .... 7c. Çek ile ödeme: 1. ÖRNEK • Özel İstekler (Special Requirements): • Düz kare monitör. Yazılar 1 metre uzaklıktan okunabilmeli. • Kredi kartı sorgulamasının cevabı en geç 30 saniyede gelmeli. • .... ÖRNEK • Teknolojik Beklentiler (Technology Variations List): •*a. Müdür kendisini sisteme bir kart okutarak ya da tuş takımından şifresini girerek tanıtır. 3a. Ürün kodları bir barkod okuyucu ile veya tuş takımından elle girilebilir. 7b. Kredi kartı bilgiler kart okuyucu ile veya tuş takımından elle girilebilir. • ....