Tratti e implementazione vs solo implementazione

2

Nel mio precedente lavoro Java, abbiamo cercato di evitare la definizione di interfacce per tutto, a meno che non avessimo realmente implementazioni multiple per questo. Questa potrebbe essere solo la mia opinione, ma se c'è solo un'implementazione, non vedo il valore in un'interfaccia - non stiamo realmente scrivendo codice generico, che potrebbe essere usato come una libreria.

Tuttavia, nel mio nuovo lavoro di Scala tendiamo ad usare i caratteri ovunque - molte cose come, DAO o "Servizio", avranno un tratto che definisce ciò che fanno nella parte superiore del file e quindi l'unica implementazione al di sotto esso.

per es.

trait WidgetDAO {
    getAllWidgets(): Seq[Widget]
}
class RealWidgetDAO extends WidgetDAO {
    getAllWidgets(): Seq[Widget] {
        // ...

Sono nuovo di Scala, quindi c'è qualche motivo specifico di Scala per cui questo stile è comune nella nostra base di codici? O è la più generica regola del codice "Code to interfaces" che sta guidando questo, un po 'inutilmente?

    
posta lgj 14.03.2018 - 13:07
fonte

2 risposte

2

Non c'è una ragione particolare per cui i tratti di Scala debbano essere trattati in modo diverso rispetto alle interfacce Java, specialmente se il tratto è simile all'interfaccia e richiede solo determinati metodi.

Una differenza importante è che i tratti possono anche fornire implementazioni di metodo (sebbene i metodi predefiniti di Java 8 possano anche farlo). Questo porta ad uno stile di programmazione un po 'diverso, in cui rende possibile implementare alcuni metodi in un tratto separato per chiarezza.

Questo uso dei tratti è meno simile a un'interfaccia e più simile a una classe parziale. Quando si utilizzano i tratti come unità di composizione del codice, è possibile ragionare e testare ciascun tratto con il proprio insieme di metodi coerenti. Questo tende ad essere migliore (più chiaro, più gestibile, più testabile) rispetto al mettere molti metodi debolmente correlati in una singola classe di grandi dimensioni.

Il motivo principale per utilizzare le interfacce (e i tratti dell'interfaccia) è che si desidera eseguire il polimorfismo. Nel tuo particolare esempio, un DAO, questo sembra molto desiderabile, in modo che tu possa usare finte implementazioni DAO per i test. Se non hai bisogno di polimorfismi e queste interfacce non forniscono alcuna funzionalità utile (come solo un singolo metodo che non può essere usato da solo), allora potrebbe trattarsi di un uso eccessivo delle interfacce.

    
risposta data 14.03.2018 - 13:19
fonte
0

Or is it the more generic "Code to interfaces" rule of thumb that's driving this, somewhat unnecessarily?

Sì, questa è solo una regola del "codice alle interfacce".

is there any Scala-specific reason why this style is common in our codebase?

No, è interamente ortogonale all'uso di Scala; se dovessi indovinare, sarei abbastanza sicuro che tale separazione sia più popolare in Java.

    
risposta data 15.03.2018 - 08:26
fonte

Leggi altre domande sui tag