Əsas məzmuna keçin

SOLID Prinsipləri

SOLID - obyekt yönümlü proqramlaşdırma üçün 5 əsas prinsipdir. Bu prinsiplər kodu daha oxunaqlı, genişləndirilə bilən və saxlanıla bilən edir.

S - Single Responsibility Principle (SRP)

Hər bir class yalnız bir səbəbə görə dəyişməlidir.

Səhv nümunə:

// Bu class həm user məlumatlarını saxlayır, həm də email göndərir
class User {
private String name;
private String email;

public void saveUser() {
// Database-ə user yadda saxla
}

public void sendEmail() {
// Email göndər
}
}

Düzgün nümunə:

// User məlumatları üçün
class User {
private String name;
private String email;

// getters və setters
}

// Database əməliyyatları üçün
class UserRepository {
public void saveUser(User user) {
// Database-ə user yadda saxla
}
}

// Email xidməti üçün
class EmailService {
public void sendEmail(String email, String message) {
// Email göndər
}
}

O - Open/Closed Principle (OCP)

Class-lar genişləndirmə üçün açıq, dəyişiklik üçün bağlı olmalıdır.

Düzgün nümunə:

// Abstract base class
abstract class Shape {
public abstract double calculateArea();
}

// Konkret implementasiyalar
class Rectangle extends Shape {
private double width, height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public double calculateArea() {
return width * height;
}
}

class Circle extends Shape {
private double radius;

public Circle(double radius) {
this.radius = radius;
}

@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}

// Yeni shape əlavə etmək üçün mövcud kodu dəyişməyə ehtiyac yoxdur
class Triangle extends Shape {
private double base, height;

public Triangle(double base, double height) {
this.base = base;
this.height = height;
}

@Override
public double calculateArea() {
return (base * height) / 2;
}
}

L - Liskov Substitution Principle (LSP)

Alt class-ların obyektləri ana class-ın obyektlərini əvəz edə bilməlidir.

Düzgün nümunə:

class Bird {
public void eat() {
System.out.println("Quş yemək yeyir");
}
}

class FlyingBird extends Bird {
public void fly() {
System.out.println("Quş uçur");
}
}

class Sparrow extends FlyingBird {
@Override
public void fly() {
System.out.println("Sərçə sürətlə uçur");
}
}

class Penguin extends Bird {
// Penguin uçmur, ona görə FlyingBird-dən inherit etmir
public void swim() {
System.out.println("Pingvin üzür");
}
}

I - Interface Segregation Principle (ISP)

Client-lər istifadə etmədikləri interface-lərə asılı olmamalıdır.

Səhv nümunə:

// Böyük interface
interface Worker {
void work();
void eat();
void sleep();
}

Düzgün nümunə:

// Kiçik, məqsədli interface-lər
interface Workable {
void work();
}

interface Feedable {
void eat();
}

interface Sleepable {
void sleep();
}

// Human həm işləyir, həm yeyir, həm də yatır
class Human implements Workable, Feedable, Sleepable {
public void work() { System.out.println("İnsan işləyir"); }
public void eat() { System.out.println("İnsan yeyir"); }
public void sleep() { System.out.println("İnsan yatır"); }
}

// Robot yalnız işləyir
class Robot implements Workable {
public void work() { System.out.println("Robot işləyir"); }
}

D - Dependency Inversion Principle (DIP)

Yüksək səviyyəli modullər aşağı səviyyəli modullara asılı olmamalıdır. Hər ikisi abstraksiyalara asılı olmalıdır.

Səhv nümunə:

class MySQLDatabase {
public void save(String data) {
// MySQL-ə yadda saxla
}
}

class UserService {
private MySQLDatabase database = new MySQLDatabase(); // Birbaşa asılılıq

public void saveUser(String userData) {
database.save(userData);
}
}

Düzgün nümunə:

// Interface abstraksiya
interface Database {
void save(String data);
}

// Konkret implementasiya
class MySQLDatabase implements Database {
public void save(String data) {
System.out.println("MySQL-ə yadda saxlanıldı: " + data);
}
}

class PostgreSQLDatabase implements Database {
public void save(String data) {
System.out.println("PostgreSQL-ə yadda saxlanıldı: " + data);
}
}

// Service abstraksiyaya asılıdır
class UserService {
private Database database;

public UserService(Database database) {
this.database = database;
}

public void saveUser(String userData) {
database.save(userData);
}
}

// İstifadə
Database db = new MySQLDatabase();
UserService service = new UserService(db);
service.saveUser("User data");

Nəticə

SOLID prinsipləri:

  • Kodun oxunaqlığını artırır
  • Genişləndirmə imkanlarını yaxşılaşdırır
  • Test yazma prosesini asanlaşdırır
  • Bug-ların sayını azaldır
  • Kod yenidən istifadə olunmasını təmin edir