Ir para o conteúdo

Padrões Emergentes

Component Pattern

O padrão de componentes no React.js baseia-se em utilizar diversos componentes potencialmente reutilizáveis para compor o código de uma interface gráfica, dessa forma é possível obter um baixo acoplamento e uma alta coesão no código da interface. Visto que toda a estrutura será separada em pedaços menores a reusabilidade será alta, porém como consequência pode acabar se tornando mais complexo.

Exemplo de código do projeto

No exemplo abaixo, temos o componente TextInput sendo reutilizado diversas vezes e os dados que diferem em cada chamada são passados como props (dados que um componente pai passa para um filho). É possível ver que há outros componentes sendo utilizados.

import React, { useState } from 'react';

import {
  SubmitBtn,
  Container,
  ProfileImage,
  FormContainer,
  ProfileImageContainer,
} from './styles';

import TextInput from '../../components/TextInput';

const Signup: React.FC = () => {
  const history = useHistory();
  const dispatch = useDispatch();

  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const [phone, setPhone] = useState('');
  const [nickname, setNickname] = useState('');
  const [password, setPassword] = useState('');
  const [loading, setLoading] = useState(false);
  const [passwordConfirmation, setPasswordConfirmation] = useState('');

  return (
    <Container>
      <ProfileImageContainer>
        <ProfileImage>{(name && name[0].toUpperCase()) || 'A'}</ProfileImage>

        <MdAddAPhoto size="32" color="var(--white)" />
      </ProfileImageContainer>

      <FormContainer>
        <TextInput
          value={name}
          disabled={loading}
          variant="outlined"
          label="Nome Completo"
          placeholder="Digite o nome"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setName(e.target.value)
          }
        />

        <TextInput
          value={nickname}
          disabled={loading}
          variant="outlined"
          label="Nome de usuário (Apelido)"
          placeholder="Digite o nome de usuário"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setNickname(e.target.value)
          }
        />

        <TextInput
          label="Email"
          value={email}
          disabled={loading}
          variant="outlined"
          placeholder="Digite o email"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setEmail(e.target.value)
          }
        />

        <TextInput
          value={phone}
          label="Telefone"
          disabled={loading}
          variant="outlined"
          placeholder="Digite o telefone"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setPhone(e.target.value)
          }
        />

        <TextInput
          label="Senha"
          type="password"
          value={password}
          variant="outlined"
          disabled={loading}
          placeholder="Digite uma senha"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setPassword(e.target.value)
          }
        />

        <TextInput
          type="password"
          variant="outlined"
          disabled={loading}
          label="Senha repetida"
          value={passwordConfirmation}
          placeholder="Confirme sua senha"
          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
            setPasswordConfirmation(e.target.value)
          }
        />

        <SubmitBtn onClick={send}>CADASTRAR</SubmitBtn>
      </FormContainer>
    </Container>
  );
};

export default Signup;

Active Record

Um objeto que carrega consigo, dados e comportamentos. Muitos desses dados precisam ser armazenados em um banco de dados. A Active Record propõe a abordagem de utilizar a lógica de acesso de dados no próprio objeto. Isso permite a nós todos sabermos como ler e escrever os dados do objeto no Banco de dados.

O Django, assim como outros frameworks Back-end, faz uso desse padrão de arquitetura. No caso, as Django Models carregam consigo todo o domínio lógico e também as lógicas de manipulamento do banco de dados. Nesse padrão as classes são convenientes, mas eles não escondem o fato que os bancos relacionais estão presentes. Como resultado, é comumente visto outros padrões de ORM (object-relational mapping) presentes quando se está usando Active Record.

Para o nosso contexto, optamos por uma abordagem a partir da modelagem de banco de dados, podendo a mesma ser vista aqui

Exemplo com modelagem:

Modelagem exemplo

Toda a lógica de acesso ao banco é fornecida por meio de polimorfismo. E é evidente os métodos básicos para persistir o dado, apagar o dado persistido, criar uma nova instância.

class Person(AbstractBaseUser):
    name = models.CharField(max_length=256)
    email = models.EmailField(max_length=256, primary_key=True)
    nickname = models.CharField(max_length=256, unique=True)
    picture = models.BinaryField()
    USERNAME_FIELD = "nickname"
    REQUIRED_FIELDS = [
        "name",
        "email",
        "password",
    ]


class Phone(models.Model):
    email = models.ForeignKey(Person, on_delete=models.CASCADE)
    phone_number = models.IntegerField()

# métodos de criação de instância
person = Person.create({ # atributos de pessoa
})
# métodos de criação de instância
phone = Phone.create(email=person ...) # Restante do atributos
# salvar os dados no banco
person.save()
phone.save()

Referências

FOWLER, Martin. "Patterns of Enterprise Application Architecture". Addison-Wesley Signature Series. 2002.

"Components and Props". React. Disponível em: https://reactjs.org/docs/components-and-props.html. Acesso em: 07 abr. 2021

"Design Patterns In React Native: Component Patterns". mohit199thd. Disponível em: https://dev.to/mohit199thd/design-patterns-in-react-native-component-patterns-352f. Acesso em: 07 abr. 2021

"Filosofias de projeto". . Disponível em: https://docs.djangoproject.com/pt-br/2.2/misc/design-philosophies/#models. Acesso em: 07 abr. 2021

Versionamento

Versão Data Modificação Motivo Autor
1.0 07/04/2021 Criação do documento - Todos os integrantes