Linguagem Ubíqua +
Código Expressivo =
Felicidade :)
GABRIEL SCHADE CARDOSO
Quem é esse tal de Gabriel?
 Bacharel em ciência da computação
 Mestre em computação aplicada
 Microsoft Innovative Educator (MIE)
 Microsoft Specialist (MS)
 C#
 Javascript
 ASP .NET MVC
3
GUI
Sobre mim
 Microsoft Certified Solutions Assiciate (MCSA)
 Web Applications
 Autor dos livros da editora casa do código sobre
os assuntos:
 Kinect
 Windows Phone
 Programação Funcional
4
GUI
Sobre mim
 Desenvolvedor Senior
 Professor
 Revisor
5
GUI
Sobre mim
Linguagem Ubíqua
Linguagem Ubíqua
 A linguagem ubíqua ou linguagem onipresente é uma
técnica que faz parte do bloco estratégico do DDD.
 Ela nos ajuda na comunicação, contextualização,
identificação e delimitação de conceitos.
Linguagem Ubíqua
 De forma muito resumida, linguagem ubíqua é: Todos
falando a mesma língua e usando as mesmas
palavras para definir as mesmas coisas.
 Simples, certo?
 Nem tanto...
Linguagem Ubíqua
 Como modelarmos este objeto?
 Bolacha?
 Biscoito?
 Não importa!
Desde que...
Uma triste história real :(
Uma triste história real
 Início do projeto atual que trabalho;
 O time do qual faço parte é responsável por
desenvolver um sistema de locação de automóveis de
uma empresa de Minas Gerais.
Uma triste história real
 Quatro membros do time são de São Paulo e dois de
Itajaí;
 Fizemos uma reunião de kick-off e recebemos a
documentação com os requisitos do cliente.
Uma triste história real
 Não tínhamos um grande conhecimento sobre o
projeto;
 Mapeamos as histórias de usuário, enviamos para o
cliente e começamos a desenvolver.
Uma triste história real
 Em vários momentos da documentação citavam:
carros, veículos e modelos... Mas afinal o que era o
que?
Uma triste história real
 Fiat Uno é um...
 Modelo?
 Veículo?
 Carro?
Uma triste história real
 Fiat Uno é um...
 Modelo?
 Veículo?
 Carro?
Uma triste história real
 Fiat Uno é um...
 Modelo?
 Veículo?
 Carro?
Uma triste história real
 Após conversas, concluímos
que:
 Um veículo Uno da marca
Fiat possui os modelos:
vivace, celebration, way, etc
Uma triste história real
 Depois de um pouco de sofrimento e deste
entendimento (que nem o cliente tinha) falamos
abertamente na reunião sobre linguagem ubíqua.
Uma triste história real
 Tudo correu bem, até que...
 Descobrimos que os três agrupamentos de
modelos eram a mesma coisa, mas o cliente
usava nomes diferentes
Uma triste história real
 Classes;
 Grupos;
 Categorias.
Uma triste história real
 A documentação inclusive exemplificava com
valores diferentes!
Uma triste história real
 Paramos a Sprint e
fizemos a maior call do
projeto com essa cara 
Uma triste história com um final feliz
 Depois desta call remodelamos diversas coisas
no sistema, mandamos uma nova proposta para
o cliente e tudo começou a correr bem.
Uma triste história com um final feliz
 Para a linguagem ubíqua ser mais eficaz nosso
código também precisa refletir as coisas que
conversamos, precisamos de um código
expressivo.
Código Expressivo!
Código expressivo
 Existem diversas definições para código
expressivo.
“O código precisa expressar a linguagem mais
humana possível”
Código expressivo
 Se um veículo tem uma descrição, o tipo/classe
que o representa, precisa ter uma propriedade
chamada descrição e não título ou nome.
Código expressivo
 Este é o nível mais básico de expressividade,
podemos ir muito além e alcançar o nível bem
mais avançado.
Modelando o domínio!
Código expressivo
 Vamos para um exemplo em outro domínio mais
simples: um jogo de baralho, como pife, por
exemplo.
Código expressivo
 Sabemos que uma partida de baralho possui os
seguintes elementos:
 Cartas
 Baralho
 Jogadores
Código expressivo
 Cartas são compostas por uma combinação de
valor + naipe...
 Quais são os valores possíveis?
 Quais são os naipes possíveis?
Código expressivo
Código expressivo
 E o resto?
Código expressivo
 Tudo certo!
 Será mesmo?
Código expressivo
Código expressivo
 Após a implementação deste domínio
precisamos implementar o comportamento de
comprar uma carta.
Código expressivo
 Esta modelagem, não impede isso...
Código expressivo
 Sugestões de solução?
 Passar a partida por parâmetro?
 Criar um classe para baralho e outra para a mão?
Tipagem com alias e F#!
Tipagem
 O paradigma funcional reforça bastante o uso
de tipos ao invés de classes.
 Vamos para a mesma modelagem!
Tipagem
Tipagem
Não são enums!
Tipagem
Produto escalar
de tipos!
Tipagem
Guardam valores do
Mesmo tipo, mas
Possuem nomes
diferentes
Tipagem
Tipagem
 Escreve-se menos código e conseguimos
modelar de forma melhor...
 Veja o mesmo exemplo do método de comprar
cartas:
Tipagem
 Esta modelagem, impede:
Código expressivo
Métodos também são
gente!
Métodos
 Outro ponto importante do código expressivo é
a criação correta de métodos e a extensibilidade
de comportamentos.
Métodos
 O C#, Java e diversas outras linguagens já
incorporaram alguns conceitos funcionais, entre
eles, tornar os métodos membros de primeira
ordem.
Métodos
 Ou seja, eles podem ser passados por
parâmetro, retornados e até se comportarem
parecidos com objetos.
 São os chamados delegates.
Métodos
 A principal vantagem é termos mais segurança
no código evitando funções mentirosas.
Métodos
 Para exemplificar vamos utilizar um código
bastante simples e inseguro:
 Tenha como premissa que há na mão de um jogador
as cartas:
 Ás de copas
 Ás de ouros
 Dama de espadas
Métodos
 O que irá acontecer se realizarmos esta
operação?
Métodos
 Estamos tentando obter a primeira carta cujo
naipe seja paus;
 Conforme dito anteriormente, não há nenhuma
carta deste naipe...
Métodos
 O método FirstOrDefault do LINQ retornará o
valor padrão (default) do tipo Carta.
 Isso fará com que qualquer tentativa de acesso
à uma propriedade ou método cause problemas
Métodos
 Porque cartaPaus é um valor nulo e este tipo apenas se
disfarça de outros valores, ele não é um valor real de carta.
Métodos
 Como resolver?
 Vamos criar nossa própria busca!
Métodos
 Nossa busca precisa retornar um objeto que pode ou não
conter uma carta, mas que faça isso de maneira segura, ao
invés do nulo.
 Quando um objeto pode ou não ser retornado é comum ele ser
chamado de valor opcional dentro do paradigma funcional.
Métodos
 Uma outra nomenclatura bastante utilizada é o Maybe, ou em
português, Talvez.
 Então precisamos criar uma busca que talvez retorne uma
carta.
Métodos
 Este tipo de implementação geralmente é um pouco mais
avançada, mas não se assuste, faremos um passo-a-passo!
 A primeira coisa é criarmos a classe para representar este
dado incerto.
Métodos
Métodos
 Esta implementação atende este caso, mas é melhor deixá-la
mais genérica.
Métodos
 Precisamos agora, criar nossa lógica para encapsular o valor
de forma fluída e simples de usar.
Métodos
Métodos
 Vamos fazer nossa consulta para que ela talvez retorne uma
carta.
Métodos
Métodos
 Agora podemos usar desta forma:
Métodos
 Mas e se o programador simplesmente acessar a propriedade
Valor e ela estiver nula?
Métodos
 Este código está bom?
 Não...
 Ainda não resolvemos nenhum problema, mas calma, vamos
chegar lá.
Métodos
 Primeiro vamos ajustar todas besteiras feitas na classe
consultas, um total de DEZ erros.
Métodos
Métodos
1. Esta classe deveria ser estática, ela não guarda estado e é
somente uma extensão;
2. O método TentarObter também deveria ser estático
3. Deveria ser possível retornar qualquer tipo de valor
4. Deixaremos este erro para depois;
5. Deveria ser possível a consulta em qualquer tipo de coleção
6. A coleção deveria ter um nome mais genérico que “cartas”
Métodos
Métodos
7. A consulta está sendo feita de forma FIXA;
 Como resolver isso?
 Precisamos passar o método da consulta por parâmetro!
Métodos
Métodos
 Os últimos 3 problemas restantes se referem à consulta estar
contendo a lógica para a criação de um objeto do tipo Talvez.
 Vamos resolver isso alterando a classe Talvez!
Métodos
Métodos
 Estamos quase lá...
 Veja como o código está ficando melhor:
Métodos
Métodos
 Vamos para o toque final, já notamos que deixar a propriedade
Valor acessível é uma ideia ruim, pois pode gerar problemas
com null, então vamos restringir o acesso a ela.
Métodos
 Agora precisamos fazer com que o programador só consiga
utilizar ela quando existir um valor:
Métodos
 E como utilizamos?
Métodos
 Já chegamos em um resultado muito bom, criando uma
estrutura nova com o Obter da classe Talvez, mas ainda há
alguns pequenos refinamentos no código.
1. Transformar a função TentarObter em uma extensão do LINQ
2. Facilitar a criação de objetos do tipo Talvez
Métodos
 Para fazermos o TentarObter se tornar uma extensão como o
LINQ, basta tornar este método um extension method.
Métodos
Métodos
 Para facilitar a criação de objetos do tipo Talvez precisamos
criar um cast implícito.
 Sobrecarregando o operador de cast permite a conversão
implícita, como já ocorre do int para o double, por exemplo.
Métodos
 Com esta facilidade não precisamos mais criar o objeto Talvez
na consulta, podemos simplesmente declarar que retornamos
ele e o C# faz a magia acontecer.
Métodos
Métodos
Métodos
Métodos
 O legal disso, é que agora temos extensão para utilizar em
todas as coleções do projeto, veja outro exemplo:
Métodos
 Ainda existe um problema inerente à nossa classe Talvez;
 Ela ainda é uma classse...
 Então ela pode ser nula!
 Como resolver?
 Utilize struct ao invés de classe
Métodos
 Existem muitas outras funcionalidades que poderíamos
conversar, mas por hoje é só.
Me encontre em
/gabrielschade
/gabrielschade
/gabrielschade
/gabrielschade
https://gabrielschade.github.io
Perguntas?

DDD linguagem ubiqua + codigo expressivo

Notas do Editor

  • #15 Falar da história da primeira semana de projeto que me senti perdido.
  • #18 Carro é a composição de tudo
  • #22 Falar da história da primeira semana de projeto que me senti perdido.