Pull to refresh

Comments 5

В статье описан паттерн Java, на котлин никто так не делает, так как dsl выигрывает и в читабельности и в поддерживаемости, посмотрите как kotlin gradle dsl отлично подошел для написания скриптов.
Kotlin билдер выглядит так:

val onlyAudio = MediaRecorder {
    audioSource = AudioSource.MIC
    audioEncoder = AudioEncoder.AAC
    path = "PATH"
    outputFormat = OutputFormat.AAC
}

Но ведь с DSL мы вернемся к тому, что audioSource и videoSource будут лежать внутри MediaRecorder, тогда можно будет написать и так:

val onlyAudio = MediaRecorder {
    audioSource = AudioSource.MIC
  	videoSource = VideoSource.CAMERA 
    audioEncoder = AudioEncoder.AAC
    path = "PATH"
    outputFormat = OutputFormat.AAC
}

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

Используйте типы. Введите интерфейс Source (можно даже sealed), от него наследуйте и VideoSource, и AudioSource. MediaRecorder (и его билдер) типизируйте с <T : Source> ну и в нём одно поле val source: T.

лучше всего изолировать разные варианты на верхнем уровне, если нужно onlyAudio то создать AudioRecorder билдер который вернет MediaRecorder но с уже заданным VideoSource.NONE для MediaRecorder

Конкретно в Вашем примере можно сделать audio и video отдельными сущностями (возможно, с отдельными билдерами для каждой).

Будет MediaRecorder(VideoRecoder?, AudioRecorder?, outputFormat)

Можно вместо билдера сделать три вспомогательные функции, которые принимают либо только видео, либо только аудио, либо видео+аудио.

Но в целом подход с цепочкой вызовов интересный.

Sign up to leave a comment.

Articles