Dubbio in merito alle interfacce

di il
6 risposte

Dubbio in merito alle interfacce

Salve ragazzi vorrei chiarirmi dei dubbi che mi porto avanti da molto tempo in merito alle interfacce.
So che le interfacce possono contenere solo metodi astratti,
Ma non ho mai capito il perchè e come si utilizzino.
Da quel che ho capito io sono classi con metodi senza oggetti, cioè metodi vuoti?

Concretizzo il mio problema, data questa consegna:
1) Scrivere una classe CifrarioDiCesare le cui istanze sono cifrari di Cesare (tale classe deve implementare l’interfaccia Cifrario, vedi:
public interface Cifrario<E> {
•  public void setChiave(E key) throws Exception;
•  public String enc(String cleartext);
•  public String dec(String ciphertext)
)

2) Scrivere una classe che utilizza CifrarioDiCesare che cifra una stringa letta dallo standard input con un chiave specificata anch’essa dallo standard input



per quanto riguarda la seconda consegna è stata fatta senza problemi e funziona, eccola qui:

Il main
import java.util.Scanner;

public class Main {


public static void main(String[]args)
{
Scanner input =new Scanner(System.in);

System.out.println("inserisci la parola da cifrare");
String parola=input.nextLine();
    System.out.println("inserisci la chiave da utilizzare");
    int chiave=input.nextInt();
    cifrarioDiCesare cifra =new cifrarioDiCesare(parola,chiave);

    cifra.cifratore();

}
}
La classe

public class cifrarioDiCesare {
    String parola=null;
    int chiave;

    public cifrarioDiCesare(String parola, int chiave)
    {
        this.parola=parola;
        this.chiave=chiave;

    }
    public String cifratore()
    {
        String parolaIniziale=this.parola;
        parolaIniziale.toLowerCase();
        char temp;

        String ChiaveCifrata=parolaIniziale;

        for(int i=0; i<this.parola.length();i++)
        {
            temp=parolaIniziale.charAt(i);
            if(temp+chiave>'z')
            {
                int temp2='z'-temp;
                int temp3= chiave-temp2;
                int risultato='a'+temp3-1;
                temp=(char)risultato;
                ChiaveCifrata= ChiaveCifrata.substring(0,i)+temp+parola.substring(i+1);
            }
            else {
                temp += chiave;
                ChiaveCifrata = ChiaveCifrata.substring(0, i) + temp + parola.substring(i + 1);
            }


        }

        System.out.println(ChiaveCifrata);
        return ChiaveCifrata;
    }



}

ma per quanto riguarda la prima non capisco cosa dovrei fare.
Probabilmente perchè non ho ben capito la teoria dietro alle interfacce. Spero possiate aiutarmi grazie..

6 Risposte

  • Re: Dubbio in merito alle interfacce

    Anonimamente22 ha scritto:


    So che le interfacce possono contenere solo metodi astratti,
    Ma non ho mai capito il perchè e come si utilizzino.
    [...]
    Laddove nella tua logica hai bisogno di invocare il metodo di un oggetto esterno che svolge un determinato compito (es. cifrare un dato), usare una interfaccia ti consente di disaccopiare la "logica client" (quella che usufruisce della funzione dell'oggetto esterno) dalla logica implementativa (es. quella che esegue una cifratura secondo un algoritmo preciso).

    Supponi di voler cambiare a un certo punto l'algoritmo di cifratura sostituendo quello in uso con un altro: se hai usato una interfaccia, avrai inserito in essa la dichiarazione di un metodo (non implementato) che rappresenta una sorta di contratto: qualsiasi classe che implementa tale interfaccia deve definire il metodo e aggiungere il corpo, supponendo che si usino classi diverse per diversi algoritmi di cifratura.

    L'oggetto client che deve invocare il metodo di cifratura può usare l'interfaccia come tipo di dato da passare come parametro, nel metodo invocato o nel costruttore dell'oggetto, affinché abbia un riferimento all'oggetto da coinvolgere per eseguire la cifratura vera e propria.

    L'interfaccia ti garantisce che tu possa in ogni momento sostituire l'implementazione dell'algoritmo usata, passando da una classe a un'altra a piacimento, a prescindere dalla gerarchia di appartenenza di queste (superclassi ecc.) purché queste implementino l'interfaccia che hai definito come "contratto" e come tipo di dato da utilizzare per fare riferimento all'oggetto che implementa la cifratura vera e propria usando uno specifico algoritmo.

    Se non esistero le interfacce, all'interno di un oggetto che deve richiamare il metodo di un altro potresti fare riferimento solo a classi, e in questo modo le avresti "accoppiate" in modo indissolubile, mentre l'interfaccia ti consente di avere una astrazione intermedia che puoi usare per tenere separate le due classi ovvero fare in modo che la prima non dipenda direttamente dalla seconda.

    Se vuoi ulteriori esempi, magari più calzanti, approfondisci il discorso sui principi SOLID.

    Ciao!
  • Re: Dubbio in merito alle interfacce

    Alka ha scritto:


    Anonimamente22 ha scritto:


    So che le interfacce possono contenere solo metodi astratti,
    Ma non ho mai capito il perchè e come si utilizzino.
    [...]
    Laddove nella tua logica hai bisogno di invocare il metodo di un oggetto esterno che svolge un determinato compito (es. cifrare un dato), usare una interfaccia ti consente di disaccopiare la "logica client" (quella che usufruisce della funzione dell'oggetto esterno) dalla logica implementativa (es. quella che esegue una cifratura secondo un algoritmo preciso).

    Supponi di voler cambiare a un certo punto l'algoritmo di cifratura sostituendo quello in uso con un altro: se hai usato una interfaccia, avrai inserito in essa la dichiarazione di un metodo (non implementato) che rappresenta una sorta di contratto: qualsiasi classe che implementa tale interfaccia deve definire il metodo e aggiungere il corpo, supponendo che si usino classi diverse per diversi algoritmi di cifratura.

    L'oggetto client che deve invocare il metodo di cifratura può usare l'interfaccia come tipo di dato da passare come parametro, nel metodo invocato o nel costruttore dell'oggetto, affinché abbia un riferimento all'oggetto da coinvolgere per eseguire la cifratura vera e propria.

    L'interfaccia ti garantisce che tu possa in ogni momento sostituire l'implementazione dell'algoritmo usata, passando da una classe a un'altra a piacimento, a prescindere dalla gerarchia di appartenenza di queste (superclassi ecc.) purché queste implementino l'interfaccia che hai definito come "contratto" e come tipo di dato da utilizzare per fare riferimento all'oggetto che implementa la cifratura vera e propria usando uno specifico algoritmo.

    Se non esistero le interfacce, all'interno di un oggetto che deve richiamare il metodo di un altro potresti fare riferimento solo a classi, e in questo modo le avresti "accoppiate" in modo indissolubile, mentre l'interfaccia ti consente di avere una astrazione intermedia che puoi usare per tenere separate le due classi ovvero fare in modo che la prima non dipenda direttamente dalla seconda.

    Se vuoi ulteriori esempi, magari più calzanti, approfondisci il discorso sui principi SOLID.

    Ciao!
    Inanzitutto ti ringrazio per la risposta sei stato gentilissimo
    Se ho capito bene l'interfaccia ha al suo interno metodi senza body, e poi tutte le varie classi che la implementano sono obbligate a riscrivere il metodo ovviamente con body. Questo consentirebbe di definire varianti dello stesso metodo.

    La cosa che mi sfugge è il vantaggio.
    Cioè, se devo rifare un determinato metodo, a che pro estendere un interfaccia dovendo comunque riscriverlo?
  • Re: Dubbio in merito alle interfacce

    Semplice: tu immagina l'interfaccia come le specifiche dell'imbocco del serbatoio di benzina che ogni automobile (a benzina) DEVE possedere.

    Le varie case automobilistiche DEVONO realizzare l'imbocco in quel modo, altrimenti quando vai a fare il pieno, la pompa di benzina non entra.!

    MA

    ogni casa automobilisticha puo' realizzare il serbatoio come cavolo gli pare.

    Ora, vedila dal punto di vista informatico: l'accesso ad un database relazionale. Diciamo MySQL, PostgreSQL, Oracle, DB2, SQL Server.

    Ogni DBMS e' implemenatto in modo diverso e la connessione TCP/IP usata per inviare i dati e ricevere i risultati, e' DIVERSA.


    MA, quando scrivi il codice Java, to usi le specifiche JDBC che sono basate SOLO da interfacce. C'e' UN'UNICO punto in cui DEVI creare una classe, ed e' i DRIVER SPECIFICO per quel DBMS.

    In questo modo, per poter cambiare un DBMS con un'altro devi SOLO cambiare il DRIVER, e questo avviene in UN UNICO punto nel codice (SE uno sa programmare ). Tutto il resto rimane perfettamente uguale.

    Sai che disastro se per cambiare il DBMS devi riscrivere l'INTERO programma.

    Dall'altro lato, OGNI produttore di DBMS si fa le librerie in casa, mica condivide il codice con gli altri. Quindi NON PUOI avere la stessa classe usata da divrsi DSM. OGNI DBMS deve avere la SUA implementazione
  • Re: Dubbio in merito alle interfacce

    Aggiungo che sia in java che in C# le classi non supportano l'ereditarietà multipla ma a questo si può parzialmente ovviare ereditando da più interfacce :
    https://www.hinto.com/it/blog/tecnologie-confronto-polimorfismo-ed-ereditarieta-multipla
    https://docs.microsoft.com/it-it/dotnet/csharp/programming-guide/interfaces/
    https://www.mrw.it/net/ereditarieta-interfacce-c-sharp_12671.html
  • Re: Dubbio in merito alle interfacce

    Anonimamente22 ha scritto:


    La cosa che mi sfugge è il vantaggio.
    Cioè, se devo rifare un determinato metodo, a che pro estendere un interfaccia dovendo comunque riscriverlo?
    Non mi è molto chiara la domanda. Qualsiasi metodo che si voglia invocare deve necessariamente essere implementato, ma questo non comporta alcuna relazione su quelli che sono i vantaggi dell'interfaccia.

    Il vantaggio dell'interfaccia sta nel poterla usare come tipo di dato per tutti quei campi e/o parametri dove è richiesto un oggetto che svolga una determinata funzione. L'interfaccia esprime le funzioni che si vogliono sfruttare.

    La classe rappresenta la sua implementazione nel dettaglio. Utilizzare la classe come tipo di dato significa legarsi mani e piedi a una specifica implementazione, e ciò è sbagliato.

    Metaforicamente parlando, usare la classe - quindi senza una interfaccia - è come se il progettista di un impianto elettrico avesse collegato la lampada direttamente al cablaggio dell'impianto, fondendo le due cose assieme e intrecciando i fili: se vuoi intervenire sull'uno o sull'altra, devi necessariamente operare sul collegamento e modificare entrambi gli oggetti.

    La presenza dell'interfaccia, sempre metaforicamente, si realizza con la presenza della spina: la lampada e l'impianto elettrico condividono uno standard, l'interfaccia, e finché entrambi lo rispettano, i due elementi possono essere collegati, ma ciò consente di intervenire sull'impianto senza dover modificare la lampada e/o rimuovere la lampada e collegare un televisore all'impianto, senza dover cambiare quest'ultimo.

    Il vantaggio dell'interfaccia non è per una scorciatoia che offre, bensì nel design e nella flessibilità che consente di ottenere, potenzialmente permettendo a un oggetto di godere di una implementazione esterna che potrebbe essere stravolta, simulata o completamente sostituita, senza dover apportare modifiche al codice che fa uso di questa implementazione.

    In realtà, grazie alla furbizia della maggior parte degli IDE come IntelliJ o NetBeans, l'interfaccia ha anche il vantaggio di fornire una guida alla scrittura della classe: quando dichiari di implementare una interfaccia nello scheletro di una classe vuota, l'IDE ti consente di generare automaticamente il corpo dei metodi dell'interfaccia con la loro firma precisa andando a inserire il corpo dell'implementazione (se la classe non è astratta). Allo stesso modo, il compilatore verifica che tutti i metodi siano implementati, altrimenti non è possibile fare il build.

    Ciao!
  • Re: Dubbio in merito alle interfacce

    Immagina di dover sostituire una pompa in un circuito idaulico;

    la nuova pompa deve avere gli stessi attacchi e la stessa distanza tra di loro ma non deve essere necessariamente identica alla precedente.

    L'interfaccia dichiara come devono essere gli attacchi e la distanza tra di loro
    ... e questo basta per andare al negozio per comprarne un'altra più bella, più potente o che consuma meno
    e che sei sicuro di poter montare al posto all'altra
    *senza sapere come è fatta dentro e senza fare modifiche all'impianto in cui deve essere inserita*

    HTH
Devi accedere o registrarti per scrivere nel forum
6 risposte