F # tiene una característica poco utilizada llamada "archivos de firma". Puede tener un gran archivo de implementación lleno de public types/methods/modules/functions, pero luego puede ocultar y exponer selectivamente esa funcionalidad a la secuela del programa a través de un archivo de firma. Es decir, un archivo de firma actúa como un tipo de pantalla/filtro que le permite hacer entidades "públicas para este archivo" pero "privadas para el resto del programa".
Siento que esta es una característica bastante sorprendente en la plataforma .Net, porque la única otra herramienta anterior que tiene para este tipo de encapsulamiento son los ensamblajes. Si tiene un componente pequeño con algunos tipos relacionados que desean poder ver los detalles internos de cada uno, pero no desea que esos tipos tengan todos esos bits públicos en todos,, ¿qué puede hacer?Bueno, puede hacer dos cosas:
- Se puede retener ese componente en un ensamblaje separado, y hacer que los miembros de que esos tipos de acción, deberían "interno", y hacer que la parte estrecha desea que los demás para ver sea " public ", o
- Simplemente marque las cosas internas" internas "pero deje esos tipos en su ensamblaje gigante y solo espero que todos los demás códigos en el ensamblaje elijan no llamar a los miembros que solo fueron marcados como 'internos' porque otro tipo necesitaba verlo.
En mi experiencia, en proyectos de software grandes, todos siempre hacen # 2, porque # 1 no es arrancador por varias razones (las personas no quieren 50 ensamblajes pequeños, quieren 1 o 2 o 3 grandes asambleas, por otras razones quizás buenas sin relación con el punto de encapsulación que estoy planteando (aparte: todos mencionan ILMerge pero nadie lo usa)).
Así que eligió la opción n. ° 2. Luego, un año después, finalmente decide refactorizar ese componente, y descubre que durante el año pasado, otros 17 lugares ahora recurren a ese método "interno" que en realidad solo estaba destinado a ese tipo de otro tipo, lo que lo hace realmente difícil factorizar ese bit porque ahora todos dependen de esos detalles de implementación. Gorrón.
El punto es que no hay una buena manera de crear un alcance/límite de encapsulación intra-ensamblado de tamaño moderado en .Net. Muchas veces "interno" es demasiado grande y "privado" es demasiado pequeño.
... hasta F #. Con los archivos de firma F #, puede crear un alcance de encapsulación de "este archivo de código fuente" marcando un montón de cosas como públicas dentro del archivo de implementación, para que todo el otro código en el archivo pueda verlo y festejarlo, pero luego use un archivo de firma para ocultar todos los detalles, espere la interfaz pública estrecha que ese componente expone al resto del mundo. Esto es feliz Defina tres tipos altamente relacionados en un archivo, permítales ver los detalles de implementación de los demás, pero solo exponga las cosas realmente públicas a todos los demás. ¡Ganar!
Los archivos de firmas no son quizás la característica ideales para los límites de encapsulación intra-montaje, pero son la única de estas características que sé, y por lo que se aferran a ellos como una balsa salvavidas en el océano.
TL; DR
La complejidad es el enemigo. Los límites de encapsulación son un arma contra este enemigo. "privado" es una gran arma, pero a veces demasiado pequeña para ser aplicable, y "interna" a menudo es demasiado débil porque tanto código (todo el ensamblaje y todo InternalsVisibleTo) puede ver cosas internas. F # ofrece un alcance mayor que "privado a un tipo" pero más pequeño que "todo el conjunto", y eso es muy útil.
Supongo que todas las características están ocultas de alguna manera;) – wishi