Əsas məzmuna keçin

Class Diaqramları

Class diaqramları UML-in ən məşhur və ən çox istifadə olunan struktural diaqramlarından biridir. Bu diaqramlar sistemin statik strukturunu göstərir və siniflər, onların atributları, metodları və aralarındakı əlaqələri vizual şəkildə təqdim edir.

Class diaqramları obyekt yönümlü proqramlaşdırmada fundamental rol oynayır və sistem dizaynının, kodun strukturunun və verilənlər bazası dizaynının əsasını təşkil edir. Onlar həm yüksək səviyyəli arxitektur qərarlarını, həm də aşağı səviyyəli implementasiya detallarını göstərə bilirlər.

Class Diaqramının Əsas Komponentləri

1. Sinif (Class)

Sinif, eyni xüsusiyyətlərə və davranışlara malik obyektlərin abstrakt təsviridir. Class diaqramında sinif üç hissədən ibarət düzbucaqlı forma ilə təqdim edilir:

┌─────────────────┐
│ Sinif Adı │
├─────────────────┤
│ Atributlar │
├─────────────────┤
│ Metodlar │
└─────────────────┘

2. Atributlar (Attributes)

Atributlar sinfin xüsusiyyətlərini və ya dəyişkənlərini təmsil edir. Hər atribut aşağıdakı formatla yazılır:

visibility name : type = defaultValue

Visibility (Görünürlük) işarələri:

  • + Public
  • - Private
  • # Protected
  • ~ Package (Default)

3. Metodlar (Methods)

Metodlar sinfin həyata keçirdiyi əməliyyatları və davranışları təmsil edir:

visibility name(parameters) : returnType

4. Əlaqələr (Relationships)

Siniflər arasında müxtəlif növ əlaqələr mövcuddur:

Association (Assosiasiya)

İki sinif arasında ümumi əlaqəni göstərir.

Aggregation (Aqreqasiya)

"Hissə-bütün" əlaqəsini göstərir, lakin hissələr müstəqil mövcud ola bilər.

Composition (Kompozisiya)

Güçlü "hissə-bütün" əlaqəsi, hissələr bütün olmadan mövcud ola bilməz.

Inheritance (Varislik)

"is-a" əlaqəsini göstərir, alt sinif üst sinfin xüsusiyyətlərini miras alır.

Dependency (Asılıliq)

Bir sinifin digər sinfə asılı olduğunu göstərir.

Realization (Reallaşdırma)

Interface və onu implement edən sinif arasındakı əlaqə.

Praktik Nümunə: Kitabxana İdarəetmə Sistemi

Əsas Siniflər

Mermaid Class Diaqramı
classDiagram
class Person {
-String name
-String email
-String phone
-Date birthDate
+getName() String
+setName(String name) void
+getEmail() String
+validateEmail() boolean
}

class User {
-String userId
-String username
-String password
-UserRole role
-Date registrationDate
+login(String username, String password) boolean
+logout() void
+changePassword(String newPassword) void
+hasPermission(String permission) boolean
}

class Librarian {
-String employeeId
-String department
-Date hireDate
+addBook(Book book) void
+removeBook(String isbn) void
+issueBook(String isbn, String userId) void
+returnBook(String isbn, String userId) void
+generateReport() Report
}

class Member {
-String memberId
-String membershipType
-Date membershipExpiry
-int maxBooksAllowed
-List~Book~ borrowedBooks
+borrowBook(Book book) boolean
+returnBook(Book book) void
+renewMembership() void
+searchBook(String keyword) List~Book~
}

class Book {
-String isbn
-String title
-String author
-String publisher
-Date publicationDate
-String category
-int totalCopies
-int availableCopies
-BookStatus status
+getDetails() String
+isAvailable() boolean
+updateStatus(BookStatus status) void
}

class BorrowRecord {
-String recordId
-String memberId
-String isbn
-Date borrowDate
-Date dueDate
-Date returnDate
-RecordStatus status
-double fineAmount
+calculateFine() double
+extendDueDate(int days) void
+markAsReturned() void
}

class Library {
-String libraryId
-String name
-String address
-String phone
-List~Book~ books
-List~Member~ members
-List~Librarian~ librarians
+addMember(Member member) void
+removeMember(String memberId) void
+searchBooks(String keyword) List~Book~
+generateStatistics() LibraryStats
}

%% Relationships
Person <|-- User
User <|-- Librarian
User <|-- Member
Library o-- Book : contains
Library o-- Member : has
Library o-- Librarian : employs
Member --> BorrowRecord : creates
Book --> BorrowRecord : involved in
Member --o Book : borrows

PlantUML Class Diaqramı

@startuml
abstract class Person {
-String name
-String email
-String phone
-Date birthDate
+getName(): String
+setName(name: String): void
+validateEmail(): boolean
}

class User {
-String userId
-String username
-String password
-UserRole role
+login(username: String, password: String): boolean
+logout(): void
+changePassword(newPassword: String): void
}

class Member {
-String memberId
-String membershipType
-int maxBooksAllowed
-List<Book> borrowedBooks
+borrowBook(book: Book): boolean
+returnBook(book: Book): void
+searchBook(keyword: String): List<Book>
}

class Librarian {
-String employeeId
-String department
+addBook(book: Book): void
+issueBook(isbn: String, userId: String): void
+generateReport(): Report
}

class Book {
-String isbn
-String title
-String author
-int totalCopies
-int availableCopies
+isAvailable(): boolean
+getDetails(): String
}

class BorrowRecord {
-String recordId
-Date borrowDate
-Date dueDate
-double fineAmount
+calculateFine(): double
+markAsReturned(): void
}

Person <|-- User
User <|-- Member
User <|-- Librarian
Member }o--{ Book : borrows
Member ||--o{ BorrowRecord : creates
Book ||--o{ BorrowRecord : involved
@enduml

Əlaqə Növləri və İstifadə Qaydaları

1. Association (Assosiasiya)

classDiagram
class Student {
-String name
-int studentId
}

class Course {
-String courseName
-String courseCode
}

Student -- Course : enrolls in

İstifadə Sahəsi: İki sinif arasında ümumi əlaqə olduqda.

2. Aggregation (Aqreqasiya)

classDiagram
class Department {
-String name
-List~Employee~ employees
+addEmployee() void
}

class Employee {
-String name
-String position
}

Department o-- Employee : has

İstifadə Sahəsi: "Hissə-bütün" əlaqəsi olduqda, lakin hissələr müstəqil yaşaya bildikdə.

3. Composition (Kompozisiya)

classDiagram
class House {
-String address
-List~Room~ rooms
+addRoom() void
}

class Room {
-String type
-double area
}

House *-- Room : contains

İstifadə Sahəsi: Güçlü "hissə-bütün" əlaqəsi olduqda, hissələr bütün olmadan yaşaya bilmədikdə.

4. Inheritance (Varislik)

classDiagram
class Vehicle {
-String brand
-String model
+start() void
+stop() void
}

class Car {
-int numberOfDoors
+openTrunk() void
}

class Motorcycle {
-boolean hasSidecar
+wheelie() void
}

Vehicle <|-- Car
Vehicle <|-- Motorcycle

İstifadə Sahəsi: "is-a" əlaqəsi olduqda, alt sinif üst sinfin xüsusiyyətlərini miras aldıqda.

5. Dependency (Asılıliq)

classDiagram
class OrderService {
+processOrder() void
}

class EmailService {
+sendEmail() void
}

OrderService ..> EmailService : uses

İstifadə Sahəsi: Bir sinif digər sinfi müvəqqəti olaraq istifadə etdikdə.

6. Realization (Reallaşdırma)

classDiagram
class Drawable {
+draw() void
+resize() void
}

class Circle {
-double radius
+draw() void
+resize() void
+calculateArea() double
}

class Rectangle {
-double width
-double height
+draw() void
+resize() void
+calculateArea() double
}

Drawable <|.. Circle
Drawable <|.. Rectangle

İstifadə Sahəsi: Interface və onu implement edən siniflər arasında.

Multiplicity (Çoxluq) Göstəriciləri

Class diaqramlarında əlaqələrin sayını göstərmək üçün multiplicity istifadə edilir:

  • 1 - Dəqiq bir
  • 0..1 - Sıfır və ya bir
  • * - Sıfır və ya daha çox
  • 1..* - Bir və ya daha çox
  • 0..* - Sıfır və ya daha çox
  • n - Dəqiq n dənə
  • n..m - n-dən m-ə qədər
classDiagram
class University {
-String name
}

class Faculty {
-String name
}

class Student {
-String name
}

University --> Faculty : "1" to "many"
Faculty --> Student : "1" to "many"

Stereotyp və Tagged Values

Stereotyplər

Stereotyplər sinflərin xüsusi növlərini göstərir:

classDiagram
class Repository {
+save() void
+findById() Entity
}

class User {
-Long id
-String name
}

class UserController {
+createUser() void
+getUser() User
}

class UserService {
+registerUser() void
+validateUser() boolean
}

Ümumi Stereotyplər:

  • <<interface>> - İnterfeys
  • <<abstract>> - Abstrakt sinif
  • <<entity>> - Verilənlər bazası entitysi
  • <<controller>> - Kontroler sinif
  • <<service>> - Servis sinif
  • <<repository>> - Məlumat access layer

Tagged Values

{author = "John Doe"}
{version = "2.1"}
{deprecated = true}

Design Pattern-lərin Class Diaqramlarında Təsviri

1. Singleton Pattern

classDiagram
class DatabaseConnection {
-DatabaseConnection instance
-Connection connection
-DatabaseConnection()
+getInstance() DatabaseConnection
+getConnection() Connection
+executeQuery(query: String) ResultSet
}

note for DatabaseConnection "Private constructor\nEnsures single instance"

2. Factory Pattern

classDiagram
class Vehicle{
+start() void
+stop() void
}

class Car {
+start() void
+stop() void
}

class Motorcycle {
+start() void
+stop() void
}

class VehicleFactory {
+createVehicle(type: String) Vehicle
}

Vehicle <|.. Car
Vehicle <|.. Motorcycle
VehicleFactory ..> Vehicle : creates

3. Observer Pattern

classDiagram
class Observer {
+update(data: Object) void
}

class Subject {
-List~Observer~ observers
+addObserver(observer: Observer) void
+removeObserver(observer: Observer) void
+notifyObservers() void
}

class ConcreteObserver {
+update(data: Object) void
}

class ConcreteSubject {
-Object state
+setState(state: Object) void
+getState() Object
}

Observer <|.. ConcreteObserver
Subject <|-- ConcreteSubject
Subject o-- Observer : notifies

Class Diaqramı Yaratmaq üçün Best Practice-lər

1. Sadəlik və Aydınliq

✅ Düzgün:
- Vacib siniflərə fokuslanın
- Məqsədə uyğun detalları daxil edin
- Anlaşıqlı adlar istifadə edin

❌ Yanlış:
- Bütün detalları bir diaqramda göstərmək
- Çox mürəkkəb əlaqələr yaratmaq
- Aydın olmayan adlandırma

2. Konsistent Adlandırma

// Düzgün adlandırma
class UserService {
private UserRepository userRepository;

public User createUser(CreateUserRequest request) {
// implementation
}
}

// Yanlış adlandırma
class usr_svc {
private usr_repo repo;

public usr make_usr(CreateUsrReq req) {
// implementation
}
}

3. Doğru Əlaqə Növü Seçimi

Association: İki sinif arasında ümumi əlaqə
Aggregation: Zəif "hissə-bütün" əlaqəsi
Composition: Güçlü "hissə-bütün" əlaqəsi
Inheritance: "is-a" əlaqəsi
Dependency: "uses" əlaqəsi

4. Multiplicity-nin Düzgün İstifadəsi

classDiagram
class Order {
-String orderId
}

class OrderItem {
-int quantity
-double price
}

class Product {
-String name
}

Order --> OrderItem : "1 to many"
OrderItem --> Product : "many to 1"

Alətlər və Platformalar

1. Onlayn Vasitələr

  • Draw.io/Diagrams.net: Pulsuz, güclü
  • Lucidchart: Komanda üçün yaxşı
  • Creately: İntuitiv interfeys
  • PlantUML: Mətn əsaslı

2. Desktop Tətbiqlər

  • StarUML: Professional UML tool
  • Visual Paradigm: Tam funksiyalı
  • Enterprise Architect: Korporativ həllər
  • ArgoUML: Açıq mənbə

3. IDE Plugin-ləri

  • IntelliJ IDEA: UML plugin
  • Eclipse: UML2 Tools
  • Visual Studio: Class Designer
  • NetBeans: UML support

Kod Generasiyası və Reverse Engineering

Forward Engineering (Kod Generasiyası)

Class diaqramından kod generasiya etmək:

// Generated from class diagram
public class User {
private String userId;
private String username;
private String email;

// Constructors
public User() {}

public User(String userId, String username, String email) {
this.userId = userId;
this.username = username;
this.email = email;
}

// Getters and Setters
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }

public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }

public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }

// Methods
public boolean validateEmail() {
// Email validation logic
return email != null && email.contains("@");
}
}

Reverse Engineering

Mövcud koddan class diaqram yaratmaq:

# PlantUML ilə Java kodundan diaqram yaratmaq
java -jar plantuml.jar -language java src/**/*.java

Verilənlər Bazası Dizaynı ilə Əlaqə

Class diaqramları verilənlər bazası cədvəllərinin yaradılmasında da istifadə edilir:

classDiagram
class User {
+Long id PK
+String username UK
+String email UK
+String passwordHash
+Date createdAt
+Date updatedAt
}

class Post {
+Long id PK
+Long userId FK
+String title
+String content
+Date publishedAt
+Boolean isPublished
}

class Comment {
+Long id PK
+Long postId FK
+Long userId FK
+String content
+Date createdAt
}

User --> Post : creates
User --> Comment : writes
Post --> Comment : has

Ümumi Səhvlər və Onlardan Çəkinmə

1. Çox Detallı Diaqramlar

Yanlış: Hər metod və atributu göstərmək
Düzgün: Məqsədə uyğun detalları seçmək

2. Yanlış Əlaqə Növü

Yanlış: Hər yerdə Association istifadə etmək
Düzgün: Düzgün əlaqə növünü seçmək

3. Multiplicity Görməzliyə Gəlmək

Yanlış: Əlaqələrdə multiplicity qeyd etməmək
Düzgün: Aydın multiplicity göstəriciləri

Nəticə

Class diaqramları proqram təminatı dizaynının təməl daşıdır. Onlar:

  • Sistemin statik strukturunu aydın şəkildə göstərir
  • Kod yazıma əsas yaradır
  • Komanda üzvləri arasında ünsiyyəti asanlaşdırır
  • Verilənlər bazası dizaynına köməkçi olur
  • Design pattern-lərin implementasiyasında istiqamət verir

Düzgün hazırlanmış class diaqramları:

  • Sistemin anlaşılmasını asanlaşdırır
  • Kod keyfiyyətini artırır
  • Təkrar istifadə oluna bilən komponentlərin yaradılmasına kömək edir
  • Sistem arxitekturasının sənədləşdirilməsini təmin edir