O documento discute o Princípio da Substituição de Liskov (LSP), que estabelece que subclasses devem ser substituíveis por suas superclasses sem alterar as propriedades desejadas do programa. O LSP é importante para manter a correção do comportamento quando se usa herança e polimorfismo. Classes derivadas devem respeitar os contratos definidos pelas classes base para não violar o princípio.
Apresentação sobre design de software orientado a objetos com foco nos princípios de design SOLID. A apresentação foi feita no formato PUB no InterCon PHP de 2014 e contou com a participação de @augustohp, @guilhermeblanco, @Ivonascimento, @lcobucci, @nelson_senna e @netojoaobatista.
Design de aplicações orientadas a objetoElaine Naomi
Modelamos aplicações Ruby como um conjunto de objetos interagindo entre si para resolver um problema.
Quando propomos uma solução, ela geralmente é validada dentro de um escopo específico.
Mas mudanças sempre acontecem: no código, nas regras de negócio, na vida, no universo e em tudo mais.
Com essas mudanças, será que uma solução inicialmente proposta continua sendo válida? Se não for, o código implementado está preparado para evoluir e agregar novos comportamentos de maneira saudável?
Nesta talk, vamos analisar princípios e padrões de design de aplicações orientadas a objeto e como podemos aplicá-los no dia a dia a fim de tornar nosso código mais flexível e com maior qualidade.
21/07/2018
Apresentação sobre design de software orientado a objetos com foco nos princípios de design SOLID. A apresentação foi feita no formato PUB no InterCon PHP de 2014 e contou com a participação de @augustohp, @guilhermeblanco, @Ivonascimento, @lcobucci, @nelson_senna e @netojoaobatista.
Design de aplicações orientadas a objetoElaine Naomi
Modelamos aplicações Ruby como um conjunto de objetos interagindo entre si para resolver um problema.
Quando propomos uma solução, ela geralmente é validada dentro de um escopo específico.
Mas mudanças sempre acontecem: no código, nas regras de negócio, na vida, no universo e em tudo mais.
Com essas mudanças, será que uma solução inicialmente proposta continua sendo válida? Se não for, o código implementado está preparado para evoluir e agregar novos comportamentos de maneira saudável?
Nesta talk, vamos analisar princípios e padrões de design de aplicações orientadas a objeto e como podemos aplicá-los no dia a dia a fim de tornar nosso código mais flexível e com maior qualidade.
21/07/2018
Quem nunca pensou em passar um tempo refatorando aquele código bagunçado?
Eu adoro melhorar o código, deixá-lo mais organizado, mais fácil de compreender e claro mais bonito também.
Um dia eu li o famoso livro do Martin Fowler que me ajudou bastante e quero compartilhar o que aprendi: indicativos de necessidade de refatorar e claro soluções também, que muitas vezes são mais simples do que imaginamos.
Aqui são apresentados conceitos básicos a plataforma Java. Simples e rápido.
/**Depois que entrei no mundo Java, começei a procurar por conteúdo na internet para estudar, então me deparei com um ótimo site, http://www.argonavis.com.br, de um grande cara chamado Helder Rocha, que disponibiliza este mesmo conteúdo em seu site também. Obrigado pela ajuda a comunidade.*/
Seus testes estão gritando. Você está ouvindo?lucashungaro
Dicas e técnicas para aplicação de alguns princípios do SOLID através de BDD.
Muito já se falou sobre testes e, aos poucos, fala-se mais sobre OOP e SOLID. Como juntar essas coisas para conseguir benefícios na prática?
Functional programming feat. Swift (Portuguese)FrankKair1
This is an introductory talk about using Functional programming techniques and principles with the Swift programming language.
The talk was presented at a Cocoaheads meetup in Florianópolis, Brazil.
https://www.meetup.com/CocoaHeads-Florianopolis/events/235936104/
Code Smells: o que eles dizem sobre seu código?Elaine Naomi
Apresentação RubyConfBR 2018
No mundo do Rails, aprendemos a sempre analisar o nosso código sobre o princípio do DRY e seguimos a estratégia de afastar qualquer lógica das nossas views, manter nossos controllers simples e mover toda a lógica de negócio para nossos models.
E quando a nossa aplicação começa a ficar complexa e de difícil manutenção? Models cada vez maiores e com cenários de testes complexos? O que isso diz sobre a nossa aplicação e sobre a qualidade do código escrito? É hora de começar do zero e reescrever tudo? É hora de mudar de paradigma? É hora de migrar para microsserviços? Calma! Vamos, primeiro, identificar os problemas de design da base de código atual.
Nessa talk, vamos conhecer code smells que nos auxiliam na refatoração e na medição da qualidade do nosso código, discutindo o impacto das decisões de design na evolução das aplicações, na entrega de funcionalidades, no processo de desenvolvimento e na comunicação e interação entre as pessoas da equipe.
13/12/2018
Quando iniciamos a jornada como pessoa desenvolvedora, temos infinitas possibilidades para explorar, desde as boas práticas de design de código a questões como criação de interfaces, integrações com serviços, etc. E, por mais que nos preparemos para tudo, acabamos deixando de lado questões mais humanas em prol de questões mais técnicas. No entanto, o fator humano gera grande impacto na qualidade do software gerado, seja a curto ou a longo prazo. E o processo de code review traz, indiretamente, esse assunto em pauta.
Nessa palestra, vamos discutir o code review, analisando como a forma como a comunicação pode afetar não só a qualidade do software mas também a interação entre as pessoas.
Apresentação 29/06/2019
Mais conteúdo relacionado
Semelhante a Hacking Evening - Liskov Substitution Principle
Quem nunca pensou em passar um tempo refatorando aquele código bagunçado?
Eu adoro melhorar o código, deixá-lo mais organizado, mais fácil de compreender e claro mais bonito também.
Um dia eu li o famoso livro do Martin Fowler que me ajudou bastante e quero compartilhar o que aprendi: indicativos de necessidade de refatorar e claro soluções também, que muitas vezes são mais simples do que imaginamos.
Aqui são apresentados conceitos básicos a plataforma Java. Simples e rápido.
/**Depois que entrei no mundo Java, começei a procurar por conteúdo na internet para estudar, então me deparei com um ótimo site, http://www.argonavis.com.br, de um grande cara chamado Helder Rocha, que disponibiliza este mesmo conteúdo em seu site também. Obrigado pela ajuda a comunidade.*/
Seus testes estão gritando. Você está ouvindo?lucashungaro
Dicas e técnicas para aplicação de alguns princípios do SOLID através de BDD.
Muito já se falou sobre testes e, aos poucos, fala-se mais sobre OOP e SOLID. Como juntar essas coisas para conseguir benefícios na prática?
Functional programming feat. Swift (Portuguese)FrankKair1
This is an introductory talk about using Functional programming techniques and principles with the Swift programming language.
The talk was presented at a Cocoaheads meetup in Florianópolis, Brazil.
https://www.meetup.com/CocoaHeads-Florianopolis/events/235936104/
Code Smells: o que eles dizem sobre seu código?Elaine Naomi
Apresentação RubyConfBR 2018
No mundo do Rails, aprendemos a sempre analisar o nosso código sobre o princípio do DRY e seguimos a estratégia de afastar qualquer lógica das nossas views, manter nossos controllers simples e mover toda a lógica de negócio para nossos models.
E quando a nossa aplicação começa a ficar complexa e de difícil manutenção? Models cada vez maiores e com cenários de testes complexos? O que isso diz sobre a nossa aplicação e sobre a qualidade do código escrito? É hora de começar do zero e reescrever tudo? É hora de mudar de paradigma? É hora de migrar para microsserviços? Calma! Vamos, primeiro, identificar os problemas de design da base de código atual.
Nessa talk, vamos conhecer code smells que nos auxiliam na refatoração e na medição da qualidade do nosso código, discutindo o impacto das decisões de design na evolução das aplicações, na entrega de funcionalidades, no processo de desenvolvimento e na comunicação e interação entre as pessoas da equipe.
13/12/2018
Quando iniciamos a jornada como pessoa desenvolvedora, temos infinitas possibilidades para explorar, desde as boas práticas de design de código a questões como criação de interfaces, integrações com serviços, etc. E, por mais que nos preparemos para tudo, acabamos deixando de lado questões mais humanas em prol de questões mais técnicas. No entanto, o fator humano gera grande impacto na qualidade do software gerado, seja a curto ou a longo prazo. E o processo de code review traz, indiretamente, esse assunto em pauta.
Nessa palestra, vamos discutir o code review, analisando como a forma como a comunicação pode afetar não só a qualidade do software mas também a interação entre as pessoas.
Apresentação 29/06/2019
TDC SP 2019 - Decodificando o code reviewElaine Naomi
Quando iniciamos a jornada como pessoa desenvolvedora, temos infinitas possibilidades para explorar, desde as boas práticas de design de código a questões como criação de interfaces, integrações com serviços, etc. E, por mais que nos preparemos para tudo, acabamos deixando de lado questões mais humanas em prol de questões mais técnicas. No entanto, o fator humano gera grande impacto na qualidade do software gerado, seja a curto ou a longo prazo. E o processo de code review traz, indiretamente, esse assunto em pauta. Nessa palestra, vamos discutir o code review, analisando como a forma como a comunicação pode afetar não só a qualidade do software mas também a interação entre as pessoas.
Apresentação do TDC SP - Trilha de Ruby - 20/07/2019
Code review: o que isso diz sobre a cultura dos times de desenvolvimento?Elaine Naomi
Como é o processo de desenvolvimento de software em sua empresa? Existe o foco na qualidade do software desenvolvido ou apenas na funcionalidade entregue? Como é a comunicação e interação dos times de desenvolvimento? Quais são as práticas adotadas para melhorar esses pontos?
Nessa palestra, vamos discutir sobre a cultura da revisão de código, analisando o impacto e importância na entrega de software com qualidade e na construção de times distribuídos.
Data da apresentação: 14-04-2019
Explorando o Paralelismo em Workflows Intensivos em Dados com o Uso de Anotaç...Elaine Naomi
ERAD 2016
O uso de plataformas de alto desempenho é um requisito para a execução de atividades que lidam com grandes volumes de dados. Um conjunto de atividades interligadas, modeladas como um workflow, pode ter sua execução controlada por um Sistema de Gerenciamento de Workflows (SGWfs). O paralelismo de dados pode diminuir o seu tempo total de execução, contudo, os SGWfs não exploram isso de maneira automática. Este trabalho propõe o uso de anotações semânticas para a criação automática de um modelo paralelo para a execução das atividades. Em experimentos com um workflow que lida com 5,8 milhões de objetos de dados, a paralelização obtida das anotações reduziu em 88,37% o tempo de execução do workflow e em 10,35% o custo financeiro.
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...Elaine Naomi
SBBD 2016
Abstract: Applications that analyze large volumes of data are often modeled as interconnected activities (workflows) and executed on high-performance platforms. Data partitioning and replication can make the activities parallelizable. However, to define a model that results in an efficient use of the platform is not trivial. This work proposes semantic annotations to characterize the data processing in workflows activities, in order to automatically create strategies to parallelize the execution. In experiments with a workflow that handles 5.8 millions of data objects in a NoSQL system, the parallelism obtained from the annotations has reduced the makespan by 88.4% and the financial cost by 10.4%.
Full paper available on: http://sbbd2016.fpc.ufba.br/sbbd2016/sbbd/sbbd_s028.pdf
Um Método para Paralelização Automática de Workflows Intensivos em DadosElaine Naomi
A análise de dados em grande escala é um dos grandes desafios computacionais atuais e está
presente não somente em áreas da ciência moderna mas também nos setores público e industrial.
Nesses cenários, o processamento dos dados geralmente é modelado como um conjunto de atividades
interligadas por meio de fluxos de dados – os workflows. Devido ao seu alto custo computacional,
diversas estratégias já foram propostas para melhorar a eficiência da execução dos workflows intensivos
em dados, tais como o agrupamento de atividades para a minimizar a transferência de dados e
a paralelização do processamento, de modo que duas ou mais atividades sejam executadas ao mesmo
tempo em diferentes recursos computacionais. O paralelismo nesse caso é definido pela estrutura
descrita em seu modelo de composição de atividades. Em geral, os Sistema de Gerenciamento de
Workflows, responsáveis pela coordenação e execução dessas atividades em um ambiente distribuído,
desconhecem o tipo de processamento a ser realizado e por isso não são capazes de explorar
automaticamente estratégias para execução paralela. As atividades paralelizáveis são definidas pelo
usuário em tempo de projeto e criar uma estrutura que faça uso eficiente de um ambiente distribuído
não é uma tarefa trivial. Este trabalho tem como objetivo prover execuções mais eficientes
de workflows intensivos em dados e propõe para isso um método para a paralelização automática
dessas aplicações, voltado para usuários não-especialistas em computação de alto desempenho. Este
método define nove anotações semânticas para caracterizar a forma como os dados são acessados
e consumidos pelas atividades e, assim, levando em conta os recursos computacionais disponíveis
para a execução, criar automaticamente estratégias que explorem o paralelismo de dados. O método
proposto gera réplicas das atividades anotadas e define também um esquema de indexação e
distribuição dos dados do workflow que possibilita maior acesso paralelo. Avaliou-se sua eficiência
em dois modelos de workflows com dados reais, executados na plataforma de nuvem da Amazon.
Usou-se um SGBD relacional (PostgreSQL) e um NoSQL (MongoDB) para o gerenciamento de até
20,5 milhões de objetos de dados em 21 cenários com diferentes configurações de particionamento e
replicação de dados. Os resultados obtidos mostraram que a paralelização da execução das atividades
promovida pelo método reduziu o tempo de execução do workflow em até 66,6% sem aumentar
o seu custo monetário.
15. Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
17. Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
19. Teoria dos Tipos
Como representar caracteres, números inteiros e de ponto
flutuante, booleanos no nível do processador?
Abstrações! E não pensar em bits e bytes!
E cada tipo tem suas restrições/comportamentos
20. Tipos Abstratos de Dados
Conjunto de comportamentos/operações
Estrutura de dados específica (atributos)
Como representar elementos do domínio de negócio
21. Tipos Abstratos de Dados
Conjunto de comportamentos/operações
Estrutura de dados específica (atributos)
Como representar elementos do domínio de negócio
CLASSES
24. Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
"SUBCLASSES"
26. Liskov Substitution Principle (1987)
Traduzindo:
Preciso garantir que se eu substituir um objeto de uma classe por um
outro objeto de uma subclasse dessa classe, as propriedades que
definem o objeto-pai precisam continuar funcionando.
28. Herança: herança de comportamentos de
uma super classe
Polimorfismo: definição de uma interface única para
acessar tipos diferentes de objetos
29. ALERTA!
Cuidado com interpretações equivocadas sobre LSP:
Se uma subclasse altera o comportamento da superclasse,
nem sempre é uma violação desse princípio
Podemos e devemos usar o polimorfismo
(mas com sabedoria)
32. Pré-condições: dados de entrada
classes derivadas só podem ser mais permissivas
Pós-condições: dados de saída
classes derivadas só podem ser mais restritivas
Não podemos criar comportamentos inesperados ou incorretos!
O comportamento da super classe precisa ser mantido
33. class CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 0
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
34. class PayrollAccount < CheckingAccount
class OperationNotAllowed < StandardError; end
# ...
def compute_bonus
raise OperationNotAllowed
end
end
38. class PayrollAccount < CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 100
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
39. class PayrollAccount < CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 100
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
contrato quebrado
42. class Rectangle
attr_reader :width, :height
def initialize(width, height)
@width = width
@height = height
end
def area
width * height
end
end
43. class Square < Rectangle
attr_reader :width, :height
def initialize(width)
@width = width
@height = width
end
end
contrato quebrado
44. O que a gente precisa lembrar sobre esse princípio?
Interfaces/Abstração de comportamentos
Polimorfismo
Design by contract
Nem tudo que parece herança deveria ser uma herança