Слишком много параметров

#scala #design-patterns

#scala #шаблоны проектирования

Вопрос:

У меня есть приложение с единственной точкой входа, это библиотека для автоматизации некоторых материалов инженеров по обработке данных.

 case class DeltaContextConfig(
  primaryKey: List[String],
  columnToOrder: String,
  filesCountFirstBatch: Int,
  destinationPath: String,
  sparkDf: DataFrame,
  sparkContext: SparkSession,
  operationType: String,
  partitionColumn: Option[String] = None,
  tableName: String,
  databaseName: String,
  autoCompaction: Option[Boolean] = Option(true),
  idealFileSize: Option[Int] = Option(128),
  deduplicationColumn: Option[String] = None,
  compactionIntervalTime: Option[Int] = Option(180),
  updateCondition: Option[String] = None,
  setExpression: Option[String] = None
)
 

Это мой класс case, моя единственная точка входа.

После этого все эти параметры передаются другим объектам, у меня есть объекты для записи в Datalake, для компактных файлов и так далее. И эти объекты используют некоторые из этих параметров, например, у меня есть DeltaWriterConfig объект:

 DeltaWriterConfig(
  sparkDf = deltaContextConfig.sparkDf,
  columnToOrder = deltaContextConfig.columnToOrder,
  destinationPath = deltaContextConfig.destinationPath,
  primaryKey = deltaContextConfig.primaryKey,
  filesCountFirstBatch = deltaContextConfig.filesCountFirstBatch,
  sparkContext = deltaContextConfig.sparkContext,
  operationType = deltaContextConfig.operationType,
  partitionColumn = deltaContextConfig.partitionColumn,
  updateCondition = deltaContextConfig.updateCondition,
  setExpression = deltaContextConfig.setExpression
)
 

Я использую DeltaWriterConfig , чтобы передать эти параметры моему классу DeltaWriter . Я создавал все эти объекты конфигурации в ГЛАВНОМ, но я думаю, что это нехорошо, потому что у меня есть 3 объекта конфигурации для заполнения, поэтому у меня есть 3 больших конструктора в главном приложении.

Есть ли какой-либо шаблон для решения этой проблемы?

Комментарии:

1. Хорошо… не совсем. На самом деле, это даже не проблема. Это просто зависимости для ваших компонентов.

Ответ №1:

Я думаю, по крайней мере, было бы лучше заменить создание другой конфигурации с первой на сопутствующий объект DeltaWriterConfig :

 case class DeltaWriterConfig(
                              sparkDf: DataFrame,
                              columnToOrder: String,
                              destinationPath: String,
                              primaryKey: List[String],
                              filesCountFirstBatch: Int,
                              sparkContext: SparkSession,
                              operationType: String,
                              partitionColumn: Option[String] = None,
                              updateCondition: Option[String] = None,
                              setExpression: Option[String] = None
                            )
case object DeltaWriterConfig {
  def from(deltaContextConfig: DeltaContextConfig): DeltaWriterConfig =
    DeltaWriterConfig(
      sparkDf = deltaContextConfig.sparkDf,
      columnToOrder = deltaContextConfig.columnToOrder,
      destinationPath = deltaContextConfig.destinationPath,
      primaryKey = deltaContextConfig.primaryKey,
      filesCountFirstBatch = deltaContextConfig.filesCountFirstBatch,
      sparkContext = deltaContextConfig.sparkContext,
      operationType = deltaContextConfig.operationType,
      partitionColumn = deltaContextConfig.partitionColumn,
      updateCondition = deltaContextConfig.updateCondition,
      setExpression = deltaContextConfig.setExpression
    )
}
 

это дает нам возможность создавать новую конфигурацию всего в одной строке:

 val deltaContextConfig: DeltaContextConfig = ???
val deltaWriterConfig = DeltaWriterConfig.from(deltaContextConfig)
 

но лучшее решение — иметь только уникальные конфигурации. Например, если у нас есть дубликаты полей DeltaContextConfig и DeltaWriterConfig почему мы не могли просто составить конфигурацию и не дублировать эти поля:

 // instead of this DeltaContextConfig declaration
case class DeltaContextConfig(
                               tableName: String,
                               databaseName: String,
                               autoCompaction: Option[Boolean] = Option(true),
                               idealFileSize: Option[Int] = Option(128),
                               deduplicationColumn: Option[String] = None,
                               compactionIntervalTime: Option[Int] = Option(180),

                               sparkDf: DataFrame,
                               columnToOrder: String,
                               destinationPath: String,
                               primaryKey: List[String],
                               filesCountFirstBatch: Int,
                               sparkContext: SparkSession,
                               operationType: String,
                               partitionColumn: Option[String] = None,
                               updateCondition: Option[String] = None,
                               setExpression: Option[String] = None
                             )

case class DeltaWriterConfig(
                              sparkDf: DataFrame,
                              columnToOrder: String,
                              destinationPath: String,
                              primaryKey: List[String],
                              filesCountFirstBatch: Int,
                              sparkContext: SparkSession,
                              operationType: String,
                              partitionColumn: Option[String] = None,
                              updateCondition: Option[String] = None,
                              setExpression: Option[String] = None
                            )
 

мы используем такую структуру конфигурации:

 case class DeltaContextConfig(
                               tableName: String,
                               databaseName: String,
                               autoCompaction: Option[Boolean] = Option(true),
                               idealFileSize: Option[Int] = Option(128),
                               deduplicationColumn: Option[String] = None,
                               compactionIntervalTime: Option[Int] = Option(180),
                               deltaWriterConfig: DeltaWriterConfig
                             )

case class DeltaWriterConfig(
                              sparkDf: DataFrame,
                              columnToOrder: String,
                              destinationPath: String,
                              primaryKey: List[String],
                              filesCountFirstBatch: Int,
                              sparkContext: SparkSession,
                              operationType: String,
                              partitionColumn: Option[String] = None,
                              updateCondition: Option[String] = None,
                              setExpression: Option[String] = None
                            )
 

но помните, что вы должны использовать ту же структуру конфигурации в своем файле конфигурации.