Maison >développement back-end >tutoriel php >SEC (Ne vous répétez pas)

SEC (Ne vous répétez pas)

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 02:43:22577parcourir

DRY (Don

Concept de base

DRY souligne que chaque élément de connaissance d'un système doit avoir une représentation unique et sans ambiguïté.

Exemples de code violant DRY

Exemple 1 : Logique de validation

// WET (Write Everything Twice) Code
class User {
    public function validateUsername($username) {
        if (strlen($username) < 3 || strlen($username) > 20) {
            throw new Exception("Username must be between 3 and 20 characters");
        }
        if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
            throw new Exception("Username can only contain letters, numbers and underscore");
        }
    }

    public function updateUsername($username) {
        // Same validation repeated
        if (strlen($username) < 3 || strlen($username) > 20) {
            throw new Exception("Username must be between 3 and 20 characters");
        }
        if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
            throw new Exception("Username can only contain letters, numbers and underscore");
        }
        // Update logic
    }
}

Solution SÈCHE

class User {
    private function validateUsername($username) {
        if (strlen($username) < 3 || strlen($username) > 20) {
            throw new Exception("Username must be between 3 and 20 characters");
        }
        if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
            throw new Exception("Username can only contain letters, numbers and underscore");
        }
    }

    public function createUser($username) {
        $this->validateUsername($username);
        // Creation logic
    }

    public function updateUsername($username) {
        $this->validateUsername($username);
        // Update logic
    }
}

Implémentation de DRY avec héritage

abstract class BaseController {
    protected function jsonResponse($data, $status = 200) {
        header('Content-Type: application/json');
        http_response_code($status);
        echo json_encode($data);
    }
}

class UserController extends BaseController {
    public function show($id) {
        $user = User::find($id);
        return $this->jsonResponse($user);
    }
}

class ProductController extends BaseController {
    public function show($id) {
        $product = Product::find($id);
        return $this->jsonResponse($product);
    }
}

Utiliser les traits pour DRY

trait Loggable {
    private function log($message) {
        $timestamp = date('Y-m-d H:i:s');
        file_put_contents('log.txt', "[$timestamp] $message\n", FILE_APPEND);
    }
}

class UserService {
    use Loggable;

    public function createUser($data) {
        $this->log("Creating new user");
        // User creation logic
    }
}

class PaymentService {
    use Loggable;

    public function processPayment($amount) {
        $this->log("Processing payment: $amount");
        // Payment processing logic
    }
}

Utiliser des constantes

class Config {
    const DEFAULT_ITEMS_PER_PAGE = 10;
    const MAX_UPLOAD_SIZE = 5242880; // 5MB
    const ALLOWED_FILE_TYPES = ['jpg', 'png', 'pdf'];
}

class FileUploadService {
    public function validateFile($file) {
        if ($file['size'] > Config::MAX_UPLOAD_SIZE) {
            throw new Exception("File too large");
        }

        $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
        if (!in_array($extension, Config::ALLOWED_FILE_TYPES)) {
            throw new Exception("Invalid file type");
        }
    }
}

class MediaController {
    public function index() {
        return $this->paginate(Config::DEFAULT_ITEMS_PER_PAGE);
    }
}

Ces exemples montrent comment appliquer DRY via diverses fonctionnalités PHP telles que l'héritage, les traits, les constantes et l'extraction de méthodes appropriée. L'objectif est de maintenir une source unique de vérité pour toute fonctionnalité donnée dans votre base de code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn