Extends per feature (aka mix-in) in Scala è una cattiva pratica, non è vero?

0

In Scala, a volte la classe estende un tratto per fornire alcuni metodi per estendere la classe all'interno .

ScalaTest

import org.scalatest._

class ExampleSpec extends FlatSpec with Matchers { ...

Matchers trait fornisce un metodo utile come startWith , endWith o include .

string should startWith ("Hello")
string should endWith ("world")
string should include ("seven")

Il problema è semplice, " ExampleSpec non è Matchers ". Estende per interruzioni di funzionalità Principio fondamentale OOP. Questo extends è fonte di confusione soprattutto per il lettore di codice o il nuovo arrivato.

Penso che dovremmo usare import come import scalatest.matchers._ . Questo non altera l'albero ereditario.

Si estende per le cattive pratiche delle funzionalità in Scala? o ragionevole estende l'utilizzo?

    
posta bigwheel 16.12.2018 - 04:01
fonte

1 risposta

0

Come DSL (linguaggio specifico del dominio), ScalaTest utilizza molti nomi che potrebbero apparire in altri operatori di codice e overload che potrebbero essere utilizzati da altre librerie.

Per controllare l'ambito, consentono ai loro utenti di mescolare la DSL alle loro classi di test. Sebbene sia possibile utilizzare la DSL con solo import , questa strategia semplifica il missaggio di librerie e altri DSL nello stesso file.

Sì, non ha molto senso attraverso l'obiettivo di una relazione "è-a" o anche di un "ha-a", ma le suite di test non sono generalmente candidate per il riutilizzo e le considerazioni sull'ambito scientifico stanno ignorando le considerazioni di ingegneria.

Inoltre, with non è extends . La classe di test ExampleSpec è un FlatSpec , e questa relazione di ereditarietà ha senso. L'albero di ereditarietà dei tratti è più flessibile e consente questo tipo di uso (ab).

    
risposta data 26.12.2018 - 20:21
fonte

Leggi altre domande sui tag