Mantener la API frente al uso de expresiones idiomáticas en un puerto

12

Estoy trabajando en un puerto de Python a Rust y me he topado con un código que no se puede expresar tan naturalmente en Rust como en Python.

Un caso de esto es usar parámetros predeterminados:

class Foo:
  def __init__(self, a="Hello"):
    self._a = a

En Rust, puedes implementar esto usando un constructor:

struct FooBuilder {
  a: &'static str,
}

struct Foo {
  _a: &'static str
}

impl FooBuilder {
  fn new() -> FooBuilder {
    FooBuilder {
      a: "Hello",
    }
  }

  fn change_a(self, new_a: &'static str) -> FooBuilder {
    FooBuilder {
      a: new_a,
      ..self
    }
  }

  fn build(self) -> Foo {
    Foo {
      _a: self.a,
    }
  }
}

Para usar la clase en Python, es simplemente:

foo = Foo("Hello, World!")

Sin embargo, en Rust, deberías escribir algo como:

let foo = FooBuilder::new().change_a("Hello, World!").build();

Esto lleva a la pregunta: ¿es mejor mantener una API para un puerto, o es mejor usar modismos del lenguaje de puertos? ¿Depende de qué tan conocida sea la API para comenzar?

    
pregunta erip 18.12.2015 - 17:28

1 respuesta

18

Desea que sus ideas se expresen claramente en el idioma que las alberga. Eso significa usar expresiones idiomáticas del lenguaje anfitrión.

Tome la popular biblioteca de subrayado: js y lua . El puerto lua es funcionalmente equivalente en su mayor parte . Pero cuando es apropiado, las implementaciones son ligeramente diferentes. Por ejemplo:

_.toArray()

se convierte en

_.to_array()

Este cambio hace que el nombre de la función se sienta más nativo para los programadores de Lua.

Del mismo modo, _.each () requiere un objeto, una matriz o algo parecido a una matriz en JavaScript, pero _. each () en Lua también puede tomar un iterador, un mecanismo que no estaba disponible en JavaScript cuando el subrayado original la biblioteca fue creada.

El autor de Lua tradujo sensiblemente lo que el autor original hubiera querido si lo hubiera escrito en Lua. Esa es la clave. Pregúntese acerca de la intención original y luego implemente esa intención en el idioma que elija, modismos y todo. Dependiendo del idioma de origen y de destino, esto puede significar agregar, editar o eliminar funciones.

Recuerda que los usuarios en varios idiomas serán raros. La mayoría de los usuarios utilizarán un idioma u otro. Para ellos, las diferencias no importan. Si alguien usa ambos, probablemente sean lo suficientemente sofisticados para apreciar su traducción. No es diferente a traducir idiomas hablados. Algunas ideas no son directamente traducibles. Los mejores traductores se adhieren a la intención del original, no a una traducción literal condenada palabra por palabra.

    
respondido por el Scant Roger 18.12.2015 - 20:43

Lea otras preguntas en las etiquetas