L'intelligenza funzionale e la navigazione del codice sono più vantaggiose rispetto all'impiego di contenitori di dipendenze per iniezione

3

Questa domanda si basa in realtà su PHP, ma potrebbe essere valida per altri linguaggi interpretati dinamicamente, e in particolare i metodi per generare intuizioni di codice e la ricerca di oggetti negli ambienti di sviluppo.

Usiamo PHPStorm e troviamo l'intellisense inestimabile, ma è fornito da alcune analisi statiche limitate e dall'analisi dei commenti del doc.

Ovviamente questo non si presta bene ad ottenere dipendenze attraverso un contenitore, in quanto l'IDE non ha idea del tipo restituito, quindi lo sviluppatore perde su una pletora di (nel caso del nostro framework comunque) una ricca documentazione fornita attraverso commenti del doc.

Quindi iniziamo a vedere cose del genere:

$widget = $dic->YieldInstance('WidgetA', $arg1, $arg2, $arg3, $arg4...));
/**
 * @var $widget WidgetA
 */

In questo modo l'analisi del codice funziona.

In effetti i commenti sono strettamente legati, ma peggio escono fuori sincrono quando il codice viene modificato ma non i commenti:

$widget = $dic->YieldInstance('WidgetB', $arg1, $arg2, $arg3, $arg4...));
/**
 * @var $widget WidgetA
 */

Ovviamente il commento potrebbe essere migliorato facendo riferimento a un'interfaccia Widget, ma allora potremmo anche usare una fabbrica ed evitare il requisito per i suggerimenti addizionali di tipizzazione nei commenti e la complessità dei dic / la placcatura della caldaia.

Quale è più importante per lo sviluppatore medio, l'intuizione del codice / intellisense o il 'nirvana' decouplement?

    
posta Gavin Howden 21.10.2012 - 02:11
fonte

2 risposte

3

Innanzitutto, il disaccoppiamento completo non è necessariamente una condizione ideale. Ci sarà sempre un accoppiamento tra classi, metodi e proprietà, altrimenti sarebbe impossibile comunicare qualsiasi informazione significativa. Portato al suo estremo logico, il disaccoppiamento completo si risolve nel passare un object puro (cioè un puntatore / riferimento) senza alcuna forma, che deve essere lanciato sul tipo corretto prima che possa avvenire qualsiasi trasferimento di informazioni significative, e l'unico modo può verificarsi è trasferendo informazioni sul tipo di cast a.

Lo stesso compromesso si verifica con le lingue tipizzate staticamente e tipizzate dinamicamente. Considera la parola chiave dynamic in C #. La parola chiave dynamic consente l'associazione tardiva delle chiamate al metodo, rinviando la risoluzione di tali chiamate dal momento della compilazione al runtime. Intellisense smette di funzionare. Perché? Perché non c'è modo di prevedere quali firme del metodo saranno disponibili sull'oggetto dynamic fino al runtime. Ma la mancanza di Intellisense non significa che la parola chiave dynamic sia inutile; significa solo che devi accettare l'assenza di Intellisense come compromesso per i benefici dell'uso di dynamic .

Nel mondo C #, il modo in cui risolvere questo problema consiste nell'iniettare un oggetto conforme a uno specifico interface . Ciò consente a una forma sufficiente di ricavare informazioni significative dall'oggetto, consentendo comunque a diverse implementazioni di quell'interfaccia di avere un comportamento sottostante diverso. Il interface continua a beneficiare di intellisense, mentre fornisce la flessibilità per cambiare il comportamento scambiando l'implementazione.

    
risposta data 21.10.2012 - 02:37
fonte
2

Questo è esattamente ciò che interfacce PHP sono per: presumibilmente ci sono alcune funzionalità (metodi) che sono condivisi sia da WidgetA sia da WidgetB , altrimenti non potresti sostituirli. Quindi quei metodi vanno in un'interfaccia e sono documentati lì, e puoi dichiarare la variabile $widget per avere quell'interfaccia come suo tipo.

Ovviamente questo significa che stai facendo lo stesso lavoro che faresti con un linguaggio tipizzato staticamente come Java, quindi dovresti usarne uno visto che hai già scoperto che ti mancano i benefici di tipizzazione statica ...

    
risposta data 21.10.2012 - 02:38
fonte

Leggi altre domande sui tag