Rumah > pembangunan bahagian belakang > tutorial php > Pengasingan Kebimbangan (SoC)

Pengasingan Kebimbangan (SoC)

Barbara Streisand
Lepaskan: 2024-12-07 07:52:17
asal
871 orang telah melayarinya

Separation of Concerns (SoC)

Contoh Perlaksanaan Utama

1. Pemisahan Lapisan Pangkalan Data

// Bad - Mixed concerns
class User {
    public function save() {
        $db = new PDO('mysql:host=localhost;dbname=app', 'user', 'pass');
        $stmt = $db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
        $stmt->execute([$this->name, $this->email]);
    }
}

// Good - Separated database logic
class User {
    private string $name;
    private string $email;
}

class UserRepository {
    private PDO $db;

    public function save(User $user) {
        $stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
        $stmt->execute([$user->getName(), $user->getEmail()]);
    }
}
Salin selepas log masuk

Contoh yang baik memisahkan struktur data (Pengguna) daripada logik storan (UserRepository). Ini menjadikan kod lebih boleh diselenggara dan membenarkan menukar kaedah storan tanpa mengubah suai kelas Pengguna.

2. Pemisahan Pengesahan

// Bad - Mixed validation and business logic
class Order {
    public function process() {
        if (empty($this->items)) {
            throw new Exception('Order cannot be empty');
        }
        if ($this->total < 0) {
            throw new Exception('Invalid total amount');
        }
        // Process order...
    }
}

// Good - Separated validation
class OrderValidator {
    public function validate(Order $order): array {
        $errors = [];
        if (empty($order->getItems())) {
            $errors[] = 'Order cannot be empty';
        }
        if ($order->getTotal() < 0) {
            $errors[] = 'Invalid total amount';
        }
        return $errors;
    }
}

class Order {
    public function process() {
        // Only handles order processing
    }
}
Salin selepas log masuk

Logik pengesahan dialihkan ke kelas pengesah khusus, membenarkan kelas Pesanan menumpukan pada logik perniagaan.

3. Pemisahan Lihat/Templat

// Bad - Mixed HTML and logic
class ProductPage {
    public function show($id) {
        $product = $this->getProduct($id);
        echo "<h1>{$product->name}</h1>";
        echo "<p>Price: ${$product->price}</p>";
    }
}

// Good - Separated presentation
class ProductController {
    public function show($id) {
        $product = $this->productRepository->find($id);
        return $this->view->render('product/show', ['product' => $product]);
    }
}

// product/show.php template
<h1><?= htmlspecialchars($product->name) ?></h1>
<p>Price: $<?= htmlspecialchars($product->price) ?></p>
Salin selepas log masuk

Contoh yang baik memisahkan logik paparan kepada templat, menjadikan kod lebih boleh diselenggara dan membenarkan pereka bentuk bekerja secara bebas.

4. Pemisahan Lapisan Perkhidmatan

// Bad - Mixed business logic
class OrderController {
    public function checkout() {
        $order = new Order($_POST['items']);
        $payment = new Payment($_POST['card']);
        $payment->process();
        $order->updateStatus('paid');
        $email = new EmailService();
        $email->sendConfirmation($order);
    }
}

// Good - Separated services
class OrderService {
    private PaymentService $paymentService;
    private EmailService $emailService;

    public function processOrder(Order $order, PaymentData $paymentData): void {
        $this->paymentService->process($paymentData);
        $order->updateStatus('paid');
        $this->emailService->sendConfirmation($order);
    }
}

class OrderController {
    public function checkout() {
        $this->orderService->processOrder($order, $paymentData);
    }
}
Salin selepas log masuk

Lapisan perkhidmatan mengendalikan logik perniagaan yang kompleks, memastikan pengawal fokus pada pengendalian permintaan.

5. Pemisahan Konfigurasi

// Bad - Hardcoded configuration
class EmailSender {
    private $host = 'smtp.example.com';
    private $port = 587;

    public function send($message) {
        // Sending logic using hardcoded values
    }
}

// Good - Separated configuration
// config/mail.php
return [
    'host' => 'smtp.example.com',
    'port' => 587
];

class EmailSender {
    private array $config;

    public function __construct(array $config) {
        $this->config = $config;
    }

    public function send($message) {
        // Sending logic using config values
    }
}
Salin selepas log masuk

Konfigurasi diasingkan daripada pelaksanaan, menjadikan kod lebih fleksibel dan boleh diselenggara. Tetapan boleh ditukar tanpa mengubah suai kod.

Atas ialah kandungan terperinci Pengasingan Kebimbangan (SoC). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan