Τρίτη 9 Φεβρουαρίου 2016

Αναθεώρηση 155 - Γενικές Ομάδες

Ξανασχεδίασα τις γενικές ομάδες.
Παρακάτω είναι το πρόγραμμα ελέγχου (δεν τρέχει σε αναθεώρηση<155)
Το βασικό είναι να έχουμε γενικές ομάδες, δηλαδή να φαίνονται παντού, πολλών επιπέδων. Τα επίπεδα είναι τα επίπεδα εκτέλεσης, αν το Α καλέσει το Β τότε το Β είναι στο επόμενο επίπεδο, ή στο αμέσως νεότερο (είναι εδώ το ίδιο πράγμα).
Άρα μας ενδιαφέρει να δηλωθεί μια γενική και μετά σε ένα τμήμα να δηλωθεί ξανά μια γενική η οποία θα είναι γενική για όλα τα μετέπειτα επίπεδα, αλλά αν γυρίσουμε στο προηγούμενο τότε θα βλέπουμε τη παλιά γενική!
Δεν είναι απλό το θέμα αν οι γενικές είναι αντικείμενα (ομάδες).

Παρακάτω έχω το δείγμα που έκανα έλεγχο πάνω στις γενικές (το έγραψα στα αγγλικά, αλλά μπορεί να γραφτεί και στα ελληνικά). Το ALFA είναι ένα αντικείμενο γενικό. Στο τμήμα VERY_BIG φτιάχνουμε ένα άλλο ALFA με άλλες τιμές, διαφορετικό. Καλούμε το BIG_ONE, μετά το SMALL_ONE.. Εκεί αν η ALFA δεν ήταν γενική θα έβγαινε λάθος. Εκτελούμε κάποιες ενέργειες που αφήνουν άλλη κατάσταση στη γενική ALFA, και επιστρέφουμε πίσω μέχρι να βγούμε από την VERY_BIG. Ελέγχουμε την ALFA (την πρώτη γενική ομάδα) και την βρίσκουμε ΟΚ.


Για να γίνει πιο δύσκολο το αντικείμενο έχει δικό του ορισμό κλάσης HELLO() και φτιάχνει δικό του αντικείμενο - πρόσκαιρα- και αυτό έχει δική του συνάρτηση BE$() που διαβάζει τη μεταβλητή του αντικειμένου Β (την Β.Χ)


\\ test sample
GLOBAL GROUP ALFA {
PRIVATE:
      NAME$="THE BAD ONE"
PUBLIC:
      DIM A(10)=3
      GROUP AA {
      CLASS HELLO {
            x=10
            FUNCTION BE$ {
                  =STR$(.x)
            }
      }
      k=100
        MODULE OK {
        MODULES ?
        B=.HELLO()
        PRINT "OK" , B.X, B.BE$()
            }                
      }


     FUNCTION PRINTME$ {
           = .NAME$
     }
}
MODULE VERY_BIG {
      \\ THIS IS  GLOBAL FOR TEMPORARY USE
      GLOBAL GROUP ALFA {
      PRIVATE:
                   NAME$="<NONAME>"
                   COUNTER=0
      PUBLIC:
                  DIM A(30)=3
                  FUNCTION PRINTME$ {
                       ="Fault"
                  }      
                  \\ THIS IS A GROUP IN A GROUP
                  GROUP AA {
                              \\ THIS IS A CLASS FUNCTION
                              CLASS HELLO {
                                    x=30
                                    FUNCTION BE$ {
                                          \\ WE TEST HERE
                                          \\ IF INTERPRETER CHOOSE WRONG BE$()
                                          \\ THEN WE GET 10 NOT 3000
                                          \\ BUT CHOOSE RIGHT
                                          =STR$(.x*100)
                                    }
                              }
                              k=500
                              \\ THIS IS A MODULE IN GROUP AA
                              MODULE OK {
                                    \\ MODULE "OK" CANNOT SEE ABOVE AA
                                    MODULES ?
                                    B=.HELLO()
                                    \\ WE DO A TEST HERE
                                    \\ WE HAVE TO READ OUR B.X NOT PREVIOUS GLOBAL
                                    PRINT "Fault" , B.X, B.BE$()
                              }                
                        }
      FUNCTION GET_NAME$ {
                        .COUNTER++
                        =.NAME$
                  }
                  MODULE SET_NAME {
                        READ .NAME$
                  }
                  FUNCTION WATCH_ME {
                        =.COUNTER
                  }
                
      }
    
      PRINT ALFA.GET_NAME$()
      ALFA.SET_NAME "GEORGE THE BEST"
    
      MODULE A_BIG_ONE {
            MODULE A_SMALL_ONE {
                  LIST
                  MODULES ?
                  PRINT ALFA.GET_NAME$()
                  PRINT ALFA.WATCH_ME()
                  PRINT VALID(ALFA.COUNTER) ' NO IS PRIVATE
                  ALFA.AA.OK
            }
            A_SMALL_ONE
      }
      A_BIG_ONE
}
VERY_BIG
\\ NOW GLOBAL  DESTROYED
PRINT ALFA.PRINTME$(), ALFA.A(4)
\\ THIS IS THE FINAL CHECK
\\ M2000 REPLACE FUNCTIONS/MODULES/VARIABLES
\\ BUT NO FOR GLOBAL GROUPS
\\ THIS IS THE SCOPE FOR REVISION 155
ALFA.AA.OK


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.