Υποπρογραμματα

Ξεκίνησε από theoni, 11 Απρ 2018, 09:49:40 ΠΜ

« προηγούμενο - επόμενο »

theoni

Καλημέρα σας και χρόνια πολλά!!!!στις οδηγίες μελέτης μαθητή αναφέρει:να επισημανθεί ιδιαίτερα ότι οι συναρτήσεις δεν μπορούν να έχουν εντολές εισόδου-εξοδου .Κατ'επέκταση αυτού του γεγονότος θεωρείται ότι δεν μπορεί να γίνει κλήση μιας διαδικασίας μέσα από μια συνάρτηση.Η ερώτηση μου είναι η εξής: δεν μπορεί η συνάρτηση να καλέσει καμία διαδικασία ή δεν καλεί μόνο όσες περιέχουν τις εντολές διάβασε και γράψε;

gpapargi

Δεν μπορεί να καλέσει καμία διαδικασία. Σκέψου ότι μπορεί μια διαδικασία να καλεί άλλη διαδικασία, που καλεί άλλη διαδικασία κλπ που έχει μέσα Γράψε/Διάβασε. Θα ήταν άκομψο να περιγράφεις τέτοιες εξαιρέσεις.
Υπάρχει όμως και κάτι άλλο: Μια βασική αρχή του τμηματικού προγραμματισμού είναι η ανεξαρτησία δηλαδή να μπορείς να χρησιμοποιήσεις ένα υποπρόγραμμα χωρίς να χρειάζεται να κοιτάξεις την υλοποίησή του, δηλαδή τον κώδικά του. (Αυτός είναι ο λόγος που οι μεταβλητές είναι τοπικές και μπορείς να χρησιμοποιήσεις το ίδιο όνομα μεταβλητής στο πρόγραμμα και στο υποπρόγραμμα). Με βάση αυτό, θα έπρεπε να κοιτάς τον κώδικά της διαδικασίας για να δεις αν υπάρχει μέσα εντολή εισόδου/εξόδου. Ακόμα χειρότερα θα ήταν αν μια διαδικασία καλούσε διαδικασία που περιέχει είσοδο/έξοδο. Κάτι τέτοιο παραβιάζει την αρχή της ανεξαρτησίας των υποπρογραμμάτων.

bugman

Πως μπορεί να υπάρξει ανεξαρτησία υποπρογραμμάτων όταν οι συναρτήσεις και οι διαδικασίες έχουν γενική θέαση, δηλαδή μπορούν να κληθούν από οπουδήποτε;

petrosp13

Πώς η γενική θέαση καταστρατηγεί την ανεξαρτησία;
Όταν καλώ μέσα σε ένα υποπρόγραμμα μου την Τ_Ρ(), οφείλω μόνο να ξέρω τι δέχεται, τίποτα άλλο
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

bugman

Μα ασφαλώς και καταστρατηγούμε την ανεξαρτησία όταν έχουμε όλα τα υποπρογράμματα και τις συναρτήσεις σε ένα επίπεδο. Όπως σωστά αναφέρει ο Άλκης εδώ:
ΠαράθεσηΟι διαδικασίες είναι υποπρογράμματα που γράφονται μετά το κυρίως πρόγραμμα. Μπορούν να κληθούν με την εντολή ΚΑΛΕΣΕ από οποιοδήποτε σημείο του προγράμματος. Οι παράμετροι αναφέρονται ονομαστικά κατά τη δήλωση της διαδικασίας και στη συνέχεια ο τύπος τους δηλώνεται στο τμήμα «Μεταβλητές».

Με απλά λόγια, οι διαδικασίες είναι γενικές. Όταν η διαδικασία ΑΒΓ χρησιμοποιεί την ΚΛΜ() που την χρησιμοποιεί μια άλλη διαδικασία ΠΡΣ τότε οι ΑΒΓ και ΠΡΣ έχουν κοινή εξάρτηση την ΚΛΜ(). Αν η ΚΛΜ() ήταν κλειστό κουτί τότε ουδέν πρόβλημα. Αν όμως κάνουμε αλλαγές στην ΚΛΜ() θα πειράξουμε και τις δυο διαδικασίες, και αυτό δηλώνει την μη ανεξαρτησία!

Απ' όσο γνωρίζω δυο τρόποι υπάρχουν σε γλώσσες που δεν χρησιμοποιούν αντικείμενα να πετύχουν ανεξαρτησία. Ο διαχωρισμός σε τμήματα (Modules) όπου το καθένα ορίζει διαδικασίες ιδιωτικές και δημόσιες,  άρα εδώ η ΚΛΜ() θα ήταν ιδιωτική, και η χρήση ενσωματωμένων ορισμών, δηλαδή δεύτερο επίπεδο, όπου η ΚΛΜ() θα έχει θέαση μόνο στην συγκεκριμένη διαδικασία που θα ορίζεται!
Στις αντικειμενοστραφείς γλώσσες η συνάρτηση ΚΛΜ() θα αποτελούσε μέθοδο του αντικειμένου, και έτσι εκεί πετυχαίνουμε άμεσα την ανεξαρτησία!

Έχει σημασία η "θέαση" ή αλλιώς "scope" για τις συναρτήσεις και τις διαδικασίες για να αποφανθούμε για το αν έχουμε ανεξαρτησία ή όχι. Δεν ορίζεται δηλαδή από την φάση της κλήσης, από το αν περνάμε με αναφορά ή όχι τιμές. Αυτό δηλώνει μόνο την σχέση αυτού που καλεί με εκείνου που καλείται. Η ανεξαρτησία έχει να κάνει με το σχεδιασμό, όταν πειράξουμε το κώδικα μιας διαδικασίας ή συνάρτησης να γνωρίζουμε ποιες επιπτώσεις θα υπάρχουν σε άλλες διαδικασίες και συναρτήσεις.

Το ίδιο ζήτημα έχει να κάνει και με τις γενικές ή καθολικές μεταβλητές. Συνήθως λέμε για το αν κάποια διαδικασία "αλλάξει" τιμή στη γενική το τι θα επιφέρει. Όμως παίζει και το άλλο, αν αλλάξει η αρχική τιμή της γενικής επίσης θα υπάρχουν επιπτώσεις όπου αυτή χρησιμοποιείται ακόμα και αν δεν αλλαχθεί σε καμία διαδικασία ή συνάρτηση. Στη Γλώσσα έβγαλαν τις γενικές, άρα δεν σπάμε το κεφάλι μας για εξαρτήσεις σε μεταβλητές, αλλά παρέμειναν ως γενικές ή καθολικές οι διαδικασίες και οι συναρτήσεις! Η αλλαγή του κώδικα σε μια διαδικασία ή συνάρτηση είναι εφάμιλλη με την αλλαγή αρχικής τιμής μιας καθολική ή γενικής (αναφέρω και τις δυο λέξεις, γενική και καθολικής ως ισοδύναμες έννοιες).


alkisg

bugman, διαφωνώ με αυτά που λες, και θεωρώ ότι η έννοια της ανεξαρτησίας είναι η παρακάτω:
Διαδικασία Ταξινόμησε(Α, Ν)
...

Να μπορώ όποτε θέλω να αλλάζω την υλοποίησή της, από π.χ. insertion sort σε bubble sort, και να μην χρειάζεται να κάνω καμία αλλαγή σε οποιοδήποτε άλλη διαδικασία ή στο κυρίως πρόγραμμα που την καλεί.

Με άλλα λόγια: όσο η γραμμή δήλωσης μιας διαδικασίας μένει αμετάβλητη, μπορούμε να κάνουμε όσες αλλαγές θέλουμε στον εσωτερικό της κώδικα, ανεξάρτητα και χωρίς να επηρεαστεί ο κώδικας των υπόλοιπων υποπρογραμμάτων.

bugman

Βλέπεις το πράγμα μόνο από τη χρησιμότητα που επιδιώκεις! Η ουσία δεν αλλάζει. η bubble sort θα είναι γενική στο πρόγραμμά σου, δηλαδή θα είναι αυτή που θα φορτώσεις. Αν όλες οι συναρτήσεις που χρησιμοποιείς περιορίζονται ας πούμε σε δέκα, δεν υπάρχει θέμα περί "ανεξαρτησίας". Αν όμως σου δώσω μια Cos() πρέπει να ξέρεις αν παίρνει ακτίνια ή μοίρες και δεν το λέει η γραμμή δήλωσης!


alkisg

Παράθεση από: bugman στις 14 Απρ 2018, 10:58:04 ΜΜ
Αν όμως σου δώσω μια Cos() πρέπει να ξέρεις αν παίρνει ακτίνια ή μοίρες και δεν το λέει η γραμμή δήλωσης!

Μα η αρχή της ανεξαρτησίας αυτό λέει, ότι εφόσον ξέρουμε την γραμμή της δήλωσης, δεν μας νοιάζει τι γίνεται στο εσωτερικό. Τι επιχείρημα είναι το "αν δεν ξέρεις τη γραμμή δήλωσης";?!

Εννοείται βέβαια ότι όταν λέμε ότι γνωρίζουμε τη γραμμή της δήλωσης, αυτό περιλαμβάνει και την έννοια των μεταβλητών, και τον τύπο και όλα. Άμα στη Διπλασίασε(α, β) δεν ξέρεις αν το α ή το β είναι το διπλάσιο, τότε δεν συζητάμε για ανεξαρτησία προγραμμάτων, αλλά για... τυφλό προγραμματισμό; Δεν ξέρω τι επιχείρημα θες να πεις εκεί.

bugman

Οκ. Δεν γίνομαι κατανοητός!
Εσύ μένεις στο θέμα την ανεξαρτησίας του καλούντος (που καλεί τη συνάρτηση) και του καλούμενου (της συνάρτησης). Καλείς ανεξαρτησία της καλούμενης συνάρτησης, κατά την εκτέλεση, την αδυναμία του καλούντος να αλλάξει κάτι σε αυτήν εκτός από τις τιμές στη δήλωση, τις παραμέτρους αυτής. Γίνεται λόγος για αυτή την ανεξαρτησία, επειδή σε παλιές γλώσσες, βλέπε Basic (αρχικές εκδόσεις)  η κλήση σε ρουτίνα δεν άλλαζε τη θέαση των μεταβλητών, γίνονταν δε με κλήση μόνο του ονόματος,  δηλαδή δεν υπήρχαν στη κλήση οι παράμετρες αλλά βρίσκονταν ήδη στη θέση τους σε "γενικές" μεταβλητές.

Αυτό που θέτω ως ανεξαρτησία υπερβαίνει το θέμα της κλήσης, σχετίζεται όμως και με αυτήν. Έχει να κάνει με την εξάρτηση της οποιασδήποτε διαδικασίας/συνάρτησης με αυτές που καλεί εσωτερικά, και μιλάμε για την προ της εκτέλεσης κατάσταση, στη φάση του προγραμματισμού. Δηλαδή αν σε ένα υποπρόγραμμα χρησιμοποιώ βοηθητικά τρεις συναρτήσεις που έχω φτιάξει, και θέλω να το χρησιμοποιήσω σε ένα πρόγραμμα, νέο, τότε πρέπει να προσέξω στο νέο να μην έχω ίδιες συναρτήσεις (με ίδιο όνομα δηλαδή). Αν όμως η γλώσσα που χρησιμοποιώ μου δίνει το τρόπο ώστε οι βοηθητικές συναρτήσεις να μένουν κλεισμένες ή απομονωμένες  για το υπόλοιπο πρόγραμμα, σημαίνει ότι δεν υπάρχει καμία εξάρτηση με το "υπόβαθρο" του υποπρογράμματος, και το μόνο που με ενδιαφέρει είναι η δήλωση, τι παραμέτρους παίρνει και τα όρια και πραγματικό είδος αυτών (και ας μην τα γράφει η δήλωση, θα τα έχω σε μια γραμμή σημείωσης).