Como implementar SOLID sem violar seus principios ?
Estou estudando php e por consequência orientação objetos. Nesses últimos dias, me deparei com os princípios do SOLID (Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion) e tive algumas dúvidas. Como por exemplo, na tentativa de criar um "registration system", não consegui implementar os conceitos do SOLID, principalmente o SRP e OCP.
Com isso me deparei com algumas dúvidas, por exemplo:
Como escolher os nomes das classes e suas funções (objetivo, etc) ?
Como relacionar os objetos (banco de dados, usuario, etc) ?
Como deve ser a estrutura de classes(ex: DataBase, User, User Service) para um 'registration system' ou similar ?
Como saber se estou violando ou não os principios do SOLID (dicas, etc) ?
Como deveria ser implementada as classes abaixo, principalmente a DataBase ?
Segue a tentativa:
DataBase.class.php
<?php
require_once 'config.php';
class DataBase {
private $DB;
private $table = 'cadastro';
public function __construct() {
$this->DB = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
}
public function insertUser($name, $lastname, $email, $password) {
$sql = "INSERT INTO {$this->table} (name, lastname, email, password) VALUES (:name, :lastname, :email, :password)";
$stmt = $this->DB->prepare($sql);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':lastname', $lastname, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
return $stmt->execute();
}
public function findUserByEmail($email) {
//...
}
public function findAll() {
//...
}
//...
}
?>
User.class.php
<?php
class User {
private $id;
private $name;
private $lastname;
private $email;
private $password;
public function __construct($name = null, $lastname = null, $email = null, $password = null) {
$this->name = $name;
$this->lastname = $lastname;
$this->email = $email;
$this->password = $password;
}
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function getLastname() {
return $this->lastname;
}
public function setLastname($lastname) {
$this->lastname = $lastname;
}
public function getEmail() {
return $this->email;
}
public function setEmail($email) {
$this->email = $email;
}
public function getPassword() {
return $this->password;
}
public function setPassword($password) {
$this->password = $password;
}
}
?>
UserAction.class.php
<?php
class UserAction {
public function register($user, $database) {
return $database->insertUser($user->getName(), $user->getLastname(), $user->getEmail(), $user->getPassword());
}
/*
public function login($user, $database) {
//...
} */
//...
}
?>
register.php
<?php
require_once 'autoload.php';
$name = (isset($_POST['name']))?$_POST['name']:null;
$lastname = (isset($_POST['lastname']))?$_POST['lastname']:null;
$email = (isset($_POST['email']))?$_POST['email']:null;
$password = (isset($_POST['password']))?$_POST['password']:null;
$user = new User($name, $lastname, $email, $password);
$database = new DataBase();
$action = new UserAction();
$action->register($user, $database);
//...
?>
Se puderem me indicar materias ou exemplos para prática ficarei grato.
Obrigado !
Discussão (6)
Carregando comentários...