> 백엔드 개발 > PHP 튜토리얼 > 우려사항 분리(SoC)

우려사항 분리(SoC)

Barbara Streisand
풀어 주다: 2024-12-07 07:52:17
원래의
872명이 탐색했습니다.

Separation of Concerns (SoC)

주요 구현 사례

1. 데이터베이스 계층 분리

// 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()]);
    }
}
로그인 후 복사

좋은 예는 데이터 구조(사용자)와 저장 로직(UserRepository)을 분리합니다. 이렇게 하면 코드를 더 쉽게 유지 관리할 수 있으며 User 클래스를 수정하지 않고도 저장 방법을 변경할 수 있습니다.

2. 검증 분리

// 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
    }
}
로그인 후 복사

검증 로직이 전용 검증자 클래스로 이동되어 Order 클래스가 비즈니스 로직에 집중할 수 있습니다.

3. 뷰/템플릿 분리

// 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>
로그인 후 복사

좋은 예는 디스플레이 로직을 템플릿으로 분리하여 코드 유지 관리를 더욱 쉽게 만들고 디자이너가 독립적으로 작업할 수 있도록 합니다.

4. 서비스 계층 분리

// 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);
    }
}
로그인 후 복사

서비스 계층은 복잡한 비즈니스 로직을 처리하여 컨트롤러가 요청 처리에 집중하도록 합니다.

5. 구성 분리

// 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
    }
}
로그인 후 복사

구성과 구현이 분리되어 코드가 더욱 유연하고 유지 관리 가능해집니다. 코드 수정 없이 설정을 변경할 수 있습니다.

위 내용은 우려사항 분리(SoC)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿