Os princípios da linguagem
orientada a objeto em
Delphi, Ruby e C#
Alberto Monteiro & Marília Paiva
Agenda
SOLID
Todo mundo já sabe o que é
OO.
SOLID
O que vemos muitas vezes é
código procedural, disfarçado
de OO.
SOLID
Importação de ser ter
ABSTRAÇÕES.
Single Resposability Principle
O princípio da responsabilidade única descreve que cada objeto deve
ter uma única responsabilidade, e essa responsabilidade deve estar
complementarmente encapsulada dentro da classe.
Não deve haver mais de um motivo para que uma classe seja
alterada.
Single Resposability Principle
Single Resposability Principle
1.C#
2.Delphi
3.Ruby
Open Closed Principle
O princípio do Aberto/Fechado descreve que as
entidades(classes, módulos, funções, etc) devem
estar abertas para extensão, mas fechadas para
modificação.
Open Closed Principle
Open Closed Principle
Estender o comportamento da
classe deve ser fácil, mas ela
não deve ser constantemente
alterada.
Open Closed Principle
1.C#
2.Delphi
3.Ruby
Liskov Substitution Principle
O princípio da substituição de Liskov define
que os subtipos devem ser substituíveis
pelos tipos base.
Criado por Barbara Liskov em 1988.
Ela também foi a criadora da linguagem CLU que foi referência para outras linguagens como Python e
Ruby.
Liskov Substitution Principle
Liskov Substitution Principle
Herança é sempre um assunto
delicado.
Liskov Substitution Principle
Herança Reuso Fácil Eu quero
Liskov Substitution Principle
Hierarquia Longa Confusa
Liskov Substitution Principle
Retângulo
Quadrado
Liskov Substitution Principle
1.Ruby
2.C#
3.Delphi
LSP Smells
foreach (var empregado in empregados)
{
if (empregado is Gerente)
{
tesouraria.PagarGerente((empregado as Gerente));
}
else
{
tesouraria.PagarEmpregado(empregado);
}
}
Interface Segregation Principle
O princípio da segregação de interface
define que os clientes não devem ser
forçados a depender de métodos que eles
não usam.
Interface Segregation Principle
Interface Segregation Principle
Classe coesa é fundamental p/ manutenção e reuso.
E interfaces? Elas precisam ser coesas?
Interface Segregation Principle
Sim!!!
Interface Segregation Principle
1.Ruby
2.C#
3.Delphi
Dependency Inversion Principle
Módulos de alto nível não devem depender de módulos
de baixo nível. Ambos devem depender de abstrações.
Abstrações não devem depender dos detalhes. Os
detalhes é que devem depender de abstrações.
Dependency Inversion Principle
O que são dependências
 Plataforma
 Biblioteca de terceiros (SEMVER)
 Banco de dados
 Web Services
 Email
 Recursos do sistema(Data/Horário)
 new / Create => Instanciar um objeto
 Métodos globais(static, class procedure/function, def self.*)
 Random
 Thread
Dependency Inversion Principle
Falamos sobre
coesão no SRP
Classe gorda =>
Classes magras
Melhor
manutenção
Preciso juntar as
peças
Dependency Inversion Principle
Será que conseguimos acabar
com o acoplamento?
Dependency Inversion Principle
É impossível!!
As dependências sempre
existirão.
Dependency Inversion Principle
E agora?
Dependency Inversion Principle
Diferenciar os acoplamentos
Será que todo acoplamento é problemático?
Dependency Inversion Principle
Fugir dos acoplamentos perigosos
Dependency Inversion Principle
1.Ruby
2.C#
3.Delphi
DIP Smells
 Instanciar objetos usando new/Create
private void ReservarEstoque(Carrinho carrinho)
{
foreach (var item in carrinho.Itens)
{
var sistemaEstoque = new SistemaEstoque();
sistemaEstoque.Reservar(item.Id, item.Quantidade);
}
}
DIP Smells
 Uso de membros de classe (static/global)
cadastro.Data = DateTime.Now;
Ou
EmailService.SendMail(“email”);
Onde criar os objetos
 Aplicar DIP geralmente resulta em uma grande quantidade de interfaces, que eventualmente
precisam ser instanciadas em algum lugar... Mas onde?
 IoC Container
 C# => Ninject, Windsor, SimpleInjector...
 Delphi => Emballo, Spring4D, mOrmot
 Ruby => dim(mas não é comum ser usado)
 Ruby => Duck typing
Obrigado!!
Dúvidas?

SOLID Os princípios da linguagem orientada a objeto