Invariantes antes que algoritmos¶
Un invariante útil dice qué se mantiene durante el algoritmo y qué puede asumir el llamador al terminar. Escríbelo antes del bucle.
Intervalos de subárbol en preorden¶
Supongamos una emisión en preorden: cada nodo precede a sus hijos y cada subárbol es contiguo. Sea \(e_i\) el primer índice posterior al nodo \(i\) y todos sus descendientes.
Afirmación. El recorrido puede saltar el subárbol avanzando hasta \(e_i\).
Demostración. La contigüidad sitúa todos los descendientes antes de \(e_i\). La definición de extremo excluido sitúa los nodos posteriores en \(e_i\) o después. Avanzar allí salta exactamente el subárbol. El validador comprueba estas premisas antes de que el renderizador las use.
Un recorrido completo visita cada nodo una vez: cuesta \(O(N)\). Saltar un subárbol requiere actualizar un índice. Procesar su contenido sigue teniendo su coste. Un salto constante no implica renderización constante.
Medir antes de emitir¶
El renderizador mide primero el número de bytes \(m\). Sea \(c\) la capacidad de salida del llamador.
Los recorridos de medición y emisión usan las mismas reglas. Una emisión correcta escribe exactamente \(m\) bytes. Un fallo no devuelve un artefacto parcial válido. El anfitrión controla la publicación; los bytes incompletos no pueden sustituir la salida anterior.
Validez de la caché¶
La clave de caché debe cubrir todos los datos capaces de cambiar el resultado. No bastan las fuentes: inclusiones, plantillas, configuración, referencias, recursos y versiones de adaptadores influyen. Solo se reutiliza si las dependencias registradas siguen coincidiendo. Si falta la salida, no se reutiliza aunque la clave coincida.
Las pruebas instalan asignadores que fallan en el límite del núcleo y comparan el contenido emitido. También auditan importaciones. Contar asignaciones sin comprobar el resultado podría ocultar contenido descartado silenciosamente tras un rechazo.