Componente. Analiză (funcţională / OO) Descompunere. Sub-funcţie B

Benzer belgeler
POO Laborator 3 Metode si constructori. Supraincarcarea numelor. Relatii intre clase: asocierea si utilizarea

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

LED-uri integrate pentru indicarea starii sistemului Tümleşik Durum LED i. Carcasa turnata Muhafaza birimi. Grad de protectie IP67 Hava ısıtıcı / P67

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

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

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

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.

JAVA ile DAĞITIK PROGRAMLAMA

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

Dağıtık Sistemler CS5001

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

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

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

ByteArrayOutputStream

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Progress Barlı, FTP Dosya Upload Appleti

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

İÇİNDEKİLER VII İÇİNDEKİLER

BufferedReader. Kılgıladığı Arayüzler: Closeable, AutoCloseable, Readable. Altsınıfları: LineNumberReader. Bildirimi: public class BufferedReader

BİL132 Bilgisayar Programlama II

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Veri Yapıları ve Algoritmalar dönem

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

InputStream Sınıfı. Class InputStream. java.io. java.lang.object java.io.inputstream. Kılgıladığı Arayüzleri: Closeable, AutoCloseable

Spring Framework Eğitimi

Yigin & Kuyruk {\} /\ Suhap SAHIN Onur GÖK

Scanner Sınıfı. Class Scanner. java.util. java.lang.object java.util.scanner. Kılgıladığı Arayüzler: Closeable, AutoCloseable, Iterator<String>

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

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

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

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;

Soket, bir sunucu programı ve bir veya birden çok istemci programı arasında çift yönlü iletişim kuran bir yazılım uç noktasıdır.

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

İki Yöntem. Komposizyon (Composition) Kalıtım (Inheritance)

Sınıfların Tekrardan Kullanılması. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 5 1

BİL-141 Bilgisayar Programlama I (Java)

protected Reader() Karekter akımı okumak için Reader nesnesi yaratır. Yaratılan nesne kendi kendisiyle eşzamanlı olur.

İST 264 VERİ YAPILARI Bitirme Sınavı A Grubu

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui

CONDIȚII DE UTILIZARE A APLICAȚIEI BiP

// hataları işaret eden referans

İlgili Konular: Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

YZM 2116 Veri Yapıları

İ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İ

Đlgili konular: Collection, Set, HashSet, Comparable, Comparator, TreeMap, Collections.synchronizedSortedSet(SortedSet), Serialized Form

5 INTERACŢIUNI HTML...30

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

Alıştırmalar 2 - Dağıtık Sistemler. Alıştırma 2. Prof. Dr. Th. Letschert Çeviri: Turgay Akbaş FB MNI 16. Mai 2013

EVO-JET brülör, kolay kurulum ve bakım için modüler yapıda imal edilmiştir.

Securitatea Conținutului Multimedia

Class HashMap. Class HashMap java.lang.object java.util.abstractmap java.util.hashmap. Kılgıladığı Arayüzler: Cloneable, Map, Serializable

MOBIL UYGULAMA GELIŞTIRME

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

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

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


Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Class Vector. Class Vector java.lang.object java.util.abstractcollection java.util.abstractlist java.util.vector. Kılgıladığı arayüzler:

Görsel Programlama. Temel Veri Tipleri, Değişkenler, Operatörler, Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc

Class LinkedHashMap. Class LinkedHashMap java.lang.object java.util.abstractmap java.util.hashmap java.util.linkedhashmap. Kılgıladığı arayüzler:

Arasınav Örnek Soruları Bahar 2018

JAVA DA İSTİSNALAR VE DOSYA İŞLEMLERİ. Yrd. Doç.Dr. İlhan AYDIN

Dağıtık Sistemler CS5001

Java Programlama. Diziler, Döngüler ve Karakter Katarları (String Sınıfı)

Dizi ( Array ) ve Dizgi ( String )

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

BİL-141 Bilgisayar Programlama I (Java)

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Nesneye yönelik: Javada herşey bir nesnedir. Java nesne yönelimli olduğu için kolayca geliştirilebilir.

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.

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

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

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

BİL-141 Bilgisayar Programlama I (Java)

POLITICA BiP PRIVIND PROTECȚIA DATELOR

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

JAVA DEĞİŞKEN VE OPERATÖRLER. M.İLKUÇAR - 1

BM-209 Nesne Yönelimli Programlama

Örnek 1: Programı yazın ve çalıştırın.

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui

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

Intercepting Filter Tasarım Şablonu KurumsalJava.com

Java: printf() Metodu İle Çıktıyı Biçemleme

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

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

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

USOCK Uygulama Bağımsız Mesajlaşma Altyapısı

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

VERİ YAPILARI DERS NOTLARI BÖLÜM 5 QUEUE (KUYRUK) Yard. Doç. Dr. Deniz KILINÇ

VERİ YAPILARI DERS NOTLARI BÖLÜM 4 STACK (YIĞIN, YIĞIT) Yard. Doç. Dr. Deniz KILINÇ

Java. Mustafa OF. Kocaeli Üniversitesi Kocaeli Meslek Yüksekokulu (Mart 2007)

MG5000 MG5050 SP5500 SP6000 SP7000. Ghid de utilizare. Armat întotdeauna, Niciodată dezarmat

Java Nitelemleri. Bölüm 1

D İ Z İ L E R A R R A Y S

Stack Islemleri. Postfix ve Infix notasyonlari. Stack ozellikleri

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

BMM3101 PROGRAMLAMA DİLLERİ

BİL-141 Bilgisayar Programlama I (Java)

Transkript:

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Proces de construcţie prin descompunere-reunire (top-down) generic Specificatii Descompunere funcţională ierarhică Funcţie principală Analiză (funcţională / OO) Proiect Descompunere (funcţională / OO) Componente Produs Construcţie a Compunere componentelor (integrare) Descompunere în societati de obiecte Actionare Buton Aprindere Sub-funcţie A Sub-funcţie B Deplasare Utilizator Deschidere Lift Cabină Sub-funcţie A Sub-funcţie A Sub-funcţie B Sub-funcţie B (sistem) Uşă. Clasa = tipul (domeniul de definitie) pentru variabile numite obiecte. ul = reprezentare abstractă a unor entităţi reale sau virtuale, caracterizată de: - identitate, prin care e deosebit de alte obiecte, implementata ca variabila referinta la obiect, - comportament (vizibil), accesibil altor obiecte, implementata ca set de functii membru = operatii, metode, - stare internă (ascunsă), proprie obiectului, implementata ca set de variabile membru = atribute, campuri.. Definitia clasei in Java: class Nume { // declaratie tip de date / structura de date tip atribut; // declaratie variabila membru, camp Java tipreturnat operatie(tipparametru parametruformal) { // semnatura metoda Java // corpul functiei membru (metodei) returneaza valoare de tipul tipreturnat. Declararea variabilei referinta la un obiect Java si crearea dinamica a obiectului: NumeClasa nume; // declararea variabilei referinta la obiect nume = new NumeClasa(tipParametru parametruactual); // crearea dinamica a obiectului operatie(parametruformal : tipparametru) : tipreturnat - UML: clasa obiectul: public class Point { // atribute (variabile membru) private int x; private int y; // operatie care initializeaza atributele = constructor Java public Point(int abscisa, int ordonata) { x = abscisa; y = ordonata; // operatii care modifica atributele = metode (functii membru) public void moveto(int abscisanoua, int ordonatanoua) { x = abscisanoua; y = ordonatanoua; public void movewith(int deplasareabsc, int deplasareord) { x = x + deplasareabsc; y = y + deplasareord; // operatii prin care se obtin valorile atributelor = metode Java public int getx() { return x; public int gety() { return y; 0 0 atribut : tip Nume Declaratii (specificare) variabile Semnaturi (declaratii, specificari) operatii + Implementari (corpuri) operatii public class RunPoint { // clasa de test pentru clasa Point private static Point puncta; // atribut de tip Point public static void main(string[] args) { // declaratie metoda // corp metoda puncta = new Point(, ); // alocare si initializare atribut puncta puncta.moveto(, ); // trimitere moveto() catre puncta puncta.movewith(, ); // trimitere movewith() catre puncta Bec nume : NumeClasa

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc 0 RunPoint + main(). Crearea unui obiect p de tip Point ale carui atribute au valorile x= si respectiv y= : Point p = new Point(, ); ul p de tip Point incapsuleaza informatiile unui punct in plan de coordonate {,. Starea obiectului p este perechea de coordonate {,.. Schimbarea starii obiectului p in {,, prin deplasarea ordonatei (departarea cu de abscisa). Point p = new Point(, ); p.moveto(, ); x = y =. Mesajul selecteaza operatia si declanseaza comportamentul (activeaza operatia, prin invocarea / apelul metodei / functiei membru): RunPoint Point - x : int - y : int -puncta + Point(abscisa : int, ordonata : int) + moveto(abscisanoua : int, ordonatanoua : int) : void + getx() : int + gety() : int + movewith(deplasareabsc : int, deplasareord : int) : void p : Point x = y = : moveto(, ) : movewith(, ) p : Point dupa operatia moveto(,) puncta : Point moveto() Mesajul selecteaza comportamentul movewith(). Starea si comportamentul sunt dependente. Comportamentul la un moment dat depinde de starea curenta. Starea poate fi modificata prin comportament. Aterizare x = y = p : Point : Avion In zbor : Turn de control Decolare : Avion La sol In starea In zbor doar comportamentul Aterizare e posibil. El duce la schimbarea starii (in La sol ). Dupa aterizare, starea fiind La sol, operatia Aterizare nu mai are sens.. Sistemele software OO sunt societăţi de obiecte care colaborează pentru a realiza funcţiile aplicaţiei. Decuplare intre obiecte utilizator Referinţă Legătură Mesaj Interacţiune a obiectelor Comunicaţie între obiecte Operaţie Declanşare (executie) tinta comportament global al sistemului (scenarii = secvenţe de e = colaborări între obiecte) Colaborare între obiecte

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Elementele declaratiilor: import java.util.vector; // clase importate import java.util.emptystackexception; public class Stack // declaratia clasei { // inceputul corpului clasei private Vector elemente; // atribut (variabila membru) public Stack() { // constructor 0 elemente = new Vector(0); // (functie de initializare) public Object push(object element) { // metoda elemente.addelement(element); // (functie membru) return element; public synchronized Object pop(){ // metoda int lungime = elemente.size(); // (functie membru) 0 Object element = null; if (lungime == 0) throw new EmptyStackException(); element = elemente.elementat(lungime - ); elemente.removeelementat(lungime - ); return element; public boolean isempty(){ // metoda if (elemente.size() == 0) // (functie membru) 0 return true; else return false; // sfarsitul corpului clasei Declaratia de clasa [public] [abstract] [final] class NumeClasa [extends NumeSuperclasa] [implements NumeInterfata [, NumeInterfata]] { // Corp clasa Declaratia de camp (atribut) [nivelacces] [static] [final] tipatribut numeatribut; Declaratia de constructor [nivelacces] NumeClasa( listaparametri ) { // Corp constructor Declaratia de metoda (operatie) [nivelacces] [static] [abstract] [final] [synchronized] tipreturnat numemetoda ( [listadeparametri] ) [throws NumeExceptie [,NumeExceptie] ] { // Corp metoda Scopul variabilelor

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Exemplu 0 0 public class Complex // declaratia clasei { // inceputul corpului clasei private double real; // real = atribut (camp) private double imag; // imag = atribut (camp) public void setreal(double real) { this.real = real; public void.setimag(double imag) { this.imag = imag; // metoda, real = parametru // real = atributul, real = parametrul // metoda, imag = parametru // imag = atributul, imag = parametrul public static void main(string[] args) { // metoda, args = parametru double real = Double.parseDouble(args[0]); // real = variabila locala double imag = Double.parseDouble(args[]); // imag = variabila locala Complex c = new Complex(); c.setreal(real); c.setimag(imag); // c = variabila locala // c, real = variabilele locale // c, imag = variabilele locale System.out.println("{" + c.real + // c.real = atributul lui c ", " + c.imag + ""); // c.imag = atributul lui c // sfarsitul corpului clasei Clasa contine generalitatile (abstractiile generale), obiectele contin particularitatile (detaliile particulare). = generalităţi (elemente, aspecte, caracteristici comune) Clasă = particularităţi (elemente, aspecte, caracteristici diferite) O parte din codul clasei DatagramPacket (continuturile anumitor metode au fost simplificate): 0 0 0 package java.net; // Importul pachetulului de clase Java pentru comunicatii IP public final class DatagramPacket { // incapsuleaza pachete UDP (datagrame) // Atribute, accesibile tuturor claselor din pachetul (directorul) java.net byte[] buf; // tabloul de octeti care contine datele pachetului int offset; // indexul de la care incep datele pachetului int length; // numarul de octeti de date din tabloul de octeti int buflength; // lungimea tabloului de octeti InetAddress address; // adresa IP a masinii sursa/destinatie a pachetului int port; // portul UDP al masinii sursa/destinatie a pachetului // Constructori initializeaza obiectele de tip DatagramPacket // Initializeaza un DatagramPacket pentru pachete de receptionat, public DatagramPacket(byte buf[], int length) { this.buf = buf; this.length = length; this.buflength = length; this.offset = 0; this.address = null; this.port = -; // Initializeaza un DatagramPacket pentru pachete de trimis public DatagramPacket(byte buf[], int length, InetAddress address, int port) { this.buf = buf; this.length = length; this.buflength = length; this.offset = 0; this.address = address; this.port = port; // Alti constructori, alte metode... // Returneaza adresa IP a masinii sursa/destinatie a acestui pachet public synchronized InetAddress getaddress() { return this.address; // Stabileste adresa IP a masinii sursa/destinatie a acestui pachet public void setaddress(inetaddress iaddr) { this.address = iaddr;

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Cod care utilizeaza clasa DatagramPacket: byte[] buffer = new byte[0]; // buffer date (de trimis/primit) DatagramPacket packetdetrimis = new DatagramPacket(buffer, buffer.length, InetAddress.getByName( nume.elcom.pub.ro ), 000); DatagramPacket packetdereceptionat = new DatagramPacket(buffer, buffer.length); Specificatia generala a unei clase Complex (interfata publica) = API-ul (Application Programming Interface): public class Complex { // Atribute private (ascunse, inaccesibile din exteriorul clasei) // Constructor initializeaza obiectele de tip Complex public Complex(double real, double imag) { // Implementare public double getreal() { // Implementare // Returneaza partea reala public double getimag() { // Implementare // Returneaza partea imaginara public double getmodul() { // Implementare // Returneaza modulul public double getfaza() { // Implementare // Returneaza faza Urmatorul cod Java va conduce la acelasi rezultat, indiferent de implementarea clasei Complex: Complex c = new Complex(, -); System.out.println( Coordonatele carteziene: { + c.getreal() +, + c.getimag() + ); System.out.println( Coordonatele polare: { + c.getmodul() +, + c.getfaza() + ); Implementarea carteziana a clasei Complex (atributele ascunse sunt coordonatele carteziene): public class Complex { private double real; // partea reala (abscisa) private double imag; // partea imaginara (ordonata) public Complex(double real, double imag) { this.real = real; this.imag = imag; public double getreal() { return this.real; public double getimag() { return this.imag; 0 public double getmodul() { return Math.sqrt(this.real*this.real + this.imag*this.imag); public double getfaza() { return Math.atan(this.real, this.imag); Implementarea polara a clasei Complex (atributele ascunse sunt coordonatele polare): public class Complex { private double modul; // modulul (raza) private double faza; // faza (unghiul) public Complex(double real, double imag) { this.modul = Math.sqrt(real*real + imag*imag); this.faza = Math.atan(real, imag); public double getreal() { return this.modul*math.cos(this.faza); public double getimag() { return this.modul*math.sin(this.faza); 0 public double getmodul() { return this.modul; public double getfaza() { return this.faza; In cazul de mai sus: specificaţia nu este afectată de schimbarea reprezentării interne (polară sau carteziană), obiectele utilizator al obiectelor instanţe ale clasei numerelor complexe cunosc doar specificaţia şi nu sunt nici ele afectate de schimbarea reprezentării interne. Agregarea exprimă cuplajul strâns între clase (subordonare: master-slave, întreg-părţi, ansamblu-componentă ). ClasaAgregat java.lang.system +out ClasaSubordonata In UML: Exemplu: java.io.printstream + println()

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Mostenirea in UML: java.lang.object + tostring() + equals() +...() ClasaNoua ClasaAbstracta + metodaneimplementata() : void ClasaConcreta + metodaneimplementata() : void metodaneimplementata() este aici implementata! Declaratia: class NumeClasa { // urmeaza corpul clasei... este echivalenta cu: class NumeClasa extends Object { // urmeaza corpul clasei... Metoda tostring() // Implementarea implicita a metodei tostring(), mostenita de la clasa Object public String tostring() { // (nu returneaza continutul ci numele clasei si codul obiectului!) return getclass().getname() + "@" + Integer.toHexString(hashCode()); Metoda equals() implicita // Implementarea implicita a metodei equals(), mostenita de la clasa Object public boolean equals(object obj) { return (this == obj); // (nu compara continutul ci referintele!!!) Metoda equals() din clasa String 0 0 // Implementarea explicita a metodei equals() in clasa String public boolean equals(object obj) { // se verifica existenta unui parametru (obiect) non-null // si faptul ca parametrul e obiect al clasei String if ((obj!= null) && (obj instanceof String)) { String otherstring = (String)obj; // conversie de tip int n = this.count; if (n == otherstring.count) { // se compara numarul de caractere char v[] = this.value; char v[] = otherstring.value; int i = this.offset; int j = otherstring.offset; while (n--!= 0) if (v[i++]!= v[j++]) return false; // se compara caracterele return true; return false; Clasa abstracta, de baza public abstract class Multime { // clasa declarata abstract protected Object[] elemente; // campuri declarate protected pentru a protected byte numarelem; // putea fi reutilizate in clasa derivata public Multime(Object[] elemente) { // parametru generic tip Object[] this.elemente = elemente; // acces la obiectul curent cu this numarelem = (byte) elemente.length; // conversie de tip de la int la byte 0 public abstract Multime intersectiecu(multime m); // declarata abstract (NEIMPLEMENTATA) // valoare returnata generica tip Multime public Object[] obtinereelemente() { // valoare returnata generica tip Object[] return elemente; // (MOSTENITA in clasa MultimeIntregi) public byte numarelemente() { // implementare de baza return numarelem; // (RESCRISA in clasa MultimeIntregi)

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Clasa concreta, derivata public class MultimeIntregi extends Multime { public MultimeIntregi(Integer[] elemente) { // parametru concret tip Integer[] super(elemente); // apelul constructorului clasei de baza Multime public final Multime intersectiecu(multime m) { // declarata abstract in clasa de baza Integer[] elementeintersectie; // aici devine concreta (IMPLEMENTATA) int nrelemente = 0; for (int i=0; i< elemente.length; i++) for (int j=0; j< m.elemente.length; j++) 0 if (elemente[i].equals(m.elemente[j])) nrelemente++; int index = 0; elementeintersectie = new Integer[nrElemente]; for (int i=0; i< elemente.length; i++) for (int j=0; j< m.elemente.length; j++) if (elemente[i].equals(m.elemente[j])) elementeintersectie[index++] = new Integer(elemente[i].toString()); 0 return new MultimeIntregi(elementeIntersectie); public byte numarelemente() { // reimplementare cod (RESCRIERE) return (byte) elemente.length; // conversie de tip de la int la byte public boolean contine(int intr) { // metoda noua (EXTENSIE) for (int i=0; i< elemente.length; i++) { Integer inte = (Integer) elemente[i]; 0 if (inte.intvalue() == intr) { return true; return false; Extindere prin mostenire, supraincarcare a metodelor, rescriere a metodelor, ascundere a atributelor: 0 public class ClasaDeBaza { protected int atributmostenit; protected byte atributascuns; // atribut partajat cu subclasa // atribut corespunzator clasei de baza public void metodamostenitasupraincarcata() { // implementare corespunzatoare lipsei parametrilor public void metodamostenitasupraincarcata(int argument) { // implementare corespunzatoare parametrului de tip int public void metodarescrisa() { // implementare de baza 0 0 public class ClasaCareExtinde extends ClasaDeBaza { protected byte atributascuns; // atribut corespunzator subclasei protected long atributnou; // atribut nou, nepartajat cu clasa de baza public void metodarescrisa() { // reimplementare (rescriere a codului) public void metodanoua() { // metoda noua, nepartajata cu clasa de baza public class UtilizareClase { public static void main(string[] args) { ClasaDeBaza obiectdebaza = new ClasaDeBaza(); obiectdebaza.atributmostenit obiectdebaza.atributascuns // clasa de baza (extinsa) // utilizarea atributului partajat cu subclasa // utilizarea atributului din clasa de baza // apelurile metodelor (din clasa de baza) care supraincarca acelasi nume obiectdebaza.metodamostenitasupraincarcata() obiectdebaza.metodamostenitasupraincarcata(000) // apelul metodei din clasa de baza (implementare de baza) obiectdebaza.metodarescrisa()

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc 0 0 ClasaCareExtinde obiectextins = new ClasaCareExtinde(); obiectextins.atributnou obiectextins.atributmostenit obiectextins.atributascuns super.atributascuns // apelul metodei noi din subclasa obiectextins.metodanoua() // subclasa // utilizarea atributului nou // utilizarea atributului partajat // utilizarea atributului din subclasa // utilizarea atributului din clasa de baza // apelurile metodelor (din clasa de baza) care supraincarca acelasi nume obiectextins.metodamostenitasupraincarcata() obiectextins.metodamostenitasupraincarcata(000) // apelul metodei din subclasa (implementarea noua, rescrisa) obiectextins.metodarescrisa() // apelul metodei din clasa de baza (implementare de baza) super.metodarescrisa() Implementarea unei interfete de tip stiva: 0 0 public interface StackInterface { boolean empty(); void push( Object x); Object pop() throws EmptyStackException; Object peek() throws EmptyStackException; public class Stack implements StackInterface { private Vector v = new Vector(); // utilizeaza clasa java.util.vector public void push(object item) { v.addelement(item); public Object pop() { Object obj = peek(); v.removeelementat(v.size() - ); return obj; public Object peek() throws EmptyStackException { if (v.size() == 0) throw new EmptyStackException(); return v.elementat(v.size() - ); public boolean empty() { return v.size() == 0; public class Stack extends Vector implements StackInterface { public Object push(object item) { addelement(item); return item; public Object pop() { Object obj; int len = size(); obj = peek(); removeelementat( len - ); return obj; public Object peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementat( len - ); public boolean empty() { return size() == 0; Vector v = new Stack(); // cod legal referinta la clasa de baza // poate fi initializata cu obiect din subclasa v.insertelementat(x, ); // cod legal dar inserarea unui obiect in stiva // incalca principiul de functionare al stivei Constrangeri ale tipurilor valorilor returnate (constrangeri similare exista pentru tipurile parametrilor) Tip nepermis Superclasa Tip posibil Subclasa public Number returnanumber() { //...

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Asocierile bidirectionale intre doua clase corespund situatiei in care ambele clase au referinte una catre cealalta. Diagrama UML: ConstructiePachet producator consumator LivrarePachet + crearepachet() + trimiterepachet() public void crearepachet() { // creare consumator.trimiterepachet() public void TrimiterePachet() { // trimitere producator.crearepachet() are drept corespondent codul Java: public class ConstructiePachet { LivrarePachet consumator; public void crearepachet( /* eventuali parametri */ ) { // creare consumator.trimiterepachet() public class LivrarePachet { ConstructiePachet producator; public void trimiterepachet( /* eventuali parametri */ ) { // trimitere producator.crearepachet() Generalizarea = extragerea elementelor comune (atribute, operaţii şi constrângeri) ale unui ansamblu de clase într-o nouă clasă mai generală, denumită superclasă, - superclasa este o abstracţie a subclaselor ei, - arborii de clase sunt construiţi pornind de la frunze - utilizată cand elementele modelului au fost identificate, pentru a obţine o descriere detaşată a soluţiilor - semnifică "este un (fel de)" sau "este ca", şi priveşte doar clasele, adică nu este instanţiabilă Clasă Clasă Clasă nouă = superclasă (generalităţi, elemente comune) De fapt, generalizarea actioneaza in OO la doua niveluri: - clasele sunt generalizari ale ansamblurilor de obiecte (un obiect este de felul specificat de o clasa), - superclasele sunt generalizari de clase (obiectele de felul specificat in clasa sunt si de felul specificat in superclasa). Limbajele OO ofera ambele mecanisme de generalizare. Limbajele care ofera doar constructii numite obiecte (si eventual clase) se pot numi limbaje care lucreaza cu obiecte (si eventual clase). Specializarea = capturarea particularităţilor unui ansamblu de obiecte ale unei clase existente, noile caracteristici fiind reprezentate într-o nouă clasă mai specializată, denumită subclasă, - utilă pentru extinderea coerentă a unui ansamblu de clase - bază a programării prin extindere şi a reutilizării, noile cerinţe fiind încapsulate în subclase care extind în mod armonios (coerent) funcţiile existente Clasă nouă = subclasă (particularităţi, specializare) Clasă

Extras Curs ISw-00 00-00 0/ //00 00 Extras curs ISw.doc Moştenirea = tehnică de generalizare oferită de limbajele OO pentru a construi o clasă pornind de la una sau mai multe alte clase, partajând atributele, operaţiile şi uneori constrângerile, într-o ierarhie de clase. Diagramei UML: ii corespunde codul Java: 0 0 # elemente : Object[] # numarelem : byte Multime + Multime(elemente : Object[]) + intersectiecu(m : Multime) : Multime + obtinereelemente() : Object[] + numarelemente() : byte public abstract class Multime { protected Object[] elemente; protected byte numarelem; public Multime(Object[] elemente) { this.elemente = elemente; numarelem = (byte) elemente.length; // clasa declarata abstract // parametru generic tip Object[] // acces la obiectul curent cu this // conversie de tip de la int la byte public abstract Multime intersectiecu(multime m); // metoda declarata abstract // valoare returnata generica tip Multime public Object[] obtinereelemente() { // valoare returnata generica tip Object[] return elemente; public byte numarelemente() { return numarelem; Multime # elemente : Object[] # numarelem : byte // implementare de baza + Multime(elemente : Object[]) + intersectiecu(m : Multime) : Multime + obtinereelemente() : Object[] + numarelemente() : byte MultimeIntregi MultimeDouble + MultimeIntregi(elemente : Integer[]) + intersectiecu(m : Multime) : Multime + numarelemente() : byte + contine(intr : int) : boolean Diagramei UML: ii corespunde codul Java: 0 public class MultimeIntregi extends Multime { + MultimeDouble(elemente : Double[]) + intersectiecu(m : Multime) : Multime public MultimeIntregi(Integer[] elemente) { // parametru concret tip Integer[] super(elemente); // apelul constructorului clasei de baza Multime cu super public final Multime intersectiecu(multime m) { // implementarea metodei // declarata abstract in clasa de baza Multime mnoua; Integer[] elementeintersectie; int nrelemente = 0; for (int i=0; i< elemente.length; i++) { for (int j=0; j< m.elemente.length; j++) { if (elemente[i].equals(m.elemente[j])) { nrelemente++;

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc 0 0 0 int index = 0; elementeintersectie = new Integer[nrElemente]; for (int i=0; i< elemente.length; i++) { for (int j=0; j< m.elemente.length; j++) { if (elemente[i].equals(m.elemente[j])) { elementeintersectie[index++] = new Integer(elemente[i].toString()); mnoua = new MultimeIntregi(elementeIntersectie); return mnoua; public byte numarelemente() { return (byte) elemente.length; public boolean contine(int intr) { // metoda noua for (int i=0; i< elemente.length; i++) { Integer inte = (Integer) elemente[i]; if (inte.intvalue() == intr) { return true; return false; Diagramei UML: // reimplementare (rescriere cod) // conversie de tip de la int la byte MultimeIntregi + MultimeIntregi(elemente : Integer[]) + intersectiecu(m : Multime) : Multime + numarelemente() : byte + contine(intr : int) : boolean +intregi +intregi MultimeIntregiExtinsaPrinMostenire MultimeIntregiExtinsaPrinCompunere + MultimeIntregiExtinsaPrinMostenire(elemente : Integer[]) + sumaelemente() : int +$intregiderivati + MultimeIntregiExtinsaPrinCompunere(elemente : Integer[]) + sumaelemente() : int +$intregicompusi TestMultimeIntregi + main(args : String[]) : void + afisare(ia : Integer[]) : void + afisaredouble(da : Double[]) : void ii corespund codurile Java: - ale unei clase care extinde prin mostenire (extindere): 0 public class MultimeIntregiExtinsaPrinMostenire extends MultimeIntregi { public MultimeIntregiExtinsaPrinMostenire(Integer[] elemente) { super(elemente); public int sumaelemente() { // metoda noua int suma = 0; Integer[] ti = (Integer[]) elemente; // utilizare atribut mostenit elemente for (int i=0; i< ti.length; i++) { suma = suma + ti[i].intvalue(); return suma; - ale unei clase care extinde prin delegare (compunere):

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc 0 public class MultimeIntregiExtinsaPrinCompunere { public MultimeIntregi intregi; // obiect componenta public MultimeIntregiExtinsaPrinCompunere(Integer[] elemente) { intregi = new MultimeIntregi(elemente); public int sumaelemente() { // metoda noua int suma = 0; Integer[] ti = (Integer[]) intregi.obtinereelemente(); for (int i=0; i< ti.length; i++) { suma = suma + ti[i].intvalue(); return suma; - ale unei clase care permite testarea comportamentului (si compararea modului de utilizare) in cele doua cazuri: 0 0 public class TestMultimeIntregi { public MultimeIntregi intregi; public static MultimeIntregiExtinsaPrinMostenire intregiderivati; public static MultimeIntregiExtinsaPrinCompunere intregicompusi; public static void main(string[] args) { int i; Integer[] tabloua = { new Integer(), new Integer(), new Integer() ; MultimeIntregi multimea = new MultimeIntregi(tablouA); intregicompusi = new MultimeIntregiExtinsaPrinCompunere(tablouA); int suma = intregicompusi.sumaelemente(); System.out.println("Suma elementelor " + suma); intregiderivati = new MultimeIntregiExtinsaPrinMostenire(tablouA); suma = intregiderivati.sumaelemente(); System.out.println("Suma elementelor " + suma); Subclasele (clasele care extind prin mostenire) pot sa: - mareasca gradul de detaliere al obiectelor: - adaugand noi atribute, inexistente in clasa de baza (detaliere mai mare a starilor obiectelor in subclasa) - adaugand noi metode, inexistente in clasa de baza (detaliere mai mare a comportamentului in subclasa) - mareasca gradul de concretete a obiectelor: - implementand eventualele metode abstracte din clasa de baza (mai multa concretete a comportamentului) - introduca diferentieri ale obiectelor: - redeclarand unele atribute existente in clasa de baza (ascunderea hiding - atributelor cu acelasi nume), adica introducerea unei diferentieri a starii obiectelor din subclasa fata de cele din clasa de baza, - reimplementand unele metode existente in clasa de baza (rescrierea overriding - metodelor cu acelasi nume) adica introducerea unei diferentieri a comportamentului obiectelor din subclasa fata de clasa de baza Subclasele mostenesc toate: - atributele din clasa de baza care nu sunt ascunse prin redeclarare, - metodele din clasa de baza care nu sunt rescrise prin reimplementare. ele din subclasa au toate atributele declarate in clasa de baza, si pot utiliza toate metodele declarate in clasa de baza. Aceasta reutilizare a codului clasei de baza de catre subclase este principalul beneficiu al mostenirii. Subclasele nu mostenesc - constructorii clasei de baza (au constructori proprii), dar pot face apel la constructorii clasei de baza (daca se intampla acest lucru, apelul la constructorul clasei de baza, realizat prin apelul super(), trebuie sa fie prima declaratie din corpul constructorului subclasei), - atributele cu caracter global (static), - metodele cu caracter global (static). Membrii globali (statici) ai clasei de baza nu pot fi mosteniti de obiectele din subclasa (tin strict de clasa in care au fost declarati).

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Descrierea unui caz de utilizare trebuie sa cuprinda urmatoarele elemente:. Numele cazului de utilizare (cat mai sugestiv, pentru a sintetiza cazul de utilizare). Ex. Autentificarea utilizatorului. Scurta descriere a cazului de utilizare. Ex. Utilizatorul ii transmite sistemului datele necesare autentificarii, si in caz de succes capata drept de acces la sistem.. Actori (entitati exterioare sistemului modelat, implicate in cazul de utilizare). Ex. Utilizatorul. Preconditii (conditiile necesare pentru declansarea cazului de utilizare). Ex. Sistemul e aflat in executie, cunoaste datele necesare autentificarii Utilizatorului si ii ofera Utilizatorului o modalitate de a-i transmite aceste date.. Evenimentul care declanseaza cazul de utilizare (modul in care incepe cazul de utilizare). Ex. Utilizatorul cere autentificarea de catre sistem.. Descriere a interactiunii dintre actori si fiecare caz de utilizare (scenariul principal). Ex. I. Utilizatorul transmite datele necesare autentificarii de catre sistem. II. Sistemul verifica autenticitatea datelor primite de la Utilizator. III. Sistemul prezinta un de confirmare catre Utilizator. IV. Utilizatorul capata acces la sistem.. Alternative la cazul de utilizare principal (scenariile alternative si situatiile exceptionale). Ex.. Daca sistemul nu este lansat, autentificarea nu poate avea loc.. Daca sistemul nu cunoaste datele de autentificare, autentificarea esueaza.. Daca utilizatorul transmite in mod eronat datele de autentificare, autentificarea esueaza.. Evenimentul care produce oprirea cazului de utilizare (modul in care se incheie cazul). Ex. Utilizatorului i se prezinta un de confirmare.. Postconditii (efectele incheierii cazului de utilizare). Ex. Utilizatorul are acces la sistem. Este important sa fie clar prezentate: - schimburile de informatii (parametrii interactiunilor) Ex. datele necesare autentificarii, de confirmare - originea informatiilor si ordinea schimbarii lor Ex. Utilizatorul transmite datele necesare autentificarii - repetitiile comportamentului, prin constructii pseudocod - situatiile optionale Ex. Utilizatorul alege unul dintre a) optiunea X, b) optiunea Y, apoi continua cu Conectare Utilizator AltUtilizator Conversatie Caz de utilizare - Conectare. Nume (cat mai sugestiv, pentru a sintetiza cazul de utilizare). Ex. Conectare. Scurta descriere. Ex. Clientul se conecteaza la server, care accepta conexiunea si se pregateste pentru tratarea clientului.. Actori (entitati exterioare sistemului modelat, implicate in cazul de utilizare). Ex. Utilizator.. Preconditii (conditiile necesare pentru declansarea cazului de utilizare). Ex. Serverul e aflat in executie. Clientul cunoaste adresa si numarul de port pe care asculta serverul.. Evenimentul care declanseaza cazul de utilizare. Ex. Utilizatorul lanseaza componenta client a sistemului.. Descriere a interactiunii dintre actori si fiecare caz de utilizare. Ex. I. Utilizatorul lanseaza componenta client a sistemului, care se conecteaza la serverul cunoscut. Serverul accepta conexiunea si se pregateste pentru tratarea clientului. II. Clientul ofera o interfata grafica utilizatorului. Alternative la cazul de utilizare principal. Ex. Daca serverul nu este lansat, conectarea esueaza, iar clientul anunta acest lucru utilizatorului.. Evenimentul care produce oprirea cazului de utilizare. Ex. Clientul prezinta utilizatorului o interfata grafica.. Postconditii (efectele incheierii cazului de utilizare) Ex. Sistemul este pregatit pentru ca utilizatorul sa poata conversa cu alti utilizatori prin interfeta grafica

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Caz de utilizare - Conversatie. Nume Conversatie. Scurta descriere. Clientii preiau e de la utilizatori, le trimit catre server, care le difuzeaza catre toti clientii, iar acestia le prezinta catre utilizatori.. Actori Utilizatori. Preconditii Cazul de utilizare Conversatie s-a incheiat cu succes.. Evenimentul care declanseaza cazul de utilizare. Un utilizator scrie un in interfata grafica a clientului sau.. Descriere a interactiunii dintre actori si cazul de utilizare (Transmisie si receptie). I. Utilizatorul scrie ul in interfata grafica a clientului sau, clientul trimite ul la server. II. Clientul primeste inapoi ul difuzat de server, si prezinta ul in interfata grafica a utilizatorului. Alternativa la cazul de utilizare principal (Doar receptie). Clientul primeste ul trims de alt utilizator, difuzat de server, si prezinta ul in interfata grafica a utilizatorului sau.. Evenimentul care produce oprirea cazului de utilizare. Clientul a prezentat utilizatorului ul primit.. Postconditii Sistemul este pregatit pentru ca utilizatorul sa poata continua conversatia cu alti utilizatori prin intermediul interfetei grafice, sau pentru a incheia conversatia prin inchiderea interfetei grafice. Diagrama de secventa (MSC) si diagrama de comunicatie echivalenta faza de analiza, nivel sistem : Utilizator : SistemChat : AltUtilizator : : SistemChat : : Utilizator : : AltUtilizator Diagrama de secventa (MSC) faza de analiza, nivel subsisteme : Utilizator : Client : Server : Client : AltUtilizator

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Diagrama de secventa (MSC) faza de analiza, nivel subsisteme, detaliere suplimentara : Utilizator : Server : TratareClient : Client : AltUtilizator lansare : Client conectare : TratareClient creare Conectare Conversatie Diagrama de secventa (MSC) faza de proiectare, nivel subsisteme, detaliere suplimentara : Utilizator client : ClientDeChat_v firtratare : TratareClientDeChat_v server : ServerDeChat_v altfirtratare : TratareClientDeChat_v altclient : ClientDeChat_v : AltUtilizator main() conectare run( ) transmisie() difuzare() Conectare Conversatie transmisie() transmisie() Trimitere si receptie Receptie transmisie() difuzare() transmisie() transmisie()

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Diagrama de secventa (MSC) faza de proiectare, subsistemul client : ClientDeChat_v main() ClientDeChat_v() : Thread intextgrafic : outretea : inretea : JTextField DataOutputStream DataInputStream outtextgrafic : JTextArea run( ) start( ) gettext( ) writeutf( ) Conectare Conversatie flush( ) Trimitere si receptie readutf( ) append( ) Receptie readutf( ) append( ) Diagrama de secventa (MSC) faza de proiectare, subsistemul client : ServerDeChat_v firtratare : TratareClientDeChat_v ServerDeChat_v(int) inretea : DataInputStream outretea : DataOutputStream firdestinatie : TratareClientDeChat_v firdestinatie.outretea : DataOutputStream start run( ) difuzare() readutf( ) Conectare Conversatie writeutf( ) flush( ) writeutf( ) flush( ) Diagrama de clase subsistemul client JTextField (from swing) + gettext() -intextgrafic DataInputStream (from io) + readutf() -inretea ClientDeChat_v - proprietatisistem : Logical View::java::util::Properties - numeuser : Logical View::java::lang::String - adresalocala : Logical View::java::lang::String - portlocal : int + run() + ClientDeChat_v() + main() -$socket Socket (from net) -outtextgrafic JTextArea (from swing) + append() DataOutputStream (from io) + writeutf() + flush() -outretea

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Diagrama de clase subsistemul client DataInputStream (from io) DataOutputStream (from io) Socket (from net) -socket + readutf() -inretea + writeutf() + flush() -outretea -socket ServerDeChat_v + ServerDeChat_v() + main() TratareClientDeChat_v - listafire : Logical View::java::util::Vector = new Vector () -firtratare + TratareClientDeChat_v() + run() - difuzare() Diagrama masinii de stari a clientului:. Firul de executie care trateaza evenimentele din interfata grafica: StareInitiala new Socket() AsteptareEveniment conectare ActionEvent Conversatie terminare StareFinala ^intextgrafic().settext("") IOException TrimitereMesaj entry/ = intextgrafic.gettext() do/ ^outretea.writeutf() IOException. Firul de executie care trateaza receptia elor de la server: AsteptareDateRetea = inretea.readutf() ReceptieMesaj do/ ^outtextgrafic.append() IOException IOException Diagrama masinii de stari (FSM) a serverului, firul de executie principal (acceptor de conexiuni) StareInitiala StareFinala AsteptareCereri acceptareclient server.accept() CreareFirServireClient

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc Diagrama masinii de stari (FSM) a serverului, firul de tratare a clientilor: StareInitiala AsteptareDateRetea = inretea.readutf() [ conditie = true ] / firdestinatie = listafire.nextelement ^firdestinatie.writeutf() DifuzareMesaj IOException [ conditie = false ] entry/ conditie = listafire.hasmoreelements() IOException StareFinala Diagrama de activitati (organigrama) a clientului, cu firele de executie pe coridoare de activitate separate: FirGrafic FirReceptie Creare socket Creare fluxuri IO Initializari conexiune Creare intrare grafica Creare iesire grafica Initializari grafice Lansare interfata grafica AsteptareEveniment Lansare fir receptie ActionEvent Citire intrare grafica de text AsteptareDateRetea do/ = intextgrafic.gettext() Citire intrare retea Trimitere catre server do/ ^outretea.writeutf() do/ = inretea.readutf() Scriere in intrarea grafica de text do/ ^intextgrafic.settext("") Scriere in iesirea grafica de text do/ ^outtextgrafic.append() IOException

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc

Extras Curs ISw-00 00-00 0/ //00 00 Extras curs ISw.doc Diagrama de clase actualizata a clientului: JTextField (from swing) + gettext()() -intextgrafic -outtextgrafic JTextArea (from swing) + append() ClientDeChat_v - numeuser : Logical View::java::lang::String - adresalocala : Logical View::java::lang::String - portlocal : int - alticlienti : Logical View::java::util::Vector = new Vector () + run() + ClientDeChat_v() + main() Socket (from net) -$socket -inretea DataInputStream (from io) + readutf() -outretea DataOutputStream + writeutf() + flush() (from io) Diagrama de clase actualizata a serverului: DataOutputStream -socket Socket (from net) -socket DataInputStream (from io) + readutf() + writeutf() + flush() (from io) -inretea -outretea ServerDeChat_v + ServerDeChat_v() + main() TratareClientDeChat_v -firtratare- listaclienti : Logical View::java::util::Vector = new Vector () + TratareClientDeChat_v() + run() - difuzare() InfoClient nume : Logical View::java::lang::String adresa : Logical View::java::lang::String port : int + InfoClient() + tostring() + equals() -client

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc

Extras Curs ISw-00 00-00 / //00 00 Extras curs ISw.doc