Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

85
“Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java” Aluno: Carlos Eduardo de Carvalho Dantas Orientador: Marcelo de Almeida Maia Fevereiro/2017 1

Transcript of Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Page 1: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

“Um Estudo Quantitativo Sobre o Uso de Herança e

Interface em Sistemas Java”

Aluno: Carlos Eduardo de Carvalho Dantas

Orientador: Marcelo de Almeida Maia

Fevereiro/20171

Page 2: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.2

Page 3: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

HERANÇA

3

Page 4: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Reaproveitamento de Código

4

Page 5: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Design Patterns

5

Page 6: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

6

Sintaxe da linguagem Java

Page 7: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

7

APIs

Page 8: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

8

Frameworks

Page 9: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Entretanto...

“The introduction of inheritance severely compromises the benefits of this encapsulation”

9

1986

Page 10: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

“Favor object composition over class inheritance”

10

1995

Page 11: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

“Systems without inheritance were easier to modify than the corresponding systems containing three or five levels of inheritance”

11

2000

Page 12: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

12

2003

Page 13: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

“Used inappropriately, inheritance leads to fragile software”

13

2008

Page 14: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

14

Collections Framework

Page 15: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

15

JDBC API

Page 16: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Estas recomendações exerceram alguma influência nos desenvolvedores em geral?

16

Page 17: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.17

Page 18: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Avaliar se o recurso de herança vêm sendo empregado de maneira diferente em

sistemas mais recentes

18

Page 19: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #1) A época em que o sistema foi construído exerce alguma influência sobre a frequência no uso de herança ou implementação de interfaces?

19

Page 20: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #2: A época em que o sistema foi construído exerce alguma influência sobre a quantidade das quebras de encapsulamento por instanceof?

20

Page 21: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

21

Superclasse

Subclasses

Page 22: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #3: A época em que o sistema foi construído exerce alguma influência sobre a quantidade de alterações corretivas em classes com herança e interface?

22

Page 23: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #4: Classes com herança ou implementação de interface possuem níveis adequados de coesão e acoplamento?

23

CBO ELOCLCOM NOMRFC WMC

Page 24: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #5: Quais Code Smells ocorrem predominantemente em classes com herança ou implementação de interface?

24

Class Data Should be PrivateComplex Class

Functional DecompositionGod ClassLazy Class

Long MethodSpagheti Code

Page 25: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

RQ #6: Com qual frequência ocorre adição ou remoção de herança e implementação de interfaces sobre as classes? E por quais razões estas operações são realizadas?

25

Page 26: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.26

Page 27: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

Considera-se apenas classes internas

27

Page 28: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

28

Seleção dos Sistemas

Page 29: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

29

Page 30: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

30

TagsAutenticaçãoDuplicidade CVS,SVN,GIT

Page 31: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

31

start, initial, test,before, beta, alpha, pre, demo, old, init, none, dev, example, first import, experimental,hello world, inicio, readme,firstcommit,RC[0..9] e CR[0..9].

Page 32: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

50% do total de classes nos 20 primeiros commits

32

Page 33: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

33

32 classes 32 classes 16 meses9 meses

122 commits

150 commits

15 meses 8 meses

Page 34: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

34

Page 35: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

35

Informações sobre os Sistemas

1.301.856 commits

1.297.199 classes & interfaces

1.656 sistemas

Page 36: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

36

Modelagem dos dados

1) Consistência dos dados2) Ligações entre entidades3) Descartes4) Geração de arquivos

Superclasse

Pacote da classe

Imports

Page 37: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

37

Análise dos Dados – RQ #1

Influência da data da versão inicial do sistema sobre a quantidade de classes em herança ou implementando interfaces

Regressão Binomial Negativo (mesmo modelo da regressão de Poisson)

Arquitetura original do sistema

Page 38: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

38

Análise dos Dados – RQ #1

Avaliar a distribuição da proporção de classes com herança e implementação de interface

Page 39: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

39

Análise dos Dados – RQ #2

Influência da data de criação do sistema sobre a quantidade de subclasses referenciadas pelo operador instanceof

Histórico de alterações sobre as

classes

Page 40: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

40

Análise dos Dados – RQ #2

Avaliar a distribuição da proporção de classes em herança e implementação referenciados por instanceof

Page 41: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

41

Análise dos Dados – RQ #3

Influência da data de criação do sistema sobre a quantidade de alterações corretivas sobre classes com e sem herança

Histórico de alterações sobre as

classes

Page 42: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

42

Análise dos Dados – RQ #3

Avaliar a distribuição da proporção de classes em herança e implementação de interfaces que possuem mudanças corretivas

Page 43: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

43

Análise dos Dados – RQ #4

Comparação das classes para cada métrica (teste Mann-Whitney U)

Com e sem herançaCom e sem implementação de interfaces

Arquiteturas original e final do sistema

Page 44: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

44

Análise dos Dados – RQ #5

1) Construção de duas tabelas de contingência (versões inicial e final)Com e sem herança/implementação de interfacesCom e sem a ocorrência de determinado Code Smell

2) Aplicações dos testes Fisher e Qui Quadrado

Arquiteturas original e final do sistema

Page 45: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

45

Análise dos Dados – RQ #6

1) Análise do Histórico de Commits das classesa) Sempreb) Perdeuc) Depoisd) Nunca

Histórico de alterações sobre as

classes

Page 46: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

46

Análise dos Dados – RQ #6

2) Análise qualitativa sobre as classes que adicionaram e perderam herança e interface

2.1) Seleção de 40 alterações em 40 sistemas.2.2) Diagramas de classe e avaliação das mensagens de

commit.2.3) Codificação dos temas para cada alteração2.4) Hierarquização dos temas

Page 47: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.47

Page 48: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

48

Resultados – RQ #1

e2,240e-03 = 1,002

e0,0020224 = 1,002

Pr(Chi) = 6.462469e-05

Pr(Chi) = 6.326497e-05

Page 49: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

49

Resultados – RQ #1

Page 50: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

50

Resultados – RQ #1

Page 51: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

51

Resultados – RQ #1

Page 52: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

52

Resultados – RQ #1

Page 53: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

53

Resultados – RQ #1

Março-2009

Page 54: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

54

Resultados – RQ #2e7,282e-03 = 1,007

e8,888e-03 = 1,008Pr(Chi) = 0

Pr(Chi) = 2.220446e-16

Page 55: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

55

Resultados – RQ #2

Page 56: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

56

Resultados – RQ #2

Page 57: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

57

Resultados – RQ #2

Page 58: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

58

Resultados – RQ #2

Page 59: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

59

Resultados – RQ #2

Julho-2008

Page 60: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

60

Resultados – RQ #3e1,763e-03 = 1,001

Pr(Chi) = 0.0016

Pr(Chi) = 0.036

e-9758e-04 = -1,0009e2832e-03 = 1,002

e-9671e-04 = -1,0009

Pr(Chi) = 0.0422

Pr(Chi) = 5.009351e-06

Page 61: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

61

Resultados – RQ #3

Page 62: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

62

Resultados – RQ #3

Page 63: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

63

Resultados – RQ #3

Page 64: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

64

Resultados – RQ #3

Page 65: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

65

Resultados – RQ #3

Julho-2008

Page 66: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

66

Resultados – RQ #4

CBO

ELOC

LCOM

Page 67: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

67

Resultados – RQ #4

α = 0,1741

RFC

NOM

WMC

Page 68: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

68

Resultados – RQ #4

Page 69: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

69

Resultados – RQ #5

Page 70: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

70

Resultados – RQ #5

Page 71: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

71

Resultados – RQ #6

97,35% Herança

97,59% Imp. Interface

Page 72: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

72

Resultados – RQ #6

98,25% Herança

98,59% Imp. Interface

Page 73: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

73

Resultados – RQ #6

1) Abstrações Incertas (15 alterações – 37,5%)

Page 74: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

74

Resultados – RQ #6

2) Comportamento padrão para as interfaces (9 alterações – 22,5%)

Page 75: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

75

Resultados – RQ #6

3) Novas funcionalidades com adoção de boas práticas (7 alterações – 17,5%)

Page 76: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

76

Resultados – RQ #6

4) Outros (9 alterações – 22,5%)Sem identificação (4 alterações)Estender classes externas (3 alterações)Refactoring move package (2 alterações)

Page 77: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.77

Page 78: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

78

1) Tags.

Release_0_0_1

Snapshot-2000-07-11T12_26_00Z

Page 79: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

79

1) Tags;

2) Refactoring move package ou rename class.

Page 80: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

80

1) Tags;

2) Refactoring move package ou rename class;

3) Escopo restrito à plataforma Java.

Page 81: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

ROTEIRO

1. Contextualização do Problema.

2. Objetivos.

3. Metodologia.

4. Resultados.

4. Ameaças à validade.

5. Conclusão.81

Page 82: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

82

Lição 1: Sistemas mais recentes têm projetado melhor o recurso de Herança, mas o crescimento

das classes pode ser desproporcional

Uso de herança

Instanceof

Mudanças corretivas

ComplexClass e God Class na

última release

Page 83: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

83

Lição 2: Desenvolvedores ainda tendem a projetar herança visando primariamente o

reaproveitamento de código

Lazy ClassInclusões de

herança

Page 84: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

84

Lição 3: Existem indícios de que interfaces ainda são subutilizadas

20% de classes imp. interfaces

Redução no seu uso em sistemas

recentes

15,33% das interfaces sem

métodos

Page 85: Um Estudo Quantitativo Sobre o Uso de Herança e Interface em Sistemas Java

85

Lição 4: Interfaces possuem tendência de possuir pouca

relação com as classes que as implementam

Métricas estruturais e Code Smells sem grande

variação

Perda de interfaces mais

frequente