Estoy planeando integrar una herramienta externa ( ffmpeg en mi caso particular, pero podría ser cualquier cosa, de hecho, tan larga como sus tareas son de larga duración). Esta herramienta tiene muchos parámetros de línea de comandos.
Por ahora, he hecho cosas simples con eso, ya que me requiere un buen montón de escritura en clase, para incrustar toda la información que me puede devolver.
Ahora me enfrento a la tarea aún más compleja de tener que enviarle un montón de parámetros y manejar posibles errores.
Entonces, ¿cuál es la mejor manera de hacerlo?
- Crear clases que contengan todas las opciones posibles.
- Confiar en un equivalente inverso de commons-cli / CliBuilder / OptionParser
- Escribe directamente todas las opciones desde la entrada del usuario
- Los poderes de Obiwan Kenobi (o cualquier cosa que ni siquiera sepa)
Tenga en cuenta que lo hago en un lenguaje poco común (por mi bien, no me pregunte qué es, ya que parece una unión desesperada y estéril entre CoffeeScript y lua ), como consecuencia, no puede haber un marco de trabajo. lo que quiero en el idioma que uso.
Respuestas:
Supongo que la respuesta ortodoxa sería descubrir qué modelo de dominio incorpora la herramienta, luego escribir algunos objetos que expresen ese modelo en su idioma y sepan cómo construir líneas de comando. No conozco bien ffmpeg, pero creo que el modelo es el sonido que fluye de un archivo fuente a un archivo de salida, cada uno en un formato particular, a través de una serie de filtros. Entonces, tal vez tenga una clase FfmpegJob que tiene dos objetos SoundFile, uno para entrada y otro para salida, y una lista (que podría estar vacía) de objetos SoundFilter. Cada objeto subordinado tiene un método para convertirse en una secuencia de argumentos para ffmpeg (por ejemplo, un HighpassFilter se convertiría en {"--highpass", "200"} o lo que sea). La clase de trabajo puede construir fácilmente una línea de comando a partir de sus subordinados. Necesitas escribir una clase por opción, pero puede levantar el código común a una superclase; cada subclase debería ser bastante simple.
Esto implica más repetitivo que un enfoque de inversión inversa, pero le compra seguridad de tipo. Además, le brinda un lugar desde donde puede comenzar a colgar más funcionalidades: puede colocar validación o cálculo en los objetos de filtro, o componer varias opciones en un solo filtro más sofisticado.
fuente