Coding su un'interfaccia vs più interfacce generiche

0

Ho un certo numero di classi (e interfacce) che "codificano su un'interfaccia"

interface File 
{
    ...
}

interface FileConverter {
    public function convert(File $file); //coding to an interface
    public function success($message);
    public function failure($message);
}

Sento che posso rendere ancora più generica l'interfaccia FileConverter rimuovendo il File type type-hint in questa interfaccia per consentire la conversione tra stringhe, array ecc piuttosto che solo le classi che implementano File ;

interface Converter {
    public function convert($input);
    public function success($message);
    public function failure($message);
}

Tuttavia, se lo faccio, mi sembra di perdere l'aspetto di "codifica su interfaccia", anche se nessuna delle mie classi utilizza direttamente l'interfaccia FileConverter . È una scelta saggia o dovrei creare un'interfaccia diversa? ie;

interface StringConverter {
    public function convert(string $string); //PHP 7
    public function success($message);
    public function failure($message);
}
    
posta myol 05.10.2015 - 13:58
fonte

1 risposta

0

Tutti gli oggetti che implementano una particolare interfaccia non devono solo definire metodi con firme corrispondenti, ma anche con la semantica corrispondente.

Significato: dovresti essere in grado di sostituire l'oggetto A che implementa I con l'oggetto B che imolements I e ha ancora cose funzionanti.

Se nel tuo caso sia A sia B definiscono convert() , ma A funzionerà solo con una stringa e in caso contrario si bloccherà o restituirà qualcosa di strano, e B può funzionare solo con i file, thab non sono sostituibili e non < in realtà implementa la stessa interfaccia.

( Sembra proprio che lo facciano, perché un linguaggio tipizzato in modo dinamico come PHP non ti obbliga a definire i tipi nella firma del metodo. Ad esempio, i metodi Java equivalenti sarebbero Something convert(String s) e Something convert(File f) . Ora è chiaro che non sono la stessa interfaccia.

Non sto dicendo che dovresti sempre usare il suggerimento del tipo in PHP. Sto dicendo che implementare un'interfaccia significa abbinare una particolare semantica, e non solo una firma.

    
risposta data 05.10.2015 - 14:10
fonte

Leggi altre domande sui tag