2010-08-26 7 views
6

La mia domanda è: in PHP le interfacce sono davvero utili per gli sviluppatori che creano applicazioni per siti Web da sole? Non è una classe astratta che fornisce tutte le cose che fornisce un'interfaccia?Un'interfaccia php è ridondante per le app create da un singolo sviluppatore?

Se un'interfaccia è solo un "contratto", lo sviluppatore non è consapevole delle cose che la classe dovrebbe implementare?

L'unico singolo vantaggio che posso pensare è che una classe può implementare più interfacce, ma ancora una volta quanto sia utile questo .. quando si sa tutto ciò che una classe dovrebbe implementare. Ti imponi solo di implementare questi metodi.

Come potete immaginare, sto ancora aspettando quel momento A-HA in cui capisco davvero perché un'interfaccia è utile.

Per concludere e semplificare: quando è necessario utilizzare le interfacce e perché non utilizzare invece classi astratte?

risposta

2

Solo perché "sai" che cosa dovrebbe implementare qualcosa, non significa che lo ricordi. Ciò non significa che non farai mai un errore e digiti un nome di funzione. I "contratti" nella programmazione non sono solo per uno sviluppatore che impone le cose a un altro, ma ti permettono anche di fornire una rigidità al codice che può cogliere errori che altrimenti potrebbero scivolare sotto il radar.

+0

Potete fornire un esempio? – danidacar

-1

Quando è necessario utilizzare le interfacce e perché non utilizzare invece classi astratte?

Non appena si utilizza, ad esempio, il modello di fabbrica, è necessario utilizzare un'interfaccia. Sono sicuro che ci sono altri esempi per questo.

Dai un'occhiata ai vari modelli di design. http://www.ibm.com/developerworks/library/os-php-designptrns/

MODIFICA: collegamento modificato a una spiegazione migliore.

+0

Non penso che l'articolo che menzioni sia molto buono =) –

+1

TBH non l'ho letto, uso il PHP Design Pattern Book di Stephan Schmidt. – Rufinus

+0

PHP e design pattern sono la ragione per cui ho iniziato questa domanda. La maggior parte dei tutorial per modelli di progettazione relativi al php non sono realmente sul punto. – danidacar

1

È possibile utilizzare le interfacce per

  • Type-hinting funzioni public function foo(IWhatever $x)
  • Per controllare per il tipo $x instanceof IWhatever
  • Per creare oggetti mock in unità di test $this->getMock('IWhatever')

Naturalmente, potrebbe usare anche le classi astratte, ma se non è effettivamente necessario definire alcun codice è probabilmente un'idea migliore usare un'interfaccia.

0

L'interfaccia è una pratica molto buona nello sviluppo dei comandi. Crea un'integrità del prodotto del programma. Il primo team scrive un'interfaccia, dopo lezioni astratte (con metodi comuni e metodi astratti).

Classe astratta utile dove la estendiamo in diverse classi. Ad esempio, metodo __construct() comune per tutte le classi figlie, ma altri metodi sono diversi.

Il nostro team utilizza questo modello: Interface-> astratto-> Class1-> Class2

Class1 extends Abstract implements Interface 

Class2 extends Abstract implements Interface 
+0

La domanda si riferisce a un singolo sviluppatore. Per una squadra posso capire il tuo approccio. – danidacar

1

"Programmazione a un'interfaccia e non un'implementazione" è un principio introdotto dal GoF nei loro libri Design Patterns: Elements of Reusable Object-Oriented Software.

Citando Erich Gamma sul principe:

Una volta si dipende da interfacce solo, si sta disaccoppiato dalla realizzazione. Ciò significa che l'attuazione può variare, e questa è una relazione di dipendenza sana. Ad esempio, per scopi di test è possibile sostituire un'implementazione del database pesante con un accendino-peso implementazione mock. [...]

Quindi questo metodo ti dà la flessibilità, ma separa anche la parte veramente prezioso, il design, con l'applicazione, che consente ai clienti di essere disaccoppiati dalla realizzazione. Una domanda è se devi sempre usare un'interfaccia Java per questo. Anche una classe astratta è buona. In realtà, una classe astratta offre una maggiore flessibilità quando si tratta di evoluzione. È possibile aggiungere nuovi comportamenti senza rompere i client. [...]

In Java quando si aggiunge un nuovo metodo a un'interfaccia, si interrompe tutti i tuoi clienti. Quando hai una classe astratta, puoi aggiungere un nuovo metodo e fornire un'implementazione predefinita al suo interno. Tutti i clienti continueranno a lavorare. Come sempre c'è un trade-off, un'interfaccia ti dà la libertà per quanto riguarda la classe base, una classe astratta ti dà la libertà di aggiungere nuovi metodi in seguito. Non è sempre possibile definire un'interfaccia in una classe astratta, ma alla luce dell'evoluzione dovresti considerare se una classe astratta è sufficiente.

Read the full interview here

così, è possibile utilizzare un'interfaccia o una classe astratta. Devi solo considerare il trade-off. IMO, vale la pena usare le interfacce, anche se sei da solo. Raramente sai come sarà la tua app alla fine. The waterfall is a myth, quindi dovrai affrontare il cambiamento durante lo sviluppo e le interfacce renderanno più semplice accettarlo.

Potreste anche essere interessati a:

e un po ' di più:

+0

Programmare un'interfaccia e non un'implementazione in PHP non è molto semplice dato che il PHP è debolmente digitato – danidacar

+0

Ho letto Gof e un po 'di altro libro. Puoi essere più sul punto? – danidacar

+0

@daniphp [l'argomento viene visualizzato di tanto in tanto] (http://stackoverflow.com/questions/2758254/what-is-the-point-of-interfaces-in-a-weakly-typed-language-like- php). PHP è appena * debolmente * digitato. Non è non tipizzato. – Gordon

0

Qualche tempo dal momento che questo è stato chiesto, ma come la funzionalità delle interfacce sembra di decifrare molte persone - se venite qui cercando, provare l'esempio qui con 500 voti. L'ho trovato davvero utile.

What does it mean to "program to an interface"?

Problemi correlati