• Nenhum resultado encontrado

Imutabilidade. Algoritmos e Estrutura de Dados

N/A
N/A
Protected

Academic year: 2021

Share "Imutabilidade. Algoritmos e Estrutura de Dados"

Copied!
31
0
0

Texto

(1)

Imutabilidade

Algoritmos e Estrutura de Dados

1

MINISTÉRIO DA EDUCAÇÃO

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE INSTITUTO METRÓPOLE DIGITAL

PROGRAMA DE PÓS-GRADUAÇÃO EM ENGENHARIA DE SOFTWARE

Eduardo Luiz, François Oliveira, Marcelo Luiz, Marcos Alvarenga Natal/RN 2018

(2)

Imutabilidade: Quem nunca?

1. Sua aplicação já se comportou de forma inesperada?

2. Já passou horas olhando para o código tentando

entender o que ”diabos” está acontecendo?

3. Já se perdeu tentando achar qual linha de código está

alterando alguma variável indevidamente?

(3)

Imutabilidade

Conhecer os conceitos de

”imutabilidade”

pode salvar o

negócio do seu cliente, o seu

emprego

e a

sua vida

.

MPES – Algoritmos e Estrutura de Dados Imutabilidade 3

(4)

O que é Imutabilidade?

• Imutabilidade é a qualidade de não ser capaz de se alterar. • Em programação orientada a objetos, imutabilidade refere-se ao fato de quando um objeto imutável é criado, seu estado ou seu valor não pode ser modificado até o final da sua vida. • Dependendo da camada de abstração um objeto pode ser parcial, totalmente imutável ou conter atributos que são imutáveis. Imutabilidade 4 MPES – Algoritmos e Estrutura de Dados

(5)

Para que serve um objeto que não posso mudar?

• Apesar de não ser possível mudar um objeto imutável, é possível transformá-lo em um novo objeto. • Sempre que seu estado o valor necessitar ser alterado um novo objeto é criado. Imutabilidade 5 MPES – Algoritmos e Estrutura de Dados Objeto Original Str comida = ”Vaca”; Objeto Transformado Str comida = ”Bife”; Objeto Transformado Str comida = ”Sanduiche, huum...”;

(6)

Objetos Imutáveis

• Toda operação que muda um estado de um objeto imutável resulta não criação de um novo objeto que é a cópia do objeto anterior em seu estado antigo transformado para o novo estado. • Alterar objetos mutáveis ​​é caro, se houver uma grade quantidade de mudanças, pois cada vez que se alterar o valor do objeto, um novo objeto será criado em memória. Imutabilidade 6 MPES – Algoritmos e Estrutura de Dados

(7)

Objetos Imutáveis

• Se um objeto é conhecido por ser imutável, ele pode ser copiado simplesmente fazendo-se uma cópia de uma referência para ele em vez de copiar o objeto inteiro. • Devido à referência ser um endereço de memória, menor que o tamanho do objeto em si, há economia de memória. Imutabilidade 7 MPES – Algoritmos e Estrutura de Dados Python: >>> string1 = ”abcd” >>> string2 = string1 >>> id(string1) (123456) >>> id(string2) (123456)

(8)

Objetos Imutáveis

• Quando existe a necessidade de serem alterados um novo objeto é criado com o novo valor e as referências (variáveis) são atualizadas para o novo objeto. Imutabilidade 8 MPES – Algoritmos e Estrutura de Dados Python: >>> string1 = ”abcd” >>> string2 = string1 >>> string2 = ”abcdef” >>> id(string2) (654321) >>> id(string1) (123456)

(9)

Objetos Imutáveis

• Ao criar um novo objeto, o objeto anterior perderá as referências e ficará no ”limbo” (vácuo) até o coletor de lixo (garbage collector) se encarregar de remover o objeto da memória. Imutabilidade 9 MPES – Algoritmos e Estrutura de Dados Id: 123456 Id: 654321 Garbage Collector Remove Object from Memory

(10)

Objetos Mutáveis

• Quanto temos um objeto mutável, as alterações realizadas através de qualquer referencia a esse objeto, são realizadas no próprio objeto original, ou seja, todas as referências (variáveis) a este objeto terão seu valor atualizado. • Alterar objetos mutáveis ​​é barato, pois não é necessário mais memória para criação de um novo objeto. Imutabilidade 10 MPES – Algoritmos e Estrutura de Dados Python: >>> list1 = [10] >>> list2 = list1 >>> list2.append(20) >>> print list1 [10, 20]

(11)

Efeitos Colaterais

MPES – Algoritmos e Estrutura de Dados Imutabilidade 11 • Objetos mutáveis podem representar um risco no controle da aplicação uma vez

que podem ser alterados por qualquer parte do código.

Escala:

A utilização do token ”var” ao invés de ”val”, transformou o objeto ”myMoney” em mutável, permitindo que o mesmo fosse alterado indevidamente .

(12)

DDD – Domain Driven Design

Imutabilidade no nível de arquitetura

DDD – Domain Driven Design é uma abordagem de

desenvolvimento de software

Utiliza um coleção de padrões de projetos para resolver

problemas comuns no desenvolvimento de Sistemas

Utiliza duas formas básicas para representação de objetos

do domínio nos sistemas:

Entidades (Entities)

Objetos de Valor (Value Objects)

(13)

DDD – Domain Driven Design - Entidades

Representa no Sistema algo do domínio

Devem possuir um identificador único, ID, para distinguí-lo

das outras entidades mesmo que o valor dos demais

atributos sejam iguais, sua principal característica

Podem ser transformados ao longo do tempo, são

mutáveis

Devem ser mantidos ao longo do tempo, são persistidos

(14)

DDD – Domain Driven Design – Objetos de Valor(Value Objects)

Mensura, quantifica ou descreve algo no domínio

Deve ser imutável

Modela um conceito ao reunir vários atributos como um

valor único

É totalmente descartável quando um desses atributos é

alterado

Pode ser comparado a outros objetos baseado na

igualdade de seus atributos

As funções aplicadas aos objetos de valor não possuem

efeitos colaterais , já que novas instâncias podem ser

criadas sem se preocupar com as obsoletas

(15)

DDD – Domain Driven Design – Objetos de Valor(Value Objects)

Endereço, Rua Felipe Guerra, 205 Apto 203, Centro

Tipo Logradouro+Logradouro+Número+Complemento+Bairro

Valor Monetário, R$ 100,00

Moeda + Valor

Período de Datas, 01/01/2017 a 31/12/2017

Data Inicial + Data Final

Coordenada 2D, (2,3)

X + Y

(16)

Linguagens e Objetos Imutáveis (Python)

Imutabilidade 16

MPES – Algoritmos e Estrutura de Dados

(17)

Linguagens e Objetos Imutáveis (Python)

• Tuplas são objetos imutáveis, porém uma "tupla” pode conter objetos mutáveis e imutáveis. • Listas são objetos mutáveis, e também podem conter objetos mutáveis e imutáveis. • É importante observar a diferença entre ambas, pois em alguns casos elas podem ser utilizadas para o mesmo propósito (armazenar mais de um valor no mesmo objeto), porém, alterar uma tupla, poderá ser mais caro, uma vez que a cada alteração está será recriada em memória.

(18)

Linguagens e Objetos Imutáveis (Python)

• Implementando imutabilidade em classes customizadas:

MPES – Algoritmos e Estrutura de Dados Imutabilidade 18 Fonte: https://pt.wikipedia.org/wiki/Objeto_imutável

(19)

Linguagens e Objetos Imutáveis (Java)

Imutabilidade 19 MPES – Algoritmos e Estrutura de Dados

Java

Tipos primitivos imutáveis

• boolean, byte, char, short, int, long, float e double

Classe String, implementa o tipo primitivo char também é

imutável

Classes wrapper como Integer

Objetos são mutáveis

(20)

Linguagens e Objetos Imutáveis (Java)

Imutabilidade 20

MPES – Algoritmos e Estrutura de Dados

Java

Simplicidade e previsibilidade

String s = “java nao eh legal”;

s.toUpperCase();

System.out.println(s);

Calendar c = Calendar.getInstance(); verificaFeriado(c);

(21)

Linguagens e Objetos Imutáveis (Java)

Imutabilidade 21 MPES – Algoritmos e Estrutura de Dados

Java

Otimização de memória

• Pool de Strings da JVM • Strings de mesmo conteúdo possam ser representadas por uma única instância compartilhada. • Classes wrapper como Integer • Ao invocar Integer.valueOf(int), a referência a Integer devolvida pode ser fruto de um cache interno.

(22)

Linguagens e Objetos Imutáveis (Java)

Imutabilidade 22

MPES – Algoritmos e Estrutura de Dados

Java

Imutabilidade e encadeamento de invocações de métodos

• Encadear invocações de métodos (method chaining) só é viável em um objeto imutável, pois só assim é garantido que cada método irá devolver a instância de um novo objeto, não possuindo efeito colateral.

String a = "java nao eh legal";

String b = a.toUpperCase().trim().substring(12);

(23)

Linguagens e Objetos Imutáveis (JavaScript)

Imutabilidade 23

MPES – Algoritmos e Estrutura de Dados

JavaScript

Tipos primitivos imutáveis:

• number, string, boolean, null, undefined e Symbol (ECMAScript 6)

Tipos mutáveis:

• Objetos, Funções, Arrays, Regex, etc.

Tipos primitivos são passados por valor, e são imutáveis;

Objetos são passados por referência, e são mutáveis.

(24)

Linguagens e Objetos Imutáveis (JavaScript)

Imutabilidade 24 MPES – Algoritmos e Estrutura de Dados

JavaScript

var a = 10 var b = 10

console.log(a === b) // true

var a = {x: 2, y: 1}

var b = {x: 2, y: 1}

console.log(a === b) // false -> Por Quê?

var a = {}

var b = a

(25)

Linguagens e Objetos Imutáveis (JavaScript)

Imutabilidade 25 MPES – Algoritmos e Estrutura de Dados

JavaScript

Mas por que isso é importante?

var a = {} var b = a

a.prop = 'any value'

console.log(b.prop) // 'any value’

var a = function () {

return 'a'

}

var b = a

a.prop = 'any value'

console.log(b()) // 'a'

(26)

Linguagens e Objetos Imutáveis (JavaScript)

Imutabilidade 26

MPES – Algoritmos e Estrutura de Dados

JavaScript

Mas por que isso é importante?

var x = { foo: 'bar', complexo:[1,2,3] }

Object.freeze(x)

x.foo = 'baz' // Não tem efeito

console.log(x.foo) // bar

x.complexo[1] = 10

(27)

Linguagens e Objetos Imutável (C#)

Imutabilidade 27 MPES – Algoritmos e Estrutura de Dados

Os tipos primitivos do C# são imutáveis

• Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, e Single. • Para saber se um tipo de dados é primitivo utilize a propriedade Type.IsPrimitive

• TimeSpan ou tipo moderno da família Tuple são imutáveis porque foi implementado para suportar linguagens funcionais (F#) no .NET. • Tipos imutáveis (também conhecidos como objetos de valor) são úteis na programação multithreading, programação funcional.

Classes são mutáveis

• Você pode tornar suas próprias classes e estruturas mutáveis ou imutáveis, como desejar. Para tornar uma classe ou struct imutável, basta remover todos os setters públicos / protegidos / internos ou declarar todos os campos com palavra-chave readonly. C#: class class

(28)

Imutabilidade: Resumindo

Imutabilidade 28 MPES – Algoritmos e Estrutura de Dados • Objetos imutáveis ​​são mais caros para “mudar”, porque isso envolve a criação de uma cópia. (Mito?!) • Porém, esse efeito negativo poderá ser observado melhor em operações que realizam muitas alterações em um mesmo objeto. • Objetos imutáveis ​​são recomendados ​​quando você precisa garantir que o objeto que você fez permanecerá sempre o mesmo. • É importante saber se o tipo de dados utilizado é imutável ou mutável, pois a eficiência da memória é altamente afetada quando os objetos apropriados são usados. • É importante conhecer a linguagem, como ela implementa os conceitos de imutabilidade para não cair em pegadinhas.

(29)

Objetos Imutáveis vs. Objetos Mutáveis

Imutabilidade 29 MPES – Algoritmos e Estrutura de Dados

Acesso mais

rápido, porém,

possui custo

de alteração

mais alto.

Acesso Mais

Lento, porém,

custo de

alteração mais

baixo.

Obje

tos

im

ut

áv

eis

O

bje

to

s Mu

ve

is

(30)

Por que utilizar objetos imutáveis?

Imutabilidade 30 MPES – Algoritmos e Estrutura de Dados • Já que não há espaços de estado complexos que mudam com o tempo

Fáceis de

Manter

• Enquanto que, para objetos mutáveis, precisamos fazer cópias defensivas primeiro

Fáceis de

Alterar

• Uma vez construído, outra thread não pode alterá-la

Thread Safe

• Um objeto mutável não pode ser encontrado no mesmo hashset onde seu estado é alterado

Hashtables

Seguras

(31)

Referências

Imutabilidade 31 MPES – Algoritmos e Estrutura de Dados • https://pt.wikipedia.org/wiki/Objeto_imutável • https://www.vicompany.nl/magazine/about-using-immutability-in-object-oriented-programming • https://www.youtube.com/watch?v=XZhAzePV18I • JavaScript • https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Data_structures • https://dzone.com/articles/why-string-immutable-java • https://medium.com/dailyjs/the-state-of-immutability-169d2cd11310 • Java • https://www.casadocodigo.com.br/products/livro-arquitetura-java • Python • https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747 • http://www.math.buffalo.edu/~badzioch/MTH337/PT/PT-mutable_vs_immutable/PT-mutable_vs_immutable.html

Referências

Documentos relacionados

O objetivo deste estudo foi avaliar o comporta- mento clínico de lesões de dermatite digital bovina após tratamento cirúrgico, uso local e parenteral de oxitetraci- clina e passagem

Changes in the gut microbiota appears to be a key element in the pathogenesis of hepatic and gastrointestinal disorders, including non-alcoholic fatty liver disease, alcoholic

Como forma de operacionalizar a organização e o trabalho da rede de atenção aos usuários de drogas, a PAIUAD pressupõe o tratamento e reinserção social dos usuários/dependentes

Os resultados mostram que tanto o Grau de Intangibilidade quanto o Retorno sobre Investimentos das empresas do setor de Consumo Cíclico são superiores aos do de

palavra ao Presidente, que procedeu à leitura do parecer da comissão avaliadora, composta 98.. pelos professores Roberto de Souza Salgado (Presidente – EEL),

As condições naturais, o tipo de colonização, a evolução das técnicas agrícolas adotadas e as políticas públicas aplicadas foram determinantes para o desenvolvimento

Trabalho de Conclusão de Curso apresentado ao curso de Agronomia, no Centro de Ciências Agrárias, da Universidade Federal de Santa Catarina, como requisito para

Os instrumentos de pesquisa utilizados serão: Ficha de Rastreamento das Participantes do Estudo, International Consultation on Incontinence Questionnaire – Short Form