Cosa si intende per riutilizzo dell'ereditarietà?

2

A 2013 study of 93 open source Java programs (of varying size) found that

While there is [no] huge opportunity to replace inheritance with composition (...), the opportunity is significant (median of 2% of uses [of inheritance] are only internal reuse, and a further 22% are only external or internal reuse). Our results suggest there is no need for concern regarding abuse of inheritance (at least in open-source Java software), but they do highlight the question regarding use of composition versus inheritance. If there are significant costs associated with using inheritance when composition could be used, then our results suggest there is some cause for concern. — Tempero et al., "What programmers do with inheritance in Java"[4]

Da: link

Qual è il significato del riutilizzo dell'ereditarietà?

    
posta q126y 11.12.2015 - 13:03
fonte

2 risposte

2

La mia ipotesi è che per "riutilizzo dell'ereditarietà" si intende riutilizzo del codice per mezzo dell'ereditarietà , al contrario del riutilizzo del codice mediante la composizione . Stanno riutilizzando il codice, non riutilizzando l'ereditarietà. Per riutilizzo interno, la mia ipotesi è che stiano parlando dell'estensione delle classi nello stesso pacchetto, mentre quella esterna riguarda l'estensione delle classi da pacchetti diversi.

    
risposta data 11.12.2015 - 13:51
fonte
1

È un po 'oscuro, ma la mia ipotesi istruita (perché nessuna altra ipotesi sembra avere un senso) è che:

  • Per "ereditarietà per il riutilizzo [del codice] esterno" si intendono i casi in cui un sottosistema espone (rende disponibile al pubblico) una classe base astratta, che deve essere estesa da altre classi di questo sottosistema o di altri sottosistemi. Quindi, in sostanza, il codice che usa la classe base è a conoscenza del fatto che l'ereditarietà è utilizzata.

Esempio:

public abstract class A {};
/* package-private or public */ class B extends A {};
/* package-private or public */ class C extends A {};
  • Per "ereditarietà per riutilizzo interno [codice]" si intendono i casi in cui un sottosistema espone (rende disponibile al pubblico) un'interfaccia, implementata internamente da un certo numero di classi che non sono esposte pubblicamente, e al fine di ottenere il riutilizzo del codice, il sottosistema utilizza una classe di base comune a pacchetto anche privata per tutte le classi di implementazione. Ma nessuna di queste classi è esposta pubblicamente, quindi il codice al di fuori del pacchetto non è a conoscenza del fatto che le implementazioni dell'interfaccia stanno estendendo qualche classe base comune.

Esempio:

public interface I {};
/* package-private */ abstract class A implements I {};
/* package-private */ class B extends A {};
/* package-private */ class C extends A {};

Naturalmente, il riutilizzo interno è il migliore, perché consente la massima flessibilità: il sottosistema si nasconde dal mondo esterno perché internamente utilizza l'ereditarietà, quindi il sottosistema può essere successivamente refactored per utilizzare la composizione anziché l'ereditarietà, e il mondo esterno non se ne accorgerà. (Il codice esterno non dovrà nemmeno essere ricompilato.) In sostanza, quando l'ereditarietà viene utilizzata per il riutilizzo del codice interno, la classe base comune non è altro che un helper.

    
risposta data 11.12.2015 - 14:14
fonte

Leggi altre domande sui tag