|
È noto che F90 permette il massimo controllo
sull'accesso a subroutine e a variabili di un modulo attraverso
l'attributo PRIVATE, per cui in questo caso non ci sono
limiti alle possibilità di information hiding.
| MODULE staz_class IMPLICIT NONE TYPE staz ... END TYPE staz INTEGER :: nc REAL, PARAMETER :: vk=0.4 PRIVATE nc, vk, mi_vergogno_a_darla_in_giro CONTAINS ... SUBROUTINE mi_vergogno_a_darla_in_giro(...) END SUBROUTINE mi_vergogno_a_darla_in_giro END MODULE staz_class |
|
L'approccio del punto 2. è consigliato nel caso di
classi con poche variabili e di tipo scalare, in questo caso possiamo
negare l'accesso a tutti i membri del tipo e fornire dei metodi che
permettano di modificarlo in maniera controllata e di ricevere il
minimo di informazioni necessarie sullo stato dell'istanza.
| MODULE geo_coord_class IMPLICIT NONE TYPE geo_coord PRIVATE REAL :: lon, lat DOUBLE PRECISION :: utme, utmn INTEGER :: fuso CHARACTER(LEN=20) :: elliss END TYPE staz INTERFACE get_lon MODULE PROCEDURE geo_coord_get_lon END INTERFACE INTERFACE set_lonlat MODULE PROCEDURE geo_coord_set_lonlat END INTERFACE ... PRIVATE lonlat_to_utm CONTAINS ... FUNCTION geo_coord_get_lon(this) RESULT(lon) TYPE(geo_coord), INTENT(OUT) :: this REAL :: lon lon = this%lon END FUNCTION geo_coord_get_lon SUBROUTINE geo_coord_set_lonlat(this, lon, lat) TYPE(geo_coord), INTENT(IN) :: this REAL, INTENT(IN) :: lon, lat this%lon = lon this%lat = lat CALL lonlat_to_utm(this) END SUBROUTINE geo_coord_set_lonlat ... END MODULE geo_coord_class | PROGRAM elab_coord USE geo_coord TYPE(coord) :: mycoord REAL :: lon, lat CALL set_lonlat(mycoord, lon, lat) PRINT*,'longitudine:', get_lon(mycoord) !PRINT*,'longitudine:', mycoord%lon ! vietato! END PROGRAM elab_coord |
|
D'altra parte, nel caso di classi con molte
variabili o che contengono array, magari allocati dinamicamente,
l'approccio 2. è macchinoso e poco efficiente, per cui in questo caso
è meglio usare l'approccio 1., dando potenziale accesso a tutte le
variabili dell'istanza, ma documentando comunque le eventuali
operazioni che non sono consentite sui dati della classe.
| MODULE staz_class IMPLICIT NONE TYPE staz REAL, POINTER :: obs(:,:) ... END TYPE staz CONTAINS ... END MODULE staz_class |
PROGRAM elab_staz USE staz_class IMPLICIT NONE TYPE(staz) :: mystaz ... med = mystaz%obs(1:) / COUNT(mystaz%obs(1:)) END PROGRAM staz_class |