Как я могу управлять распространяющимися, глубоко вложенными параметрами типа? - PullRequest
1 голос
/ 22 мая 2019

Я хочу знать, как управлять большим количеством глубоко вложенных параметров типа. Код это Скала. Ответы приветствуются на любом языке.

Рассмотрим некоторые объекты конфигурации

trait Source
case class File(path: String) extends Source
case class URL(url: String) extends Source

trait Format
case class CSV(delimiter: String) extends Format
case class JSON extends Format

case class Data(format: Format, source: Source)

но как я ограничен в информации о моем типе, например Я не могу

def find_delimiter(config: Data) = config.format.delimiter

Итак, я параметризирую

case class Data[F <: Format, S <: Source](format: F, source: S)

и теперь я могу указать, что я работаю с CSV

def find_delimiter[S <: Source](config: Data[CSV, S]) = config.format.delimiter

Все хорошо. Но если мои объекты конфигурации имеют глубину не один, а четыре, а мои объекты конфигурации имеют гораздо более длинные имена, мы можем получить что-то вроде

def fn(config: DataSourceConfig[
  CSVConfig[ColumnDataTypeConfig[DeeplyNestedConfig[SuperDeeplyNestedConfig], OtherDeeplyNestedConfig]],
  URLConfig[FetchRetryConfig[HTTPDeeplyNestedConfig]]
]) = ???  // use deeply nested attributes here

что беспорядок, чтобы читать, и я пошел на свет на параметры. Как я могу справиться с этим?

На самом деле, псевдонимы типа непрактичны, так как они будут размножаться.

...