quarta-feira, 31 de outubro de 2018

Isso é MVP (Model-View-Presenter)? Segunda parte - View

Bem, tenho que corrigir uma coisa anteriormente: o método "login" esta síncrono, seria melhor se ele fosse assincrono, ou usando callbacks:

public function login(username: string, password: string, callback: function(user: User?, error: Error)) {
}

ou usando métodos de delegação de uma interface (que será implementada na classe de Presenter):

public interface ILoginModelDelegate {
      public function onLoginSuccess(user: User);
      public function onLoginError(error: Error);
}

Beleza, agora podemos continuar! (se eu não me lembrar de nada até lá...)

Se para Model, a gente fez uma interface para ela (para facilitar a mudança da origem de dados -- seja serviços REST, SOAP ou banco de dados), a gente faz a mesma coisa para a View.

Por que? -- você deve perguntar...

Pelo mesmo motivo: desacoplamento, ou seja, para que a nossa "tela" possa mudar de HTML para um serviço que retorna json ou para outro que retorna XML:

public interface ILoginView {
        public property (readonly) username: string;
        public property (readonly) password: string;
        public function onLogin(user: User);
        public function onLoginFail(error: Error);       
}

public class LoginPageView: Page, ILoginView {
        public property (readonly) username: string {
                 return txtUserName.text;
        }
        ...
}

public class LoginRestView: Rest, ILoginView {
        public property (readonly) username: string {
                 return request.getParameter("username");
        }
        ...
}

Legal, né?

Bem, acho que é isso... Na próxima fica faltando só a Presenter. :)

Até mais!

quarta-feira, 24 de outubro de 2018

Isso é MVP (Model-View-Presenter)? Primeira parte - Model

Sabe aquele tipo de cara que aprende somente na prática? Então, este sou eu (por isso, eu não tenho certeza se isso é MVP).

MVP é uma sigla para Model-View-Presenter (modelo, visão e apresentação), que é um tipo de modelo de arquitetura de software, como o MVC.

Como este, seguimos o padrão de separar o "negócio" (regras, cálculos, verificações, dados, etc.), o "M" da sigla, da tela (bem, tela é tela :P), o "V" da sigla.

Se separamos, existe alguém que junta, certo? Sim, e este "juntador" é representado pela letra "P" (o Presenter).

Bem, melhor que explicar, vamos a codificação (programador entende melhor "programando"). Primeiramente, vamos entender as classes de modelo:

public interface IUserModel {
        //Função que verifica se o usuário é válido.
        //@param username string que contém o nome do usuário (obrigatório) 
        //@param password string que contém a senha do usuário (obrigatório)
        //@return se os valores foram válidos, retorna um objeto da classe User, com as informações do usuário, caso o contrário, retorna null
        public function login(username: string, password: string): User?;
}

//Implementação da interface IUserModel que usa banco de dados
public class UserDatabaseModel: IUserModel {
        @implementation
        public function login(username: string, password: string): User? {
             ...
        }
}

Por que temos uma interface em modelo? Por causa da teoria de "baixo acoplamento", e por que podemos, em vez de usar uma classe que conecta em banco de dados, usar uma classe que conecta em serviços REST, por exemplo:

//Implementação da interface IUserModel que usa serviços REST
public class UserRESTServiceModel: IUserModel {
        @implementation
        public function login(username: string, password: string): User? {
             ...
        }
}

Na hora de usar essas, em vez de instanciar um objeto da própria classe:
public property model: UserRESTServiceModel = new UserRESTServiceModel();

Podemos instanciar um objeto da interface:
public property model: IUserModel = new UserRESTServiceModel();

E, assim, utilizar um serviço ou outro, só mudando a instância:
public property model: IUserModel = new UserDatabaseModel();

Acho que a primeira parte esta concluída, na próxima, veremos a "V" de view (não de vingança). :)

Até mais!

terça-feira, 23 de outubro de 2018

Gigante guerreiro Daileon!


Ontem, um colega meu falou sobre um provável "remake" do Jaspion...

Bem, pelo que ouvi de boatos, sei que a SATO Company tem os direitos da série e que a Toei Company autorizou que esta possa fazer um filme de sua personagem.

Mas são só especulações, nada muito confirmado ou feito...

Porém, parece que tem um pessoal que esta animado! Tipo seu Rafael Segnini, que fez a transformação do gigante guerreiro Daileon em 3D:


Ficou bem legal, não? :)

Até mais!