Mé třídy jsou znovupoužitelné právě proto, že dodržuji SRP.
Právě, že ten váš kód znovupoužitelný není a není ani modulární - nemohu vzít část funkcionality a jednoduše ji použít nebo nahradit, mohu s tím pracovat pouze jako s celkem.
Neodpověděl jsi na otázku, kterou třídu bych měl při změně způsobu validace přepisovat. Všechny, které dělají validaci? Je lepší opravit jednu třídu, než hledat v celé aplikaci, kde všude je použita.
Ve Scale bych to řešil zhruba takhle:
// Pouze drží data (validní i nevalidní).
case class AutoZnacka(typ: String, znacka: String)
// Obsahuje standardní kód pro ukládání do databáze i pro validaci.
// Na jeho vygenerování si lze napsat makro.
object AutoZnacka {
implicit val u = Updatable.fromFunction[AutoZnacka] { (x, db) =>
/* TODO */
}
implicit val v = Validation.fromFunction[AutoZnacka] { x =>
/* TODO */
}
}
Všimněte si, že validace i ukládání do repository je zvlášť a uživatel to může snadno předefinovat nebo použít v jiném kódu. Abych odpověděl na otázku, tak při změně způsobu validace stačí napsat
implicit val autoZnackaValidation = /* TODO */
Například potřebujete-li v administrační sekci jinou validaci, uděláte trait
trait AdminValidation {
implicit val autoZnackaValidation = /* TODO */
}
a ten pak namixujete, kde je to třeba
class SomeController extends Controller with AdminValidation {
/* TODO */
}