Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Pessoal, tudo bem?
Bom, estou criando uma classe e me deparei com a seguinte dúvida referente ao SRP:
Na minha classe, tenho meus getter's e setter's da vida:
<?php
class UserRegister
{
private $name;
private $mail;
private $authorizedBank;
public function setName( $name )
{
if ( is_string( $name ) ) {
$this->name = $name;
}
}
public function setMail( $mail )
{
if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
$this->mail = $mail;
}
}
public function setAuthorizedBank( $authorizedBank )
{
if ( is_string( $authorizedBank ) ) {
$this->authorizedBank = $authorizedBank;
}
}
public function getName()
{
return $this->name;
}
public function getMail()
{
return $this->mail;
}
public function getAuthorizedBank()
{
return $this->authorizedBank;
}
}
Percebam que ao setar um um valor para um propriedade, eu verifico se ela é realmente uma string. Até aí acredito que não deva estar violando a SRP.
Porém, no caso do meu método setAuthorizedBank não bastaria eu verificar se o parâmetro é de fato um string, eu preciso verificar se o valor enviado está dentro de um array. Pensei então em criar uma nova propriedade:
public $bankList = array( 'Itau', 'Bradesco', 'CEF' );
e validar assim:
public function setAuthorizedBank( $authorizedBank )
{
if ( in_array( $authorizedBank, $this->bankList ) ) {
$this->authorizedBank = $authorizedBank;
}
}Obrigado pela atenção e ajuda,
abs
Olá Marcielo,
Obrigado pela resposta. Sabe me dar uma dica de como separar isso corretamente?
Obrigado
Uma maneira bacana de resolver é criar classes específicas para isso, por exemplo:
abstract class AbstractValidation {
protected function requiredValue($value) {
return !empty($value);
}
abstract public function validate($user);
//demais funcionalidades
...
}
class ValidationUser extends AbstractValidation {
public function validate($user) {
$name = $user->getName();
if (!$this->requiredValue($name)) {
throw new Exception('Nome requerido.');
}
}
}
class UserController {
public function save() {
...
try {
(new ValidationUser())->validate($user);
//demais procedimentos de inserção e etc..
} catch (Exception $e) {
echo $e->getMessage(); //exibe a mensagem caso ocorra a exceção
}
}
}
Você também poderia criar suas próprias classes para lançar exceções estendendo a Exception e assim distinguir das outras exceções e realizar tratamentos.
Ah outra coisa interessante é, vi que você valida tipos testando se o valor é uma string ou não por exemplo, penso que uma cast seria mais apropriado, pois assim se a conversão não for possível um trigger error é disparado.
Obrigado Marcielo, vou estar estudando seu exemplo e tentando implementar a solução...
valeu!
Verificar o tipo de entrada é bem diferente de verificar o conteúdo dela, acredito que essa não seja uma responsabilidade para sua classe. A função dela aí é apenas representar o seu usuário e não validá-lo.