// 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 클래스를 수정하지 않고도 저장 방법을 변경할 수 있습니다.
// 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 클래스가 비즈니스 로직에 집중할 수 있습니다.
// 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>
좋은 예는 디스플레이 로직을 템플릿으로 분리하여 코드 유지 관리를 더욱 쉽게 만들고 디자이너가 독립적으로 작업할 수 있도록 합니다.
// 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); } }
서비스 계층은 복잡한 비즈니스 로직을 처리하여 컨트롤러가 요청 처리에 집중하도록 합니다.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!