Interfacce capirne l'utilità e il suo vero uso

di il
5 risposte

Interfacce capirne l'utilità e il suo vero uso

Ciao,
ho da sempre un dubbio sulle interfacce e il suo uso nella realtà.
All'università ho imparato ad implementare interfacce, ma mi manca di capire il reale scopo.

Sono quindi andato sul sito della oracle e ho iniziato a leggere le lezioni ufficiali.

Prima pagina :
http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

e primo dubbio sull'utilizzo delle interfacce nella realtà :
Interfaces as APIs
The robotic car example shows an interface being used as an industry standard Application Programming Interface (API). APIs are also common in commercial software products. Typically, a company sells a software package that contains complex methods that another company wants to use in its own software product. An example would be a package of digital image processing methods that are sold to companies making end-user graphics programs. The image processing company writes its classes to implement an interface, which it makes public to its customers. The graphics company then invokes the image processing methods using the signatures and return types defined in the interface. While the image processing company's API is made public (to its customers), its implementation of the API is kept as a closely guarded secret—in fact, it may revise the implementation at a later date as long as it continues to implement the original interface that its customers have relied on.
Se l'azienda grafica(A) ha accesso solamente alla interfaccia creata dalla image processing(B), l'azienda grafica deve implementare tutti i metodi presenti nell'interfaccia giusto ?
Ma A non avrebbe potuto scriversi da sola le funzioni di cui aveva bisogno anche se non ci fosse stata l'interfaccia ? E A non ha comunque bisogno del codice del software di B per far funzionare il tutto ?
Non capisco come l'interfaccia che contiene solo dichiarazioni possa far si che A acceda alle funzionalità del codice prodotto da B senza essere a conoscenza del codice del software e non capisco i vantaggi delle interfacce .

Mi sono perso

Nel frattempo provo a leggere qualche esempio pratico, magari ho una illuminazione


5 Risposte

  • Re: Interfacce capirne l'utilità e il suo vero uso

    Sebbene anche io non sia particolarmente persuaso dall'utilità delle interfacce, provo a lanciarmi in un esempio che potrebbe risultare utile ad entrambi: a te per capire e a me per ricordarmi di usare le interfacce più spesso.

    Immagina in una grande azienda produttrice di software sia in sviluppo un lettore di file audio. Il gruppo che sviluppa l'interfaccia utente definirà l'interfaccia (scusa la ripetizione) per i vari gruppi che si occupano di sviluppare la parte di lettura del file e riproduzione. Ci sarà il gruppo per i file mp3, quello per i file ogg e quello per i file eav. Questi ultimi oggetti dovranno implementare l'interfaccia prevista che potrebbe definire metodi tipo play, pause, stop. Il primo gruppo di programmatori, quelli dell' interfaccia grafica, non ha idea di come i loro colleghi implementeranno i vari metodi, ma sanno che dovranno essere tutti implementati affinché possano "dialogare" con il loro oggetto.

    Che ne dici?
  • Re: Interfacce capirne l'utilità e il suo vero uso

    Grazie
    Ma se io implemento l'interfaccia play per la lettura del formato mp3, per far si che dialoghi con la parte fatta dal gruppo che si occupa della parte grafica dovrò comunque usare anche classi definite da questo gruppo o sbaglio ? Perchè se implemento solo l'interfaccia senza usare i giusti metodi non rimarrebbbe slegata ?
    A questo punto chi si occupa dell'implementazione della lettura dei vari formati dovrà conoscere il codice della parte grafica o sbaglio ?
  • Re: Interfacce capirne l'utilità e il suo vero uso

    La realizzazione di un software complesso richede la sua suddivisione in mattoncini logici indipendenti, la realizzazione di ogni mattoncino, e l'utilizzo di ogni mattoncino in modo coordinato.

    Ogni mattoncino non sa nulla dell'esistenza degli altri mattoncini.

    Chi utilizza i mattoncini per realizzare la sua applicazione, non e' interessaro a come sono fatti, ma solo a che cosa fanno.

    Ora, che cosa fa un mattoncino e' descritto dalla sua interfaccia, come lo fa dalla classe che implementa quell'interfaccia.

    Chi usa i mattoncini, guarda solo le interfacce.

    Quindi, @aerox1, il tuo ragionamento e' giusto, ma anche sbagliato: chi implementa l'interfaccia play non deve saper nulla, e non gli deve interessare, se ci sara' o meno un'interfaccia grafica: potrebbe anche non esserci del tutto!

    Invece, se vuole che l'oggetto che implementa quell'interfaccia, possa collocquiare con il mondo esterno, lo fa attraverso un'altro meccanismo: il meccanismo dei listener.

    Un listener e' una lista di oggetti, che implementano una specifica interfaccia (definita dal mattoncino che si sta implementando), i cui metodi vengono chiamati quando avvengono specifiche situazioni: inizio del brano, e' passato 1 secondo, e' stato eseguito l'1% del brano, .... fine del brano.

    Ora, chi vuole ricevere delle notifiche associate a tali eventi, deve implementare una classe, che implementa l'interfaccia associata al listener, istanzia un oggetto di quella classe e lo registra nel listener del mattoncino interessato.

    Ed ecco che il gioco e' fatto.

    Sembra un po' incasinato? Si e' vero, ma e' estremamente flessibile e potente. Ed una volta compreso, ci si accorge che non e' poi cosi' incasinato, anzi, e' molto elegante.


    Il concetto di interfaccia e' fondamentale nella realizzazione di applicazioni un minimo complesse, perche' aiuta a mantenere separate, e quindi mantenibili separatamente, le varie parti dell'applicazione.


    Ma quello descritto e' solo uno dei tanti casi in cui le interfacce sono fondamentali.


    Infine, ho scritto mattoncini e non classi, per forzare l'idea che non e' detto che a implementare il mattoncino ci sia una sola classe, ma potrebbero esserci piu' classi e altre interfacce
  • Re: Interfacce capirne l'utilità e il suo vero uso

    aeroxr1 ha scritto:


    Grazie
    Ma se io implemento l'interfaccia play per la lettura del formato mp3, per far si che dialoghi con la parte fatta dal gruppo che si occupa della parte grafica dovrò comunque usare anche classi definite da questo gruppo o sbaglio ? Perchè se implemento solo l'interfaccia senza usare i giusti metodi non rimarrebbbe slegata ?
    A questo punto chi si occupa dell'implementazione della lettura dei vari formati dovrà conoscere il codice della parte grafica o sbaglio ?

    Vedila dal punto di vista di chi sviluppa l'interfaccia grafica: loro non sanno come sono implementati i vari metodi nei diversi oggetti che leggono i file ma sapendo che tali oggetti implementano l'interfaccia da loro stabilita sanno per certo che in ognuno degli oggetti mp3, ogg, wav esiste il metodo play, il metodo stop e il metodo pause.

    Per rispondere alle tue domande: i gruppi che sviluppano gli oggetti mp3, ogg e wav non devono sapere nulla della parte grafica, devono solo implementare l'interfaccia, per esempio esisterà un metodo play() per tutti gli oggetti il cui compito sarà riprodurre il file, la parte grafica non sa nulla di come tale metodo è implementato, ma sa che esiste grazie alla direttiva "implements". La parte che sviluppa mp3 non sa nulla di come è fatta la parte grafica, sa solo che deve implementare i vari metodi previsti dall'interfaccia.
  • Re: Interfacce capirne l'utilità e il suo vero uso

    mentat ha scritto:


    aeroxr1 ha scritto:


    Grazie
    Ma se io implemento l'interfaccia play per la lettura del formato mp3, per far si che dialoghi con la parte fatta dal gruppo che si occupa della parte grafica dovrò comunque usare anche classi definite da questo gruppo o sbaglio ? Perchè se implemento solo l'interfaccia senza usare i giusti metodi non rimarrebbbe slegata ?
    A questo punto chi si occupa dell'implementazione della lettura dei vari formati dovrà conoscere il codice della parte grafica o sbaglio ?

    Vedila dal punto di vista di chi sviluppa l'interfaccia grafica: loro non sanno come sono implementati i vari metodi nei diversi oggetti che leggono i file ma sapendo che tali oggetti implementano l'interfaccia da loro stabilita sanno per certo che in ognuno degli oggetti mp3, ogg, wav esiste il metodo play, il metodo stop e il metodo pause.

    Per rispondere alle tue domande: i gruppi che sviluppano gli oggetti mp3, ogg e wav non devono sapere nulla della parte grafica, devono solo implementare l'interfaccia, per esempio esisterà un metodo play() per tutti gli oggetti il cui compito sarà riprodurre il file, la parte grafica non sa nulla di come tale metodo è implementato, ma sa che esiste grazie alla direttiva "implements". La parte che sviluppa mp3 non sa nulla di come è fatta la parte grafica, sa solo che deve implementare i vari metodi previsti dall'interfaccia.
    Ho capito forse il dubbio che mi fa fare casino

    Cioè se io ho fatto un motore di gioco e ne faccio una interfaccia che possa essere usata da altri sviluppatori che creano il gioco vero e proprio.
    L'interfaccia conterrò le dichiarazioni di vari metodi esempio :
    public interface MotionEngine {
    
    
       int turn(Direction direction,
                double radius,
                double startSpeed,
                double endSpeed);
    
      void move(int direction);
    }
    
    io che produco il motore di gioco se do questa interfaccia ai produttori di videogame questi se la possono sbattere in quel posto se non faccio si che questa interfaccia sia legata alle funzioni della mia applicazione o sbaglio ?

    Addirittura la software house potrebbe implementare MotionEngine e implementare "move(inte direction)" in questa maniera :
    void move(int direction)
    {
    system.out.println("ciao mondo!");
    }

    Quindi è qui che viene fuori il discorso dei Listener di @migliorabile ?

    migliorabile ha scritto:


    ...
    Invece, se vuole che l'oggetto che implementa quell'interfaccia, possa collocquiare con il mondo esterno, lo fa attraverso un'altro meccanismo: il meccanismo dei listener.

    Un listener e' una lista di oggetti, che implementano una specifica interfaccia (definita dal mattoncino che si sta implementando), i cui metodi vengono chiamati quando avvengono specifiche situazioni: inizio del brano, e' passato 1 secondo, e' stato eseguito l'1% del brano, .... fine del brano.

    Ora, chi vuole ricevere delle notifiche associate a tali eventi, deve implementare una classe, che implementa l'interfaccia associata al listener, istanzia un oggetto di quella classe e lo registra nel listener del mattoncino interessato.

    Ed ecco che il gioco e' fatto.
    ....
    Però non ho capito il procedimento
    Che ignorante che sono
Devi accedere o registrarti per scrivere nel forum
5 risposte