williamespindola / phpsp-mentorship-program

0 stars 0 forks source link

OOP #1

Open williamespindola opened 6 years ago

williamespindola commented 6 years ago

O que você ja leu e ja sabe de OO?

Morkhusz commented 6 years ago

Lí os livros:

Eu considero que sei o básico de OO, um certo entendimento dos pricípios do solid, acredito que fico devendo na questão de realmente compor um objeto e criar efetivamente os contratos como definir mais interfaces e também realmente aplicar responsabilidade única.

williamespindola commented 6 years ago

Legal, então você ja sabe bastante coisa de OO o Livro do Pablo é bom. Ja que você ja leu algum material acredito que você pode começar a aplicar e treinar SOLID e Calistenics. Com o tempo vai sacando algumas coisas de OO que ainda não conhece e melhorando o que conhece. Continue estudando pelo repo do marcel tem um bom conteúdo ali.

Para compor um objeto você tem que pensar no nível de abstração, não que todas as classes precisam ter abstract mas que ela deve abstrair o conceito, logo vai ver que a própria definição vai trazer algumas "regras" para aquilo ser aquilo, dai vem a criação de interfaces e classes abstratas. Exemplo:

interface CellPhone {
    public function makeCall(): void;
    public function sendMessage(): void;
    public function receiveCall(): void;
    public function receiveMessage(): void;
    public function acessRedtubeViaInternet(): void;
}

class Iphone implements CellPhone {
    public function makeCall(): void;
    public function sendMessage(): void;
    public function receiveCall(): void;
    public function receiveMessage(): void;
    public function acessRedtubeViaInternet(): void;
}

class MotoG implements CellPhone {
    public function makeCall(): void;
    public function sendMessage(): void;
    public function receiveCall(): void;
    public function receiveMessage(): void;
    public function acessRedtubeViaInternet(): void;
}

Aqui rola a abstração do que é um celular, e a criação de outros objetos devem seguir a regra da interface para que todo celular criado não seja um celular falso.

Agora vamos ao primeiro exercício. Classes abstratas tem o mesmo conceito, com algumas funcionalidades à mais. Olhe este projeto e como se implementa um novo request e tente me explicar porque ele usa uma classe abstrata ao invés de uma interface.

Olhe o projeto como um todo ele é bem simples e tem interface, classe abstrata, responsabilidade única.

Morkhusz commented 6 years ago

Desculpa, não sei se a parte do "olhe este projeto" deveria ser um link pra algum projeto, pois não tem nada. Se era coloca por favor? Se não era, a qual projeto você se refere? Uma dúvida muito grande que tenho sobre interfaces, abstração e composição é por exemplo em classes onde não haverão especializações, exemplo: Cellphone define tudo que diz o que um celular é e para que MotoG se enquandre em celular, deve implementar tudo, e quando eu tenho classes que não haverão classes especializadas que não extendam nem herdem nada de ninguém? Eu defino uma interface também pra manter o contrato ou nese caso é "ignorável".

williamespindola commented 6 years ago

Eita pega não colei o link https://github.com/williamespindola/abstract-http-client

Morkhusz commented 6 years ago

Pelo que entendi, foi usada a classe abstrata por conta dos comportamentos que estão atrelados a ela, como no construtor e o uso das exceções... Ao extender AbstractRequest, não é necessário definir novamente estes comportamenos que são comuns em todo request e implementar apenas o metódo request() que tem suas peculiaridades

williamespindola commented 6 years ago

Exato, você pode usar os dois também em alguns casos. E não é necessário sempre criar uma interface para toda classe que esta criando. Você define quando precisa garantir que uma nova implementação da abstração não implemente uma coisa diferente do que seu sistema conhece e sabe que vai trabalhar. Um exemplo são entidades e modelos, não implementam interface algum pois são únicos. Abstraindo o conceito deste exemplo. O nome entidade ja remete aquilo que é único, maioral, superior e definitivo. Você confia nele, e ele que vai ser usado por quem implementa. Colocando isto no código:

class User
{
    private $name;
    private $role;
}

class CreateUserService implements UserService
{
    public function createUser(User $user) {}
}

O User, a entidade aqui não implementa nada, mas é usada no serviço como garantia que ele vai recebe uma instância da entidade User

williamespindola commented 6 years ago

Tem mais alguma dúvida? Se tiver outras dúvidas de outros tópicos vai lançando issue que vamos trocando idéia.

Agora vamos para implementação, uma aplicação simples mesmo de linha de comando, vamos começar com um to do list. Sei que a aplicação é simples, a idéia aqui não é ver se você programa bem ou não é aplicar os princípios.

Aqui tem algumas informações e regrinhas https://github.com/williamespindola/jhony/milestone/1 E também ja subi no branch master a pasta do projeto com um arquivo para você executar e ver como pega os parâmetros via linha de comando.