Δευτέρα 8 Φεβρουαρίου 2016

Απλό παράδειγμα κλάσης (με ιδιωτικό τμήμα)


Το παρακάτω απλό παράδειγμα τρέχει σε Μ2000. Το αντιγράφουμε σε ένα τμήμα έστω Α με:
 Σ Α enter επικόλληση  Esc
Με Α enter τρέχει άμεσα
Πάντα στην έξοδο σβήνονται οι μεταβλητές ενός τμήματος (εκτός και αν έχουμε ορίσει στατικές), αλλά μένει και ο σωρός τιμών. Όπου δείτε παρακάτω τη διάβασε ...αυτή διαβάζει από το σωρό τιμών. Οι συναρτήσεις έχουν δικό τους σωρό. Ο κατασκευαστής της Άλφα που είναι τμήμα έχει και αυτός δικό του σωρό (το σωρό της συνάρτησης Άλφα(), αυτήν φτιάχνει ο ορισμός Κλάση, και όποτε την καλέσουμε μας δίνει ένα νέο αντικείμενο.

Τα αντικείμενα απελευθερώνονται αυτόματα. Τα αντικείμενα δεν έχουν τύπο! Αυτή είναι η πρωτοτυπία της Μ2000. Μπορούμε να φτιάξουμε ένα πίνακα με βάση ένα αντικείμενο (το κάνουμε εδώ με το πίνακα Α(100)=Αλφα()). Όλα τα στοιχεία θα έχουν κοινές συναρτήσεις/τμήματα (και τα ιδιωτικά).
Στο παράδειγμα βλέπουμε τους  δυο τύπους αντικειμένων. Τα επώνυμα, αυτά που ορίζουμε με ένα όνομα και τα ανώνυμα αυτά που ανήκουν σε έναν πίνακα, άρα έχουμε σε κοινό όνομα έναν αριθμό να τα προσδιορίσουμε.
Ενώ σε άλλες γλώσσες ένα νέο αντικείμενο δίνει αναφορά σε αντικείμενο, εδώ έχουμε αντιγραφές. Όταν η συνάρτηση Άλφα() βγάζει ένα αντικείμενο και το γράφουμε ως μια μεταβλητή, εδώ Α, η Α θα έχει το αντικείμενο μέχρι να τερματίσει το τμήμα. Ένα Β=Α θα δημιουργήσει ένα νέο αντικείμενο αντίγραφο του Α το οποίο θα αλλάζει τιμές ανεξάρτητα. Αν το Β είναι ήδη αντικείμενο τότε έχουμε ένωση, ότι είναι ίδιο αλλάζει, ότι είναι νέο προστίθεται.
Στα ανώνυμα αντικείμενα δεν έχουμε ένωση, αλλά αντικατάσταση. Αν έχουμε τα Α και Β και ένα πίνακα έστω Χ(10) τότε το Χ(3)=Α θα αντικαταστήσει ότι είχε το Χ(3) με ένα αντίγραφο του Α και μετέπειτα μια Χ(3)=Β θα αντικαταστήσει το περιεχόμενο του Χ(3) με ένα αντίγραφο του Β.
Δηλαδή δεν έχουμε κράτηση αντικειμένων με δείκτες (ούτε μια εσωτερική μέτρηση να αποφασίζει αν θα σβήσει ή όχι το αντικείμενο). Το αντικείμενο θα σβήσει γιατί θα σβήσει ο πίνακας ή η μεταβλητή και και τα δύο.
Παρόλα αυτά μπορούμε να έχουμε αναφορές και δείκτες, με τρόπο, Οι αναφορές δημιουργούν νέο αντικείμενο που όλες οι τιμές του είναι αναφορές (δείχνουν την ίδια μνήμη). Δεν μπορούμε να δώσουμε αναφορά σε μη επώνυμο αντικείμενο. Για το σκοπό αυτό έχουμε τους δείκτες, ισχνές αναφορές, πού κάνουν οκνηρή αποτίμηση, δηλαδή κάνουν την ένωση κατά τη ζήτηση (σε αυτόματο εσωτερικά όνομα), ενώ με τις κανονικές αναφορές η ένωση γίνεται πριν χρησιμοποιηθεί το αντικείμενο). Όταν σβήνει μεταβλητές ο διερμηνευτής κοιτάει αν είναι σημαδεμένες ως αναφορές και αφαιρεί το δείκτη μόνο. Δεν χρειάζεται να απαριθμεί, διότι πάντα η πρώτη που εμφανίζεται και δίνει την τιμή για άλλες αναφορές, διαγράφεται τελευταία.
Στο παράδειγμα παρακάτω υπάρχουν αναφορές, δείτε το τμήμα ΔείξεΑναφορά. Το να περάσουμε την Α είναι άμεσο. Αν θέλουμε να περάσουμε όμως ένα ανώνυμο αντικείμενο πρέπει να το ανοίξουμε με τη Για {}. Επειδή δεν έχουμε όνομα χρησιμοποιούμε την Αυτό, δηλαδή το &Αυτό δίνει την αναφορά στο ανοιγμένο αντικείμενο (το αντικείμενο αυτό θα κλείσει και θα αντικαταστήσει το αντικείμενο στη θέση του πίνακα).



\\ Παράδειγμα Κλάσης στη Μ2000
Κλάση Αλφα {
Ιδιωτικό:
      χ=1, ψ=1
      παράγοντας=1, παλιά_τιμή
      Συνάρτηση Μηδεν {
            = (=0 και=0) ή .παράγοντας=0
      }
Δημόσιο:
      Τμήμα παράγοντας {
              Διάβασε .παράγοντας
      }
      Τμήμα Φύλαξε {
            άλλαξε .παλιά_τιμή, .παράγοντας
      }
      Τμήμα Αλφα {
            Αν όχι κενό τότε Διάβασε .παράγοντας
      }
      Τμήμα ΆλλαξεΧΨ {
            Διάβασε χ1, ψ1
            <=χ1/.παράγοντας
            <=ψ1/.παράγοντας
            Αν .Μηδεν() τότε Λάθος "Μηδέν"
      }
      Συνάρτηση ΔώσεΧ {
            =*.παράγοντας
      }
      Συνάρτηση ΔώσεΨ {
            =*.παράγοντας
      }
}


Α=Αλφα(10)
Α.ΆλλαξεΧΨ 100,50
Τύπωσε Α.ΔώσεΧ(), Α.ΔώσεΨ()
Α.παράγοντας 5
Τύπωσε Α.ΔώσεΧ(), Α.ΔώσεΨ()
\\ καμία από τις παρακάτω δεν είναι έγκυρες εκφράσεις
\\ οι μεταβλητές είναι ιδωτικές
Τύπωσε Έγκυρο(Α.παράγοντας), Έγκυρο(Α.χ) '0  0
Πίνακας Α(100)=Αλφα()
Για ι=0 έως 99 {
      Α(ι).ΆλλαξεΧΨ ι**2+1, ι**3+1
}
Τύπωσε "οκ"
Για ι=5 έως 6 {
      Για Α(ι) {
              Τύπωσε .ΔώσεΧ(),.ΔώσεΨ()
              .Φύλαξε
              .παράγοντας 10
              Τύπωσε .ΔώσεΧ(),.ΔώσεΨ()
              .παράγοντας 50
              Τύπωσε .ΔώσεΧ(),.ΔώσεΨ()
              .Φύλαξε
              Τύπωσε .ΔώσεΧ(),.ΔώσεΨ()
      }
}
Τμήμα ΔείξεΑναφορά {
      Διάβασε &Αντικείμενο
      Τύπωσε Αντικείμενο.ΔώσεΧ(),Αντικείμενο.ΔώσεΨ()
}
ΔείξεΑναφορά
Για Α(20) { ΔείξεΑναφορά &Αυτό}


Εδώ ξεφεύγει λίγο το θέμα, αλλά είναι αφιερωμένο σε πιο προχωρημένους!

Αν κάποιος "πονηρός" βάλει μια Πίνακας Α()  που σβήνει το πίνακα, όχι το όνομα, μέσα στη Για Α(10) { }, στο τέλος θα βγει λάθος γιατί δεν θα βρίσκει στο πίνακα θέση να βάλει την αλλαγή του αντικειμένου.
Οι ισχνές αναφορές ειδικά σε στοιχεία πίνακα βοηθούν γιατί λειτουργούν ως δείκτες. Δηλαδή μέσα από ένα τμήμα η ισχνή αναφορά λειτουργεί σαν η μεταβλητή μας ή ο πίνακας να είναι γενικός, άρα προσβάσιμος.
Το &Α είναι μια ισχνή αναφορά, π.χ. με Τύπωσε &Α θα πάρουμε το όνομα που πραγματικά τη δεδομένη στιγμή αναγνωρίζει τη μεταβλητή ο διερμηνευτής. Δεν υπάρχει όμως αυτό &Α(3), και για να πάρουμε την ισχνή αναφορά έχουμε το ισχνη$(Α(3))  αν δώσουμε  Τύπωσε ισχνη$(Α(3+5)θα πάρουμε κάτι που θα τελειώνει σε .Α(8) δηλαδή το αποτέλεσμα μέσα στις παρενθέσεις θα έχει υπολογιστή, θα έχει ελεγχθεί ότι υπάρχει το στοιχείο του πίνακα, και τότε θα δοθεί αλλά δεν θα γίνει η ένωση. Υπάρχει τρόπος στην Μ2000 να δώσουμε οκνηρή αποτίμηση, δηλαδή ακόμα και οι παραστάσεις μέσα στο Α( ) να μην υπολογίζονται άμεσα αλλά κατά την χρήση. Αυτό απαιτεί μια δομή οκνηρής αποτίμησης που μεταφέρει σε ένα άλλο τμήμα ένα μέρος του τμήματος (του περιβάλλοντος) του τμήματος που παρήγαγε μια ανώνυμη συνάρτηση. Αυτό το θέμα είναι πιο βαρύ, και δεν γίνεται άμεσα κατανοητή η χρησιμότητα. Εδώ θα αναφερθεί ,μόνο ότι εντάσσεται σε αυτό που λέμε πέρασμα με αναφορά. Αντί η αναφορά να γίνεται σε ένα στοιχείο, ή σε ένα αντικείμενο, μπορεί να γίνει σε ένα μέρος εντός εν εκτελέσει τμήματος. Από το Α να καλούμε το Β και το Β με επαναλήψεις να εκτελεί μέρη του Α δίνοντας και παραμέτρους! Παρόμοιο γίνεται όταν ένα αντικείμενο στο Α είναι περασμένο στο Β με αναφορά και μέσα από το Β χειριζόμαστε το Α και αλλάζουμε τιμές στο αντικείμενο που είναι στο Α (ενωμένο με την αναφορά του στο Β). Η διαφορά με το τρόπο της οκνηρής αποτίμησης είναι ότι μπορεί να γίνει χωρίς χρήση αντικειμένου. σαν να φέρνουμε μια ρουτίνα από την "ιστορία εκτέλεσης" στο προσκήνιο.

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

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

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