Структурни диаграми по uml 0: Класова диаграма (Class diagram) Символи: (private) частен елемент: атрибут или метод



Дата06.01.2017
Размер112.9 Kb.
#12023
Структурни диаграми по UML 2.0:

Класова диаграма (Class diagram)

Символи:

- (private) - частен елемент: атрибут или метод;

+ (public) - публичен елемент;

# (protected) - защитен елемент;



Описание-пример:

Всяка ОО програмна система трябва да има следните характеристики:
1. абстракции чрез обекти;

2. затворени класове;

3. комуникация чрез съобщения;

4. време на съществуване на обектите;

5. класови йерархии;

6. полиморфизъм.


Дефиниция: ООП: Метод за създаване на програми, който използва абстракции чрез обекти, затворени класове, комуникация чрез съобщения, време на съществуване на обектите, класови йерархии и полиморфизъм.
Основни характеристики на ОО Системи
Абстракция чрез обекти

Дефиниция: Абстракцията (abstraction) е модел на обекти от реалния свят или концепция.

Абстракцията е механизъм за възприемане на сложни ситуации от реалния свят, представени чрез опростен модел. ОО абстракция се основава на обекти и тяхното взаимодействие с други обекти. Например, цвят в модел на смесица от интензивности на основните цветове RGB.


Затворени класове

Дефиниция: Затворени класове (encapsulation) Процес на скриване на вътрешните детайли на обекта от останалия свят.

В Java, процесът се прилага чрез включване на дефиниции за атрибутите и методите в тялото на класовата дефиниция.

Пример:

CPerson.java



package OOPSamples;
public class CPerson {

private class Sex

{

static final int Male=0;

static final int Female=1;

}

private int m_Sex;

private String m_strName;

private String m_egn;

private CAddress m_address;

….

….


}

Абстракциите на свързани идеи се затварят в едно цяло. Състоянията и поведенията на абстракцията се обединяват в обща единица, наречена клас. Текущата имплементация на състоянията и поведенията е скрита за останалата част от системата. Поради това, че идеята не е новост в техниката на програмирането, в обектното ориентирано програмиране скриването на вътрешните детайли е интегрална част от проектирането на системите.

Пример – скриване на имплементацията на цветовете в класа CColor:

Първоначално се описва класът CColor като се предоставя един от начините за промяна-чрез стойностите на червената, зелената и синя негова стойност. Впоследствие се разглежда класът CColor в по-принципен начин на представяне, без да се разкрива как вътрешно се представя обекта. Той може да използва както модела HSV отенък, наситеност и стойност (hue, saturation, value) или смесица от интензивности на основните цветове (RGB). Състоянията и поведението на обекта се контролира от добре дефинирани и ограничени интерфейси към него. Скриване на вътрешните детайли на обекта от останалия свят осигурява постановката, че всеки обект съхранява своето вътрешно уникално състояние и това състояние може да се променя с добре дефинирани съобщения.


Комуникация чрез съобщения

За да реализират взаимодействия помежду си, обектите се нуждаят от комуникация помежду си. Взаимодействието може да е както между обектите от един клас, така и с други обекти. Това взаимодействие се осъществява със съобщения (в Java това става с методи) към други обекти, като се предава информация или искане за действие. Например, когато потребителя натисне с мишката команден бутон в диалогова кутия на екрана, се праща съобщение към диалоговия обект, или искане за действие от обекта.



Временно съществуване на обектите

Всички обекти имат време за съществуване. Те се създават и инициализират когато са необходими в процеса на изпълнение на програмата, съществуват и извикват функциите си и се премахват. Докато съществуват обектите съхраняват собственото си идентичност и състояние. Много обекти, които са инстанции от даден клас могат да съществуват различно време. Всеки от обектите има собствена идентичност, определена от съвкупността от стойности на член-променливите си.



Видове класови йерархии



I. Асоциация:

  1. Основни понятия

Дефиниция: Асоциация (association): Отношение между два класа в класова йерархия, определящо че елементите имат взаимовръзка помежду си. Най-често се имплементира с инстанция на променлива от друг клас в класа.
В ОО проектирането класовете и обектите се организират в йерархии, които описват релациите между класовете. Най-простата релация е връзката (association). Например:

Студентите ИЗУЧАВАТ дисциплини;

Доцентите ПРЕПОДАВАТ курсове;

Престъпниците ОБИРАТ банки;

Капитаните КОМАНДВАТ корабите.

Тази проста връзка съществува между различни класове обекти. Тя е важна за определяне как взаимодействат обектите помежду си. ИЗУЧАВАТ, ПРЕПОДАВАТ, ОБИРАТ, КОМАНДВАТ са глаголи, които дефинират взаимодействието между обектите.



Описание на асоциацията

Намирането на връзката между обектите не е достатъчно за нейното описание. Необходимо е да се определи и същината на връзката. Например, колко дисциплини ИЗУЧАВАТ студентите? Нито една, една или няколко.

Отношението може да е двупосочно, например, не само студентите ИЗУЧАВАТ дисциплините, но и дисциплините се изучават от студентите.

Дефиниция: Кардиналност (cardinality) на връзката определя количествена характеристика на отношението, тоест дава отговор на въпроса „Колко обекта се свързват в отношението“.
Дефиниция: Незадължителност (optionality) на връзката определя количествена характеристика на отношението, определяща възможността за наличие или отсъствие на отношението, тоест дава отговор на въпроса „Има ли въобще такава връзка между обектите в отношението“.
Дефиниция: Мултипликатор (multiplicity) на връзката е UML диаграма, обединяваща концепцията кардиналност и незадължителност.

За дефиниране на асоциация и нейното представяне чрез диаграма е необходимо да се определи колко обекта участват във връзката, тоест мощност (кардиналност) - cardinality на отношението и има ли въобще такава връзка- optionality. В диаграмите на класовите йерархии за описание на асоциацията се използва обща концепция, наречена мултипликатор (multiplicity). Видове мултипликатори:



  • 0..1 Нула или един;

  • 1 Само един;

  • 0..* Нула или повече;

  • 1..* Един или повече;

  • n Само n, ( където n>1);

  • 0..n Нула до n ( където n>1);

  • 1..n Един до n ( където n>1);

Дефиниция: Роля (Role) на обекта относно връзката му в отношението-определя качествена характеристика на обекта относно отношението. Един и същ клас може да предоставя обекти, изпълняващи различни роли в различните отношения. Например, класът личност (Person) може да играе роля на съпруг в семейство, студент в университета, работник във фирма и други. Студентът магистър в ролята на асистент в бакалавърската степен може да преподава лабораторни упражнения, като същевременно посещава занятия (в магистърската степен) в ролята на студент.


Фигура 1. Обща схема за моделиране на асоциация

Елементите на схемата показват два класа A и B с обозначена асоциация между тях. Обозначението включва два мултипликатора multiplicityА,B на връзката от двата класа един към друг, обозначение на асоциацията label и ролята role A, B на класовете в асоциацията.


Примерни асоциации:

  1. Студентът посещава една или повече лекции;

  2. Лекциите се посещава от нула или повече студенти;

  3. Студентът, като асистент обучава по едно или повече лабораторни упражнения;

  4. Лабораторното упражнение може да се преподава от един студент като асистент.

  5. Лабораторното упражнение е част от дисциплина;

  6. Дисциплината има нула или повече части;

  7. Служителят заема една длъжност;

  8. Една длъжност се заема от един служител, но може да има незаети длъжности;

  9. Един служител може да бъде командван от друг служител, който е негов единствен началник. Само президентът на фирмата е служител без началник;

  10. Началникът командва нула или повече служители. Възможно е да има служител без подчинени;

Моделиране на примерни асоциации:


Личност, живее на адрес- еднопосочна асоциация от личност към адрес.

Служител заема длъжност - еднопосочна асоциация от служител към длъжност и рекурсивна двупосочна асоциация командва служител към служител

Фигура 2. Примерни асоциации

Частни случаи на асоциации:

1. Между два класа може да има повече от една асоциация. Например, студентът може да посещава лабораторни упражнения и да преподава като асистент на лабораторни упражнения. Това се осъществява с две различни асоциации на студента в две различни роли на същия.

2. Възможно е рекурсивно дефиниране на асоциации, при които асоциацията командва се дефинира за класа служители и определя отношение на класа със себе си. Схемата показва, че един служител може да има 0..* подчинени и самият той да има нула до един началник 0..1, който да го командва. Служителят е от двете страни на рекурсивното отношение командва, в ролята на началник и на обикновен служител, командван от началника.

3. Съществува еднопосочна асоциация, например заема между служител и длъжност, при която служителят знае каква длъжност заема, но длъжността не е задължена да знае кой служител я заема. Това се нарича еднопосочна асоциация, тоест асоциация, която може да се изпълнява само в едната посока.


  1. Имплементиране на асоциация

Различните видове отношения, тоест асоциациите се представят чрез комбинация от атрибути и методи. Атрибутите съхраняват информацията, необходима за отношението, а методите - операциите на отношението. Тъй като атрибутите и методите се наследяват, може да се направи извод от имплементацията - асоциациите също се наследяват.




    1. Имплементиране на отношения от тип едно към едно

Примерна асоциация от този вид е отношението между личност СPerson и адрес, на който живее CAddress. В примера отношението е дефинирано като еднопосочно. То се имплементира като инстанция на клас, представена като атрибут от класа CAddress, включен в класа СPerson, както и методи за достъп (четене/запис) за поддръжката на атрибута.

При необходимост от двупосочност на отношението, тоест адресът да се отнася към личността, която живее на него, ще са необходими еквивалентни атрибути и методи в класа “адрес”.

Отношението едно към едно може да се имплементира и по начина, по който се създава връзка между таблици в база данни-с ключова стойност за достъп до данните и методи за промяната на ключа. Основната идея е да се осигури уникалност на ключа, асоцииран към даден обект. Връзката между обектите се осъществява с уникален идентификатор, който служи за достъп до данните за свързания обект. Например асоциацията между обекти от класовете от примера означава на се създаде обект от класа CAddress, да се осигури уникален идентификатор в него, например (OIU), който впоследствие да се използва за съхраняване в обектите от класа СPerson. Необходимо е да имат функции за четене/запис на този идентификатор.

Примерен код за реализация на такава връзка:



    1. Схема на асоциацията:


    1. Имплементация на схемата:

CAddress.java

package OOPSamples;

class CAddress {

/** Street and number; Example Studentska #1

*/

private String m_strStreet;



/** Post code; Example 9010

*/

private String m_strPostCode;



/** City; Example Varna

*/

public CCountry m_strCountry;



protected String m_strCity;

public CAddress() {

m_strStreet=m_strPostCode=m_strCity="N/A";

}

public CAddress( String strStreet, String strPostCode, String strCity ){



m_strStreet=strStreet;

m_strPostCode=strPostCode;

m_strCity=strCity;

}

public final void Output() {



System.out.println( m_strCountry.getCode()+ ","+m_strCity + "," + m_strPostCode + ","+ m_strStreet + "\n");

}

public String getStreet() {



return m_strStreet;

}

public void setStreet(String strStreet) {



m_strStreet = strStreet;

}

public String getCity() {



return m_strCity;

}

public void setCity(String strCity) {



m_strCity = strCity;

}

public String getPostCode() {



return m_strPostCode;

}

public CCountry getCountry()



{

return m_strCountry;

}

public void setCountry( CCountry cntr )



{ m_strCountry = cntr; }

public void setPostCode(String strPostCode) {

m_strPostCode = strPostCode;

}

public static void main(String[] args) {



CAddress myAddress = new CAddress("Studentska #1","9010","Varna");

CCountry cntry = new CCountry("Bulgaria", "BGR");

myAddress.setCountry(cntry);

myAddress.Output();

}

}
CCountry.java



package OOPSamples;
public class CCountry {

/** ISO code; Example BGR

*/

private String m_Code;



/** Country; Example Bulgaria

*/

private String m_Name;



public CCountry( String name, String code )

{ m_Code=code; m_Name=name; }

public String getCode()

{ return m_Code; }

public String getName()

{ return m_Name; }

private void setCode(String code)

{ m_Code = code; }

private void setName(String name)

{ m_Name=name; }

public static void main(String[] args) {

CCountry oCntry = new CCountry("Bulgaria", "BGR");

System.out.println(oCntry.getName() + " " + oCntry.getCode());

}

}


CPerson.java

package OOPSamples;


public class CPerson {

private class Sex

{

static final int Male=0;



static final int Female=1;

}

private String m_strName;



private int m_Sex;

private String m_egn;

private CAddress m_address;

public CPerson(String Name, String egn) throws Exception

{

m_strName=Name;



int iSex=Integer.valueOf(egn.substring(8,9).toString());

if((iSex%2)!=0){

m_Sex=Sex.Female;

}

else{



m_Sex=Sex.Male;

}

if(ValidateEGN(egn)) m_egn=egn;



else throw new Exception("Invalid EGN...");

}

public CPerson(String strName, int sex)



{ m_strName = strName; m_Sex = sex; }

public void SetName(String strName)

{ m_strName = strName; }

public void SetSex(int sex)

{ m_Sex = sex; }

public void SetAddress( CAddress addr)

{ m_address=addr; }

public void SetEGN( String egn) throws Exception

{

if(ValidateEGN(egn)) m_egn=egn;



else throw new Exception("Invalid EGN...");

}

public String GetSex()



{

switch(m_Sex){

case Sex.Female:return "Female";

case Sex.Male:return "Male";

default: return "Unknown";

}

}



public String GetEGN()

{

return m_egn;



}

public String GetName() {

return m_strName;

}

public CAddress GetAddress() {



return m_address;

}

public boolean ValidateEGN(String strEGN)



{

if(strEGN.length()!=10)

return false;

int iyear=Integer.valueOf(strEGN.substring(0,2));

int imonth=Integer.valueOf(strEGN.substring(2,4));

int iday=Integer.valueOf(strEGN.substring(4,6));

// Validate iyear, imonth, iday values by Date class check

if(imonth>12){

imonth-=40;

if(imonth<0)

imonth+=20;

}

if(imonth<1||imonth>12)



return false;

int iSex=Integer.valueOf(strEGN.substring(8,9));

if((iSex%2)!=0 && m_Sex==Sex.Male) return false;

else{ if((iSex%2)==0 && m_Sex==Sex.Female) return false;}

int icheck=(Integer.parseInt(strEGN.substring(0,1))*2);

icheck+=Integer.valueOf(strEGN.substring(1,2))*4;

icheck+=Integer.valueOf(strEGN.substring(2,3))*8;

icheck+=Integer.valueOf(strEGN.substring(3,4))*5;

icheck+=Integer.valueOf(strEGN.substring(4,5))*10;

icheck+=Integer.valueOf(strEGN.substring(5,6))*9;

icheck+=Integer.valueOf(strEGN.substring(6,7))*7;

icheck+=Integer.valueOf(strEGN.substring(7,8))*3;

icheck+=Integer.valueOf(strEGN.substring(8,9))*6;

icheck=icheck%11;

if(icheck==10)

icheck=0;

int iTest=Integer.valueOf(strEGN.substring(9,10));

if(icheck!=iTest)

return false;

return true;

}

/**


* @param args

*/

public static void main(String[] args) {



CPerson oPerson = new CPerson("N/A",Sex.Female);

try {


oPerson.SetName("Ivanka Petrova Ivanova");

oPerson.SetEGN("1111111110"); // check for female's common EGN

}

catch (Exception e) {



try {

oPerson.SetSex(Sex.Male);

oPerson.SetName("Ivan Petrov Ivanov");

oPerson.SetEGN("1111111104"); // check for male's common EGN

}

catch (Exception last) {



System.out.println(last.getMessage());

}

}



CAddress myAddress = new CAddress("Studentska #1","9010","Varna");

oPerson.SetAddress(myAddress);

System.out.println("Name: " + oPerson.GetName());

System.out.println("Sex : " + oPerson.GetSex());

System.out.println("EGN : " + oPerson.GetEGN());

System.out.print("Address : ");

oPerson.GetAddress().Output();

}

}





    1. Имплементиране на еднопосочни и двупосочни отношения

Еднопосочните асоциации се имплементират по просто, защото изискват атрибути и методи в едната посока. Например, отношението заема “holds между служител и длъжност в примера се имплементират изисква атрибути и методи в едната посока – от служител към длъжност. За да се представи отношението, СEmployee ще има атрибут, наречен например “position” и методи “setPosition” и “getPosition”. Не е необходимо да се осигуряват еквивалентните обратни методи в класа Position.

Например, класът CStudent на примерната диаграма ше има примерен атрибут, наречен например “takes”, представен чрез списъка (от упражнения), който да се използва за съхраняване на обекти от клас CExam, които служат за представяне на посещаваните упражнения от студента. Класът CStudent трябва да има и методи “addExam” и “removeExam” за добавяне и премахване на упражненията в списъка от упражнения, посещавани от студента в текущия момент. Класът CExam трябва също да има съответстващи атрибути и методи относно CStudent, например атрибут (списък от студенти) – “students” и методи за добавяне и премахване на студенти към списъка – “addStudent” и “removeStudent”. Така се осигирява двупосочната връзка в отношението между класовете.


Примерен код:



    1. Имплементиране на отношения от тип едно към много




    1. Имплементиране на отношения от тип много към много




    1. Имплементиране на рекурсивни отношения



II. Агрегация:

Дефиниция: Съвкупност (aggregation): Отношение между два класа в класова йерархия, определящо връзка между два класа от тип „е част от“ . Най-често се имплементира с инстанция на променлива от друг клас в класа.
Йерархиите могат също да се използват за изграждане на дефинициите на даден клас. Един от начините е включване на клас във вътрешността на друг клас. Например, един диалогов контрол на потребителски интерфейс може да съдържа прости контроли, като бутони, списъчни контроли, редактиращи полета и други. Тези контроли са част от диалоговия контрол и се включват в неговия клас. Този вид йерархия се нарича съвкупност aggregation или състав чcomposition.

Вторият наин за използване на йерархията се основава на преобразуване на съществуващи обобщени класове. Например, диалогов клас може да се разглежда като специализиран вариант на по-общия клас прозорец. Специализираният клас може автоматично да използва атрибутите на по-общия клас, например големина, позиция и други и може евентуално да добави нови атрибути и поведение към него, например свързаните към него обекти контроли. Такъв вид йерархия е наследяването (inheritance).



Полиморфизъм

Когато наследяването се използва за разширяване на общ клас към по-специализиран клас това става с разширяване на част от поведението на общия клас. Специализирания клас може често да имплементира поведение, което е различно от това на общия клас, но името, използвано за дефиниране на това поведение да е същото. Важно е дадена инстанция на един обект да използва правилното поведение и свойството полиморфизъм осигурява това да стане автоматично.



Ако една система не включва абстракции чрез обекти, затворени класове, комуникация чрез съобщения, временно на съществуване на обектите, класови йерархии и полиморфизъм, тогава тя не е ООС, независимо че е написана на Java, C++ или друг език за ООП.





Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница