“¡Mi luz es un espejo! - dime, muéstrame mi doble ... ": diseña un buen marco y obtén el segundo como regalo

Las piedras de los templos antiguos saben hablar, pero pocas personas les prestan atención. El universo está lleno de sonidos que los humanos no escuchamos; colores que no vemos: a veces son las limitaciones objetivas del cuerpo y el espíritu, pero también hay razones subjetivas: falta de conocimiento y habilidades o incapacidad para usarlas en la práctica diaria. Un vívido ejemplo del segundo en el mundo de la programación: firmas de funciones. Los niños del mundo OO, en el mejor de los casos, piensan en interfaces: esto está cerca, pero "no exactamente eso" y cuanto más atento te vuelves, más se convierte en "nada". Y las firmas de funciones también saben hablar.

Honestamente, me gustaría comenzar desde el lado de abstracciones verdaderamente de alto nivel, pero mi experiencia previa muestra que incluso las verdades matemáticas más simples en un lenguaje no matemático "no suenan". De paso, noto que todo lo que estoy hablando nace del pensamiento matemático y, en consecuencia, puede formalizarse estrictamente.
Y ahora, los detalles. Probablemente todos más o menos "hurgando" se molestan en leer al menos una vez el trabajo de creación de época de GoF; probablemente incluso los "no adherentes" saben que existe un patrón de este tipo: iterador. Y ciertamente todos lo usan todos los días. Entonces (manteniendo C # condicional):

bool MoveNext(); T Current { get; } 

... y ahora lo mismo, pero sin ruido sintáctico (es indicativo que, de hecho, "sin ruido sintáctico" significa en Haskell):

 MoveNext :: () -> Bool Current :: () -> t 

... olvidando los tipos por un tiempo y enfocándose en la flecha en sí misma (->), involuntariamente llega a la pregunta de qué sucederá si se “invierte”. Entonces resulta:

 MoveNext' :: Bool -> () Current' :: t -> () 

Una ligera sensación de falta de armonía, ¿verdad? Si no hay problemas con t -> () , entonces Bool -> () parece más que sospechoso. Y de hecho, esta bandera se usó para señalar el final de la secuencia, ¿verdad? En la forma invertida, el caso Verdadero -> () no tiene ningún sentido útil, solo Falso -> () es suficiente. La incertidumbre binaria que proporciona el tipo Bool se pierde y, por lo tanto, debería verse así:

 completed :: () -> () next :: t -> () 

¿No se parece a nada? ¿Qué pasa con las extensiones reactivas ?
Wow! La firma (bueno, más precisamente, las firmas, pero el enfoque en sí mismo funciona a nivel individual) de la función de un marco (casi) genial (mini) nos habló de otro no menos genial, ¿verdad? Solo debes tener cuidado y escuchar.

Buenas noticias para el mundo desde la teoría de la categoría
Quién en el tema, por supuesto, sabe que el ejemplo con IEnumerator <-> IObserver no es nuevo.
Es sorprendente que rara vez alguien sepa que esto está lejos de ser el único ejemplo (aunque debemos rendir homenaje, específicamente este es muy brillante).

Las personas curiosas pueden tomar los patrones restantes de GoF y mirar sus dobles. A menudo resultará un completo sinsentido, esto es normal: en sí mismo, la "dualidad" es más alta que el mundo terrenal y no se considera obligado a contar con un uso práctico: pero después de todo, el Sol tampoco necesita nada de las personas para brillar.

¿Por qué entonces "casi genial"? Sí, debido a la falta de armonía que llevó a la necesidad de moler y cortar aún más. Hablando estrictamente, al girar las flechas hacia atrás, resultó algo no muy útil, que puede interpretarse como un inconveniente de la firma original. Mirando hacia el futuro, diré que esta misma firma se puede redefinir de tal manera que la falta de armonía desaparezca y será bastante simple recurrir a su dualidad. Pero no me molestaré con esto ... al menos, no en esta nota.

Mejor resumir, basado completamente en mi experiencia:

  1. Las firmas de funciones pueden hablar, pero los programadores a menudo son sordos.
  2. Cada vez que se encuentre con una función bien diseñada, pregúntese cuál es su doble y si podría ser útil para cualquier tarea.
  3. Si existe un dual, pero requiere una "ligera modificación" como en el ejemplo anterior, lo más probable es que la firma original tenga algunos defectos implícitos; ¿Quizás tenga sentido redefinirlo para que no haya tal problema?

Source: https://habr.com/ru/post/437520/


All Articles