Τι είναι ένας χώρος ονομάτων στο γ. Τάξεις και χώροι ονομάτων. Κλήση κωδικού από χώρο ονομάτων

Τάξεις και Χώροι ονομάτων

Κλάσεις .NET Framework

Ίσως το μεγαλύτερο όφελος από τη σύνταξη διαχειριζόμενου κώδικα -τουλάχιστον από την άποψη ενός προγραμματιστή- είναι ότι μπορείτε να χρησιμοποιήσετε Βιβλιοθήκη βασικής κλάσης .NET .

Οι βασικές κλάσεις .NET παρέχουν μια τεράστια συλλογή από διαχειριζόμενες κλάσεις κώδικα που σας επιτρέπουν να επιλύσετε σχεδόν οποιοδήποτε πρόβλημα θα μπορούσε να επιλυθεί προηγουμένως χρησιμοποιώντας το API των Windows. Όλες αυτές οι κλάσεις ακολουθούν το ίδιο μοντέλο αντικειμένου IL με μοναδική κληρονομικότητα. Αυτό σημαίνει ότι μπορείτε είτε να δημιουργήσετε αντικείμενα από οποιαδήποτε από τις βασικές κλάσεις .NET είτε να κληρονομήσετε τις δικές σας κλάσεις από αυτές.

Αυτό που κάνει τις βασικές κλάσεις .NET διαφορετικές είναι ότι έχουν σχεδιαστεί για να είναι εύχρηστες και εύχρηστες. Για παράδειγμα, για να ξεκινήσετε ένα νήμα πρέπει να καλέσετε τη μέθοδο Start() της κλάσης Νήμα. Για να μην είναι διαθέσιμο ένα αντικείμενο TextBox, ορίστε την ιδιότητα Enabled του αντικειμένου σε false. Αυτή η προσέγγιση, γνωστή στους προγραμματιστές της Visual Basic και της Java, των οποίων οι βιβλιοθήκες είναι εξίσου εύχρηστες, θα είναι μια τεράστια ανακούφιση για τους προγραμματιστές της C++ που έχουν περάσει χρόνια παλεύοντας με λειτουργίες API όπως οι GetDIBits(), RegisterWndClassEx() και IsEqualIID(), καθώς καθώς και πολλές λειτουργίες που απαιτούσαν περαστικές λαβές παραθύρων.

Ωστόσο, οι προγραμματιστές της C++ είχαν πάντα εύκολη πρόσβαση στο πλήρες σύνολο των API των Windows, ενώ οι προγραμματιστές της Visual Basic 6 και της Java περιορίζονταν στη βασική λειτουργικότητα του λειτουργικού συστήματος στην οποία έχουν πρόσβαση από τις γλώσσες τους. Οι βασικές κλάσεις .NET συνδυάζουν την ευκολία χρήσης των βιβλιοθηκών Visual Basic και Java με σχετικά πλήρη κάλυψη του συνόλου δυνατοτήτων API των Windows. Πολλές δυνατότητες των Windows δεν είναι προσβάσιμες μέσω βασικών κλάσεων και σε αυτές τις περιπτώσεις θα πρέπει να καταφύγετε σε λειτουργίες API, αλλά γενικά αυτό ισχύει μόνο για τις πιο εξωτικές λειτουργίες. Για καθημερινή χρήση, ένα σύνολο βασικών κατηγοριών θα είναι γενικά αρκετό. Αν όμως χρειαστεί να καλέσετε μια συνάρτηση API, τότε το .NET παρέχει το λεγόμενο μηχανισμός επίκλησης πλατφόρμας, το οποίο εγγυάται τη σωστή μετατροπή τύπων δεδομένων, επομένως τώρα αυτή η εργασία δεν είναι πιο δύσκολη από την κλήση αυτών των συναρτήσεων απευθείας από τον κώδικα C++, ανεξάρτητα από τη γλώσσα στην οποία είναι γραμμένος ο κώδικας - C#, C++ ή Visual Basic 2010.

Χώροι ονομάτων

Χώροι ονομάτωνείναι ένας τρόπος με τον οποίο το .NET αποφεύγει τις συγκρούσεις ονομάτων μεταξύ κλάσεων. Σκοπός τους είναι να αποτρέψουν καταστάσεις όπου ορίζετε μια κλάση που αντιπροσωπεύει έναν πελάτη, την αποκαλείτε Πελάτη και, στη συνέχεια, κάποιος άλλος κάνει το ίδιο πράγμα (αυτό είναι ένα αρκετά συνηθισμένο σενάριο).

Ένας χώρος ονομάτων δεν είναι τίποτα άλλο από μια ομάδα τύπων δεδομένων, αλλά έχει ως αποτέλεσμα ότι τα ονόματα όλων των τύπων δεδομένων εντός του χώρου ονομάτων προστίθενται αυτόματα με το όνομα του χώρου ονομάτων. Οι χώροι ονομάτων μπορούν να είναι ένθετοι μεταξύ τους. Για παράδειγμα, οι περισσότερες βασικές κλάσεις .NET γενικής χρήσης βρίσκονται στον χώρο ονομάτων Σύστημα. Βασική τάξη Πίνακαςαναφέρεται σε αυτόν τον χώρο, επομένως είναι το πλήρες όνομά του Σύστημα.Πίνακας.

Η πλατφόρμα .NET απαιτεί όλα τα ονόματα να δηλώνονται εντός ενός χώρου ονομάτων. για παράδειγμα μπορείτε να βάλετε την τάξη σας Η τάξη μουστον χώρο ονομάτων Η εταιρεία μου. Τότε το πλήρες όνομα αυτής της τάξης θα μοιάζει MyCompany.MyClass.

Σημειώστε ότι εάν ένας χώρος ονομάτων δεν καθορίζεται ρητά, ο τύπος θα προστεθεί στον καθολικό χώρο ονομάτων χωρίς όνομα.

Στις περισσότερες περιπτώσεις, η Microsoft συνιστά τη χρήση τουλάχιστον δύο ένθετων χώρων ονομάτων: το πρώτο είναι το όνομα της εταιρείας σας και το δεύτερο είναι το όνομα της τεχνολογίας ή του πακέτου λογισμικού στο οποίο ανήκει η κλάση, επομένως μοιάζει κάπως έτσι: MyCompany.SomeNamespace .Η τάξη μου. Στις περισσότερες περιπτώσεις, αυτή η προσέγγιση θα προστατεύσει τις κλάσεις της εφαρμογής σας από πιθανές διενέξεις με ονόματα κλάσεων που έχουν γραφτεί από προγραμματιστές από άλλες εταιρείες.

Ο παρακάτω πίνακας είναι μια σύντομη λίστα ορισμένων (αλλά σίγουρα όχι όλων) των χώρων ονομάτων που προσφέρονται στο .NET, τα οποία έχουν χωριστεί σε ομάδες με βάση τη λειτουργικότητα:

Χώροι ονομάτων κλειδιών .NET Framework
Χώρος ονομάτων στο .NET Περιγραφή
Σύστημα Μέσα στον χώρο ονομάτων Σύστημαπεριέχει πολλούς χρήσιμους τύπους για την αντιμετώπιση εσωτερικών δεδομένων, μαθηματικών, δημιουργίας τυχαίων αριθμών, μεταβλητών περιβάλλοντος και συλλογής σκουπιδιών, καθώς και έναν αριθμό κοινώς χρησιμοποιούμενων εξαιρέσεων και χαρακτηριστικών
Σύστημα.Συλλογές
Σύστημα.Συλλογές.Γενικές
Αυτοί οι χώροι ονομάτων περιέχουν έναν αριθμό τύπων κοντέινερ, καθώς και αρκετούς βασικούς τύπους και διεπαφές που σας επιτρέπουν να δημιουργείτε ειδικές συλλογές
Σύστημα.Δεδομένα
Σύστημα.Δεδομένα.Κοινά
System.Data.EntityClient
System.Data.SqlClient
Αυτοί οι χώροι ονομάτων χρησιμοποιούνται για αλληλεπίδραση με βάσεις δεδομένων χρησιμοποιώντας το ADO.NET
Σύστημα.ΙΟ
Σύστημα.ΙΟ.Συμπίεση
System.IO.Ports
Αυτοί οι χώροι περιέχουν πολλούς τύπους σχεδιασμένους για να χειρίζονται I/O αρχείων, συμπίεση δεδομένων και χειρισμό θυρών.
Σύστημα.Αντανάκλαση
Σύστημα.Αντανάκλαση.Εκπομπή
Αυτοί οι χώροι ονομάτων περιέχουν τύπους που υποστηρίζουν την ανακάλυψη τύπων χρόνου εκτέλεσης καθώς και τη δημιουργία δυναμικού τύπου
System.Runtime.InteropServices Αυτός ο χώρος ονομάτων περιέχει τα μέσα με τα οποία μπορείτε να επιτρέψετε στους τύπους .NET να αλληλεπιδρούν με "μη διαχειριζόμενο κώδικα" (όπως τα DLL που βασίζονται σε C και διακομιστές COM) και αντίστροφα
Σύστημα.Σχέδιο
Σύστημα.Windows.Forms
Αυτοί οι χώροι ονομάτων περιέχουν τύπους που χρησιμοποιούνται για τη δημιουργία εφαρμογών επιφάνειας εργασίας χρησιμοποιώντας το εγγενές σύνολο εργαλείων γραφικών .NET (Windows Forms).
Σύστημα.Windows
Σύστημα.Windows.Στοιχεία ελέγχου
Σύστημα.Windows.Σχήματα
Χώρος Σύστημα.Windowsείναι η ρίζα μεταξύ αυτών των πολλών χώρων ονομάτων, που αντιπροσωπεύουν ένα σύνολο γραφικών εργαλείων του Windows Presentation Foundation (WPF)
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Αυτοί οι χώροι ονομάτων περιέχουν τύπους που χρησιμοποιούνται όταν κάνετε προγραμματισμό χρησιμοποιώντας το LINQ API
Σύστημα.Ιστός Αυτός ο χώρος ονομάτων είναι ένας από τους πολλούς που σας επιτρέπουν να δημιουργείτε εφαρμογές web ASP.NET
System.ServiceModel Αυτός ο χώρος ονομάτων είναι ένας από τους πολλούς που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε κατανεμημένες εφαρμογές χρησιμοποιώντας το API του Windows Communication Foundation (WCF).
System.Workflow.Runtime
Σύστημα.Ροή εργασιών.Δραστηριότητες
Αυτοί οι δύο χώροι ονομάτων είναι οι κύριοι εκπρόσωποι των πολλών χώρων ονομάτων που περιέχουν τους τύπους που χρησιμοποιούνται για τη δημιουργία εφαρμογών με δυνατότητα ροής εργασιών χρησιμοποιώντας το API του Windows Workflow Foundation (WWF).
System.Threading
System.Threading.Tasks
Αυτός ο χώρος ονομάτων περιέχει πολλούς τύπους για τη δημιουργία εφαρμογών πολλαπλών νημάτων που μπορούν να κατανείμουν το φόρτο εργασίας σε πολλές CPU.
Σύστημα.Ασφάλεια Η ασφάλεια είναι εγγενής στον κόσμο του .NET. Οι χώροι ονομάτων που σχετίζονται με την ασφάλεια περιέχουν πολλούς τύπους που αφορούν δικαιώματα, κρυπτογραφική ασφάλεια κ.λπ.
Σύστημα.Xml Αυτός ο προσανατολισμένος σε XML χώρος ονομάτων περιέχει πολλούς τύπους που μπορούν να χρησιμοποιηθούν για αλληλεπίδραση με δεδομένα XML

Ο ρόλος του ριζικού χώρου της Microsoft

Κατά την εξέταση της λίστας στον πίνακα, ήταν εύκολο να παρατηρήσετε ότι ο χώρος ονομάτων του συστήματος είναι η ρίζα ενός αξιοπρεπούς αριθμού ένθετων χώρων ονομάτων (όπως System.IO, System.Data, κ.λπ.). Όπως αποδεικνύεται, ωστόσο, εκτός από το System, η βιβλιοθήκη της βασικής κλάσης προσφέρει επίσης μια σειρά από άλλους ριζικούς χώρους ονομάτων ανώτατου επιπέδου, ο πιο χρήσιμος από τους οποίους είναι Χώρος ονομάτων της Microsoft.

Απαντώντας στο ερώτημα τι είναι η χρήση namespace std, πρώτα απ 'όλα, πρέπει να σημειωθεί ότι μεταφρασμένος από τα αγγλικά ο όρος που περιγράφεται σημαίνει ένα διάστημα ονόματος, το οποίο είναι το πεδίο εφαρμογής της δήλωσης, που είναι απαραίτητο για τον καθορισμό διαφόρων μορφών αναγνώρισης: συναρτήσεις και εξαρτημένες/ανεξάρτητες μεταβλητές.

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

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

Για αυτό είναι εξαιρετικά σημαντικόώστε το αντικείμενο να περιέχει την πλήρη μορφή του ονόματος χρησιμοποιώντας το namespace std. Αυτό είναι σημαντικό για να κατανοήσετε οπτικά πώς φαίνεται η δήλωση όταν τοποθετείται στο όνομα του διαστήματος.

Η εικόνα δείχνει διάφορες παραλλαγές πρόσβασης σε κωδικοποιήσεις, που βρίσκεται εντός και εκτός των περιφράξεων του:

1 Έτσι φαίνεται πλήρες όνομα:

2 Προκειμένου να συμπληρωθεί μια υπάρχουσα διαφήμιση, προσθέστε χρησιμοποιώντας:

3 Για να προσθέσετε όλα τα υπάρχοντα αναγνωριστικά, χρησιμοποιήστε την κατάλληλη οδηγία:

Χρήση της Οδηγίας

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

Δεν χρειάζεται να προσδιορίσετε έναν προσδιορισμό.

Πρέπει να χρησιμοποιήσετε τη χρήση σε αρχείο μορφής cpp.Ωστόσο, μια σημαντική προϋπόθεση είναι η παρουσία πολλών αναγνωριστικών.

Στην περίπτωση που υπάρχουν μόνο μερικά ονόματα, η δημιουργία ενός συνηθισμένου ονόματος θα είναι σχετική.

Στη συνέχεια, μπορείτε να προσθέσετε μόνο τα απαραίτητα αναγνωριστικά και να αφήσετε τα υπόλοιπα ήσυχα.

Είναι σημαντικό να σημειωθεί ότι εάν το όνομα της τοπικής μεταβλητής και της κύριας συμπίπτουν, τότε σε αυτήν την περίπτωση η πρώτη θα είναι σε κρυφή πρόσβαση.

Λάβετε υπόψη ότι η δημιουργία μεταβλητών με το ίδιο όνομα είναι παράνομη.

Συμβουλή!Για ευκολία στη χρήση, η οδηγία χρήσης μπορεί να βρίσκεται στο επάνω μέρος του αρχείου μορφής cpp. ή αντίστροφα, να τοποθετηθεί μέσα στη δημιουργημένη βιβλιοθήκη.

Για να εξασφαλίσετε τις πιο άνετες συνθήκες εργασίας για τον εαυτό σας, μπορείτε να εργαστείτε για την τοποθέτηση των απαραίτητων αρχείων.

Εκτός εάν είναι απολύτως απαραίτητο, δεν θα πρέπει να τοποθετηθεί η οδηγία χρήσης σε κεφαλίδες σε αρχείο μορφής H.

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

Για αρχεία, η καλύτερη λύση είναι να χρησιμοποιήσετε το πλήρες όνομα.

Σε περίπτωση που αποδειχθεί ότι είναι πολύ μεγάλα, μπορείτε να χρησιμοποιήσετε συντομογραφίες με τη μορφή ψευδωνύμων.

Δηλώσεις χώρου ονομάτων

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

Για να καταλάβετε για ποιες ενέργειες μιλάμε, αξίζει δείτε την παρακάτω εικόνα:

Για να υλοποιήσετε τη συνάρτηση contosodata μορφής cpp., είναι επίσης σημαντικό να χρησιμοποιήσετε το πλήρες όνομα στη θήκη όταν η οδηγία βρίσκεται στην αρχή:

Χρήση χώρου ονομάτων std. μπορεί να περιέχει διαφημίσεις σε πολλές ενότητες ταυτόχρονα που βρίσκονται στο ίδιο αρχείο.

Λόγω του μεταγλωττιστή, όλα τα στοιχεία συνδυάζονται κατά την επεξεργασία των δεδομένων.

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

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

Όσο για τον ορισμό, πρέπει να έρθει μετά τη δήλωση στον χώρο ονομάτων όπου δημιουργείται.

Ως οπτικό παράδειγμα, δώστε προσοχή στην παρακάτω εικόνα:

Τις περισσότερες φορές, αυτό το σφάλμα εμφανίζεται όταν παραβιάζεται η σειρά ορισμού ή τα συστατικά μέρη του πλήρους ονόματος περιλαμβάνονται αμέσως στα διαθέσιμα αντικείμενα.

Όταν τα cookies δεν δηλώνονται σε συγκεκριμένο χώρο ονομάτων, ανήκει τυπικά στον χώρο του παγκόσμιου τύπου.

Συμβουλή!Εκτός εάν είναι απολύτως απαραίτητο, συνιστάται η αποφυγή συμπερίληψης μελών στον χώρο καθολικού τύπου.

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

Για να δημιουργήσετε ένα καθολικό αναγνωριστικό τύπου, πρέπει να χρησιμοποιήσετε την αντίστοιχη λειτουργία ορατότητας, με τη μορφή πλήρους ονόματος.

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

Αυτό θα σας βοηθήσει να κατανοήσετε τον κώδικα.

Space std.

Αξίζει να σημειωθεί ότι οι χώροι μπορούν να είναι ένθετου τύπου.

Αν εννοείται μια συνηθισμένη ενσωμάτωση, τότε έχει απεριόριστο χαρακτήρα σε ολόκληρο τον χώρο.

Μιλώντας για μέλη γονέων, δεν έχουν τέτοια λειτουργία.

Για επέκταση, απαιτούνται ενσωματωμένα προσαρτήματα.

Για ακριβέστερο ορισμό και κατανόηση, δώστε προσοχή στην παρακάτω εικόνα:

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

Οι συγκρίσεις είναι συνηθισμένα συνημμένα τυπικού τύπου, ενσωματωμένα μέλη του χώρου γονικού ονόματος.

Ως αποτέλεσμα, μπορείτε να χρησιμοποιήσετε την αναζήτηση για συναρτήσεις που έχουν κάποιο είδος υπερφόρτωσης, όπου θα υπάρχει εξάρτηση των ορισμάτων.

Για να δείτε ένα παράδειγμα για το πώς γίνεται το δέσιμο, Αξίζει να αναφερθούμε στο παρακάτω παράδειγμα:

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

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

Είναι δυνατή η δημιουργία ενός, μονογονικού χώρου και η ενθυλάκωση κάθε διεπαφής που παρουσιάζεται.

Ωστόσο, πρέπει να έχει τη μορφή συνημμένου στον κοινόχρηστο γονικό χώρο.

Στη συνέχεια, ο κωδικός πελάτη εκχωρείται αυτόματα στον νέο συνδυασμό.

Οι χρήστες που έχουν συνηθίσει να χρησιμοποιούν την παλιά έκδοση μπορούν να συνεχίσουν να τη χρησιμοποιούν χωρίς προβλήματα.

Για να το κάνετε αυτό, πρέπει να δημιουργήσετε την πλήρη διαδρομή προς το συνημμένο.

Για να οργανώσετε την πρώτη ανακοίνωση, πρέπει να χρησιμοποιήσετε ένα ενσωματωμένο κλειδί.

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

Για να οπτικοποιήσετε τη διαδικασία Ας προχωρήσουμε στην παρακάτω εικόνα:

Όλα τα ονόματα πρέπει να είναι εξαιρετικά μοναδικά, επομένως το μήκος τους αυξάνεται σημαντικά.

Ωστόσο, δεν είναι δυνατή η χρήση μιας οδηγίας χρήσης εδώ.

Είναι δυνατή μόνο η δημιουργία ενός ψευδώνυμου για έναν χώρο ονομάτων.

Σε αυτή την περίπτωση, εξετάστε το ακόλουθο παράδειγμα:

Είναι επίσης δυνατό να δημιουργηθεί ένας συνηθισμένος χώρος, αλλά δεν του εκχωρείται ψευδώνυμο.

Ένα τέτοιο εδαφικό φάσμα ονομάζεται ανώνυμο.

Κατά κανόνα, χρησιμοποιείται σε περιπτώσεις όπου τα μέλη στη δήλωση πρέπει να είναι αόρατα για κωδικοποίηση σε άλλα αντικείμενα.

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

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

Συνήθως, η χρήση γνώσεων απαιτείται για όσους εργάζονται σε Visual C++.

Χρησιμοποιώντας παραδείγματα υψηλής ποιότητας, θα είναι πολύ πιο εύκολο να κατανοήσετε αυτό το θέμα.

Ας υποθέσουμε ότι θέλουμε να μοιραστούμε την τάξη Array μας, που αναπτύχθηκε στα προηγούμενα παραδείγματα. Ωστόσο, δεν ήμασταν οι μόνοι που αντιμετωπίσαμε αυτό το πρόβλημα. Ίσως κάποιος κάπου, ας πούμε, σε ένα από τα τμήματα της Intel, δημιούργησε μια τάξη με το ίδιο όνομα. Επειδή τα ονόματα αυτών των κλάσεων είναι τα ίδια, οι πιθανοί χρήστες δεν μπορούν να χρησιμοποιήσουν και τις δύο κλάσεις ταυτόχρονα· πρέπει να επιλέξουν μία από αυτές. Αυτό το πρόβλημα επιλύεται προσθέτοντας στο όνομα της κλάσης κάποια συμβολοσειρά που προσδιορίζει τους προγραμματιστές της, ας πούμε,

Κλάση Cplusplus_Primer_Third_Edition_Array (...);

Φυσικά, και αυτό δεν εγγυάται τη μοναδικότητα του ονόματος, αλλά πιθανότατα θα σώσει τον χρήστη από αυτό το πρόβλημα. Πόσο άβολο είναι, όμως, να χρησιμοποιούνται τόσο μεγάλα ονόματα!
Το πρότυπο C++ προσφέρει έναν μηχανισμό για την επίλυση του προβλήματος αντιστοίχισης ονόματος που ονομάζεται χώρο ονομάτων. Κάθε κατασκευαστής λογισμικού μπορεί να τυλίξει τις κλάσεις, τις λειτουργίες και άλλα αντικείμενα στον δικό του χώρο ονομάτων. Για παράδειγμα, η δήλωση της κλάσης Array είναι η εξής:

Χώρος ονομάτων Cplusplus_Primer_3E (πρότυπο class Array(...); )

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

Χώρος ονομάτων IBM_Canada_Laboratory ( πρότυπο class Array(...);
class Matrix(...);
}
χώρος ονομάτων Disney_Feature_Animation (
class Point(...);
πρότυπο class Array(...);
}

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

Cplusplus_Primer_3E::Πίνακας κείμενο; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Point origin(5000,5000);

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

// ψευδώνυμα namespace LIB = IBM_Canada_Laboratory; namespace DFA = Disney_Feature_Animation;
int main()
{
LIB::Πίνακας ia (1024);
}

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

Χώρος ονομάτων LIB = Cplusplus_Primer_3E; int main() ( LIB::Array ia (1024); )

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

Χώρος ονομάτων LIB = Disney_Feature_Animation;
int main()
{
LIB::Πίνακας ia (1024);
}

Ένας ακόμη πιο βολικός τρόπος είναι η χρήση ενός απλού, ακατάλληλου ονόματος για αναφορά σε αντικείμενα που ορίζονται σε κάποιο χώρο ονομάτων. Υπάρχει μια οδηγία χρήσης για αυτό:
#include "IBM_Canada_Laboratory.h"

Χρήση χώρου ονομάτων IBM_Canada_Laboratory.
int main()
{
Matrix mat(4,4);
// IBM_Canada_Laboratory::Array
Πίνακας ia (1024);
// ...
}

Ο χώρος ονομάτων IBM_Canada_Laboratory γίνεται ορατός στο πρόγραμμα. Μπορείτε να κάνετε ορατό όχι ολόκληρο τον χώρο, αλλά μεμονωμένα ονόματα μέσα σε αυτόν (επιλεκτικά χρησιμοποιώντας οδηγία):

#include "IBM_Canada_Laboratory.h" χρησιμοποιώντας χώρο ονομάτων IBM_Canada_Laboratory::Matrix;
// μόνο το Matrix γίνεται ορατό
int main()
{
// IBM_Canada_Laboratory::Matrix
Matrix mat(4,4); // Σφάλμα: IBM_Canada_Laboratory::Ο πίνακας είναι αόρατος
Πίνακας ia (1024);
// ... }

Όπως αναφέραμε ήδη, όλα τα στοιχεία της τυπικής βιβλιοθήκης C++ δηλώνονται μέσα στον χώρο ονομάτων std. Επομένως, η απλή συμπερίληψη ενός αρχείου κεφαλίδας δεν αρκεί για την άμεση χρήση τυπικών συναρτήσεων και κλάσεων:

#περιλαμβάνω // σφάλμα: η συμβολοσειρά είναι αόρατη

Πρέπει να χρησιμοποιήσετε την οδηγία χρήσης:

#περιλαμβάνω χρησιμοποιώντας namespace std? // Εντάξει: βλέπε συμβολοσειρά
string current_chapter = "C++ Review";

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

#περιλαμβάνω // correct: αναγνωρισμένο όνομα std::string current_chapter = "Επισκόπηση C++"; ή μια επιλεκτική οδηγία χρησιμοποιώντας: #include χρησιμοποιώντας namespace std::string; // Εντάξει: ορατή συμβολοσειρά
string current_chapter = "C++ Review";

Συνιστούμε να χρησιμοποιήσετε την τελευταία μέθοδο.
Στα περισσότερα από τα παραδείγματα αυτού του βιβλίου, οι οδηγίες για τον χώρο ονομάτων έχουν παραληφθεί. Αυτό γίνεται για να μειωθεί το μέγεθος του κώδικα και επίσης επειδή τα περισσότερα από τα παραδείγματα συντάχθηκαν με έναν μεταγλωττιστή που δεν υποστηρίζει χώρους ονομάτων - μια πρόσφατη καινοτομία στη C++. (Λεπτομέρειες σχετικά με τη χρήση δηλώσεων κατά την εργασία με την Πρότυπη Βιβλιοθήκη C++ αναλύονται στην Ενότητα 8.6.)
Στα επόμενα κεφάλαια, θα δημιουργήσουμε τέσσερις ακόμη κλάσεις: String, Stack, List και μια τροποποίηση του Stack. Όλα θα περικλείονται σε έναν χώρο ονομάτων - Cplusplus_Primer_3E. (Συζητούμε την εργασία με χώρους ονομάτων με περισσότερες λεπτομέρειες στο Κεφάλαιο 8.)

Άσκηση 2.21

Δόθηκε ο χώρος ονομάτων

Άσκηση χώρου ονομάτων (πρότυπο class Array(...);
πρότυπο
void print (Πίνακας< EType >);
κλάση String (...)
πρότυπο
Κατάλογος κλάσεων(...);
}

και το κείμενο του προγράμματος:

Int main() ( const int size = 1024, Array δικαστήριο); Λίστα il(μέγεθος);
// ...
Πίνακας *pas = νέος πίνακας (όπως και);
Λίστα *pil = νέα λίστα (il);
print(*pas);
}

Το πρόγραμμα δεν μεταγλωττίζεται επειδή οι δηλώσεις των κλάσεων που χρησιμοποιούνται περικλείονται στον χώρο ονομάτων της άσκησης. Τροποποιήστε τον κώδικα του προγράμματος χρησιμοποιώντας
(α) αναγνωρισμένα ονόματα
β) επιλεκτική χρήση της οδηγίας
(γ) μηχανισμός ψευδωνύμου
δ) με χρήση οδηγίας

Σχόλιο: Αυτή η ενότητα περιγράφει τη χρήση και τη δήλωση χώρων ονομάτων. Δίνονται τα κύρια χαρακτηριστικά των RDF, XML-Data, Document Content Description (DCD), Schema for Object-Oriented XML (SOX), Document Definition Markup Language (DDML, παλαιότερα γνωστή ως XSchema).

Περιγράψαμε προηγουμένως μερικά από τα μειονεκτήματα των ορισμών DTD, τα οποία σχετίζονται:

  1. η σύνταξη αυτών των ορισμών διαφέρει από τη σύνταξη της XML (συγκεκριμένα, το λεγόμενο εκτεταμένο Μορφή Backus-Naur, Extended Backus Naur Form);
  2. Αυτοί οι ορισμοί δεν είναι αρκετά εκφραστικοί.
  3. Δεδομένου ότι κάθε χρήστης μπορεί να δημιουργήσει τις δικές του ετικέτες, είναι πολύ πιθανό οι άνθρωποι να χρησιμοποιούν τα ίδια ονόματα στοιχείων για να αναφέρονται σε διαφορετικά πράγματα. Ακόμη και αν οι έννοιες των στοιχείων είναι οι ίδιες, το πιθανό περιεχόμενό τους μπορεί να ποικίλλει ανάλογα με τον ορισμό. Χρειαζόμαστε λοιπόν έναν τρόπο για να ορίσουμε συγκεκριμένες χρήσεις ενός στοιχείου, ειδικά αν συνδυάζουμε διαφορετικά είδη λεξιλογίων στο ίδιο έγγραφο. Για την αντιμετώπιση του προβλήματος, το W3C κυκλοφόρησε μια προδιαγραφή που ονομάζεται XML Namespaces, η οποία σας επιτρέπει να ορίσετε το περιβάλλον ενός στοιχείου σε έναν χώρο ονομάτων.
  4. Υπάρχουν περιπτώσεις όπου είναι απαραίτητο να συνδυαστούν έγγραφα XML από διαφορετικές πηγές που αντιστοιχούν σε διαφορετικούς ορισμούς DTD. Για παράδειγμα, αυτή η κατάσταση προκύπτει όταν περιγράφεται ένας μεγάλος όγκος πληροφοριών, εάν μεμονωμένα DTD δεν επαρκούν για να καλύψουν ολόκληρο τον τόμο ή είναι δύσκολο να κατανοηθούν. Συμβαίνει επίσης σε συστήματα ηλεκτρονικού εμπορίου όταν προσπαθείτε να συνδυάσετε τα δεδομένα του επιχειρηματικού σας συνεργάτη με τα δικά σας. Μπορεί επίσης να προκύψει μια κατάσταση όταν χρειάζεται απλώς να προσθέσετε τις ρυθμίσεις σας σε ένα υπάρχον DTD για να ανταλλάξετε ορισμένες πληροφορίες σε τυπική μορφή. Δυστυχώς, η σύσταση XML δεν παρέχει έναν τρόπο συνδυασμού πολλαπλών DTD σε ένα μόνο έγγραφο χωρίς να τις τροποποιήσετε ή να δημιουργήσετε ένα νέο DTD (χρησιμοποιώντας εξωτερικές αναφορές).

Αυτό το κεφάλαιο καλύπτει τις ακόλουθες δύο έννοιες - χώρο ονομάτωνκαι σχήματα XML. Οι χώροι ονομάτων επιτρέπουν στους προγραμματιστές XML να σπάσουν ένα περίπλοκο πρόβλημα σε μικρά κομμάτια και να συνδυάσουν πολλά λεξιλόγια σε ένα μόνο έγγραφο για να το περιγράψουν πλήρως. Χρησιμοποιώντας σχήματα, οι σχεδιαστές λεξικών δημιουργούν ακριβέστερους ορισμούς από ό,τι ήταν δυνατό στα DTD, και το κάνουν χρησιμοποιώντας σύνταξη XML.

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

  • Καλύτερη οργάνωση λεξιλογίων για την επίλυση σύνθετων προβλημάτων.
  • Διατήρηση δυνατή πληκτρολόγησηδεδομένα κατά τη διάρκεια μετασχηματισμών προς και από XML·
  • Περιγράψτε τα λεξιλόγια με μεγαλύτερη ακρίβεια και ευελιξία από ό,τι ήταν δυνατό με το DTD.
  • Διαβάστε τους κανόνες λεξικού σε XML, αποκτώντας πρόσβαση στους ορισμούς του χωρίς να περιπλέκετε τον αναλυτή.

Ανάμειξη λεξικών

Όταν σχεδιάζετε ένα λεξικό, μπορεί να είναι λογικό να χωρίσετε το παγκόσμιο πρόβλημα σε διάφορα συστατικά μέρη. Αυτό απαιτεί τρόπους τμηματοποίησης ενός μεγάλου προβλήματος σε πολλά λεξιλόγια. Ωστόσο, το πραγματικό πρόβλημα που πρέπει να επιλυθεί είναι η συγχώνευση χωριστών DTD στο σώμα ενός ενιαίου εγγράφου. Αυτό το πρόβλημα μπορεί επίσης να προκύψει εάν, για παράδειγμα, εργάζεστε για μια εταιρεία στην οποία πιθανότατα υπάρχει ήδη ένα σύνολο ορισμών DTD και η χρήση τους μπορεί να διευκολύνει πολύ την εργασία, επειδή περιγράφουν το πρόβλημα όπως το κατανοούν οι άλλοι. Συχνά είναι επίσης χρήσιμο να επαναχρησιμοποιούνται ορισμοί DTD, π.χ. Χρησιμοποιώντας κοινές κατασκευές από ορισμούς DTD που δημιουργήθηκαν προηγουμένως. Εάν αναπτύσσετε μια εφαρμογή που χρειάζεται να επικοινωνεί με το λογισμικό ενός εξωτερικού συνεργάτη, δεν έχετε άλλη επιλογή από το να επαναχρησιμοποιήσετε υπάρχουσες έννοιες. Οι υπάρχοντες ορισμοί του DTD αποτελούν μια κοινή γλώσσα που πρέπει να ομιλείται για να γίνει κατανοητός. Εάν μια έννοια υπάρχει ήδη, πρέπει να εργαστεί κανείς για να γίνει κατανοητή με όρους αυτής της έννοιας.

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

Το πρόβλημα επιδεινώνεται περαιτέρω όταν χρησιμοποιούνται στιγμιότυπα ονομάτων από πολλά DTD. Σε αυτήν την περίπτωση, δεν γνωρίζουμε ποιο στοιχείο, σε ποιον ορισμό του DTD αναφέρεται, αυτό το πρόβλημα των καλοσχηματισμένων εγγράφων ονομάζεται αμφισημία. Επιπλέον, εάν απαιτούν τα ονόματα από το έγγραφο ελέγχους εγκυρότητας, μπορούμε να κάνουμε την εφαρμογή μας πολύ μπερδεμένη. Αυτό το πρόβλημα ονομάζεται σύγκρουση ονόματος.

Χώροι ονομάτων

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

  • Συνδυάστε έγγραφα από δύο ή περισσότερες πηγές χωρίς να χάσετε την εμπιστοσύνη ότι το πρόγραμμα θα διακρίνει από ποια πηγή έχει ληφθεί ένα στοιχείο ή χαρακτηριστικό.
  • Εάν είναι δυνατόν, επιτρέψτε στον παράγοντα χρήστη πρόσβαση σε περαιτέρω υλικό, όπως ορισμό τύπου εγγράφου (DTD) ή άλλη περιγραφή στοιχείων και χαρακτηριστικών.

Ένας χώρος ονομάτων είναι μια συλλογή ορισμένων τιμών ή χαρακτηριστικών που μπορούν να χρησιμοποιηθούν σε έγγραφα XML ως ονόματα στοιχείων ή χαρακτηριστικών. Οι χώροι ονομάτων στο XML ορίζονται από ένα Uniform Resource Identifier (URI) (μπορείτε να χρησιμοποιήσετε τη διεύθυνση DTD στον διακομιστή σας ως URI). Επιτρέπει σε κάθε χώρο ονομάτων να είναι μοναδικός.

Έτσι, για να χρησιμοποιήσουμε αποτελεσματικά τους χώρους ονομάτων σε ένα έγγραφο που συνδυάζει στοιχεία από διαφορετικές πηγές, πρέπει να ορίσουμε:

  • Μια αναφορά σε ένα URI που περιγράφει τη χρήση του στοιχείου.
  • Ένα ψευδώνυμο που μας επιτρέπει να καταλάβουμε από ποιον χώρο ονομάτων προέρχεται το στοιχείο μας. Αυτό το ψευδώνυμο έχει τη μορφή προθέματος στοιχείου (για παράδειγμα, εάν το ψευδώνυμο για ένα σκοτεινό στοιχείο Βιβλίου είναι κατάλογος, τότε το στοιχείο θα ονομάζεται ).

Χρήση και δήλωση χώρων ονομάτων

Δήλωση χώρου ονομάτων

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

Επειδή θέλουμε όλοι να μπορούν να αναγνωρίζουν μια δήλωση χώρου ονομάτων όταν τη βλέπουμε, επιφυλάσσουμε μια ειδική λέξη για αυτήν. Σύμφωνα με τη σύσταση χώρων ονομάτων, η λέξη είναι xmlns. Η τιμή του χαρακτηριστικού είναι ένα URI που καθορίζει τον χώρο ονομάτων που θα χρησιμοποιηθεί. Αυτή είναι συχνά η διεύθυνση URL ορισμού DTD, αλλά δεν χρειάζεται να είναι πάντα έτσι. Το πρόθεμα και το αναγνωριστικό χώρου ονομάτων ορίζονται από το χαρακτηριστικό xmlns ως εξής:

Όπως μπορείτε να δείτε, το πρόθεμα ntb έχει μόλις οριστεί, αλλά μπορεί ήδη να χρησιμοποιηθεί στο όνομα ntb: notebook . Στο μέλλον, τα ονόματα των ετικετών και των χαρακτηριστικών που θέλουμε να αντιστοιχίσουμε στον χώρο ονομάτων http://some.firm.com/2003/ntbml έχουν το πρόθεμα ntb, για παράδειγμα:

Γκορέλοβο

Επιπλέον, μπορούν να εμφανίζονται πολλοί χώροι ονομάτων σε μία ετικέτα. Παρακάτω είναι ένα παράδειγμα μίξης πολλών χώρων ονομάτων:

Το στοιχείο βιβλίου προέρχεται από τον χώρο ονομάτων του καταλόγου και το χαρακτηριστικό ISBN προέρχεται από την παραγγελία .

Όνομα μαζί με ένα πρόθεμα, για παράδειγμα

ονομάζεται εκτεταμένο, αναγνωρισμένο ή αναγνωρισμένο όνομα (OName. Qualified Name). Το τμήμα του ονόματος που γράφεται μετά την άνω τελεία ονομάζεται τοπικό τμήμα του ονόματος.

Η ονοματολογία των ονομάτων πόρων Ιστού μπορεί να προκαλέσει σύγχυση. Ενιαίος Εντοπιστής Πόρων ( Uniform Resource Locator, URL) υποδεικνύει έναν πόρο όσον αφορά το πρωτόκολλο πρόσβασης και τη θέση δικτύου. Ενιαίο αναγνωριστικό πόρου ( Uniform Resource Identifier, URI) είναι ένα μοναδικό όνομα για κάποιον πόρο. Κοιτάξτε ένα URI απλώς ως μια μοναδική συμβολοσειρά χαρακτήρων που προσδιορίζει έναν χώρο ονομάτων.

Σύμφωνα με τους κανόνες του SGML και του XML, μια άνω και κάτω τελεία μπορεί να χρησιμοποιηθεί σε ονόματα ως συνηθισμένος χαρακτήρας, επομένως ένα όνομα με πρόθεμα είναι απλώς ένα τέχνασμα· κάθε πρόγραμμα που δεν «γνωρίζει» τον χώρο ονομάτων, αναλύοντας το έγγραφο, αντιμετωπίζει το χαρακτηρισμένο όνομα ως συνηθισμένο όνομα. Συνάγεται, ειδικότερα, ότι στο δήλωση τύπου εγγράφουΤα προθέματα ονόματος (Δήλωση τύπου εγγράφου) δεν μπορούν να παραληφθούν.

Το χαρακτηριστικό xmlns μπορεί να εμφανιστεί σε οποιοδήποτε στοιχείο XML, όχι μόνο στο ριζικό στοιχείο. Το πρόθεμα που ορίζει μπορεί να χρησιμοποιηθεί στο στοιχείο στο οποίο είναι γραμμένο το χαρακτηριστικό xmlns και σε όλα τα στοιχεία που είναι ένθετα μέσα σε αυτό. Επιπλέον, μπορούν να οριστούν πολλαπλοί χώροι ονομάτων σε ένα στοιχείο.

Στα ένθετα στοιχεία, ο χώρος ονομάτων μπορεί να παρακαμφθεί συσχετίζοντας το πρόθεμα με ένα διαφορετικό αναγνωριστικό.

Η εμφάνιση ενός ονόματος ετικέτας χωρίς πρόθεμα σε ένα έγγραφο που χρησιμοποιεί χώρο ονομάτων σημαίνει ότι το όνομα ανήκει στον προεπιλεγμένο χώρο ονομάτων.

Ένα καλά σχεδιασμένο έγγραφο θα πρέπει να χρησιμοποιεί χώρους ονομάτων για όλα τα στοιχεία του.

Τα προθέματα που ξεκινούν με χαρακτήρες xml σε κάθε περίπτωση δεσμεύονται για την ίδια τη γλώσσα XML. Το πρόθεμα xmlns χρησιμοποιείται για να συσχετίσει ένα άλλο, καθορισμένο, πρόθεμα με το αναγνωριστικό του χώρου ονομάτων του. Το πρόθεμα xmlns δεν χρειάζεται να καθοριστεί, εισάγεται από τη σύσταση "Χώροι ονομάτων σε XML" και συσχετίζεται εκεί με το αναγνωριστικό χώρου ονομάτων http://www.w3.ori/2000 /xmlns/.

Ένα άλλο πρόθεμα, το xml, συσχετίζεται στην ίδια πρόταση με το αναγνωριστικό http://www.w3.org/XML/1998/namespace. Επίσης, δεν χρειάζεται να οριστεί στο έγγραφο XML. Κανένα άλλο πρόθεμα δεν μπορεί να συσχετιστεί με αυτά τα αναγνωριστικά. διατηρήστε τις εντολές για να διατηρήσετε ανέπαφους χαρακτήρες κενού διαστήματος. Αυτό είναι σημαντικό για ορισμένα κείμενα, όπως κωδικούς προγραμμάτων. Η προεπιλεγμένη τιμή αφήνει το κενό διάστημα στη διακριτική ευχέρεια του χειριστή.

Πεδίο εφαρμογής

Οι δηλώσεις χώρου ονομάτων έχουν ένα πεδίο εφαρμογής, όπως ακριβώς οι δηλώσεις μεταβλητών στις γλώσσες προγραμματισμού. Αυτό είναι σημαντικό επειδή οι χώροι ονομάτων δεν δηλώνονται πάντα στην αρχή ενός εγγράφου XML, μερικές φορές δηλώνονται σε επόμενες ενότητες. Μια δήλωση χώρου ονομάτων ισχύει για το στοιχείο στο οποίο εμφανίζεται, καθώς και για τους απογόνους αυτού του στοιχείου, ακόμα κι αν δεν ορίζεται ρητά εκεί. Ένα όνομα μπορεί να αναφέρεται σε έναν χώρο ονομάτων μόνο εάν χρησιμοποιείται εντός του πεδίου εφαρμογής της δήλωσής του.

Ωστόσο, θα χρειαστεί επίσης να συνδυάσουμε πεδία ονομάτων σε στοιχεία που διαφορετικά θα κληρονομούσαν άλλους χώρους ονομάτων. Από αυτή την άποψη, ορίζονται δύο τρόποι δήλωσης πεδίου εφαρμογής: προεπιλογή και ειδική.

Προεπιλεγμένο εύρος

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

Για να κάνετε έναν χώρο ονομάτων τον προεπιλεγμένο χώρο ονομάτων για ένα πεδίο, απλώς παραλείψτε τη δήλωση του προθέματος.

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

Ειδικό Πεδίο

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

Θα βοηθήσει.
Η διαδρομή προς την υποστήριξη χώρου ονομάτων στην PHP ήταν δύσκολη. Αλλά ευτυχώς προστέθηκε στη γλώσσα στην PHP 5.3 και η δομή του κώδικα PHP έχει βελτιωθεί σημαντικά από τότε. Πώς ακριβώς όμως πρέπει να τα χρησιμοποιούμε;

Τι είναι οι χώροι ονομάτων;

"Μην ξεχνάτε την ανάστροφη κάθετο όταν αποθηκεύετε το όνομα του χώρου ονομάτων ως συμβολοσειρά!"

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

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

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

Τα χρησιμοποιείς!

Είναι σημαντικό να κατανοήσετε ότι χρησιμοποιείτε έμμεσα χώρους ονομάτων. Από την PHP 5.3, όλοι οι ορισμοί που δεν έχουν ήδη δηλωθεί σε χώρους ονομάτων που ορίζονται από το χρήστη εμπίπτουν στον καθολικό χώρο ονομάτων.

Ο καθολικός χώρος ονομάτων αποθηκεύει επίσης όλους τους εσωτερικούς ορισμούς της PHP, όπως mysqli_connect() και την κλάση Exception. Επειδή ο καθολικός χώρος ονομάτων δεν έχει μοναδικό αναγνωριστικό όνομα, συνήθως αναφέρεται ως παγκόσμιος χώρος ονομάτων.

Λάβετε υπόψη ότι η χρήση χώρου ονομάτων είναι προαιρετική.
Το σενάριο PHP σας θα λειτουργεί καλά χωρίς αυτά και αυτή η συμπεριφορά δεν θα αλλάξει πολύ σύντομα.

Ορισμός χώρου ονομάτων

Το αρχείο που περιέχει τον χώρο ονομάτων πρέπει να περιέχει τη δήλωσή του στην αρχή πριν από οποιονδήποτε άλλο κώδικα. Το μόνο πράγμα που μπορεί να δηλωθεί πριν από έναν χώρο ονομάτων είναι η δεσμευμένη λέξη declare, η έκφραση δήλωση μπορεί να εμφανιστεί πριν από μια δήλωση χώρου ονομάτων για να υποδείξει την κωδικοποίηση του αρχείου.

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

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

Μπορείτε να χρησιμοποιήσετε πολλούς χώρους ονομάτων σε ένα αρχείο.

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

Οι χώροι ονομάτων χρησιμοποιούνται για την αποφυγή ασυνεπών ορισμών και την εισαγωγή μεγαλύτερης ευελιξίας και οργάνωσης στον κώδικα του προγράμματος.

Σημειώστε ότι τα σγουρά σιδεράκια είναι εντελώς προαιρετικά. Στην πραγματικότητα, η χρήση του κανόνα ενός namespace ανά αρχείο και η παράλειψη των αγκύλων καθιστά τον κώδικά σας πολύ πιο καθαρό - δεν χρειάζεται να κάνετε εσοχή ένθετου κώδικα.

Υποχώροι ονομάτων

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

Για ευελιξία, είναι συνετό να αποθηκεύονται ένθετοι χώροι ονομάτων σε υποκαταλόγους. Αυτό βοηθά στη δομή του έργου και το καθιστά πολύ πιο εύκολο στη χρήση για συσκευές αυτόματης φόρτωσης που ακολουθούν το πρότυπο PSR-4.

Η PHP χρησιμοποιεί ανάστροφη κάθετο ως διαχωριστικό χώρου ονομάτων.

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

// myproject/database/connection.phpΜπορείτε να χρησιμοποιήσετε όσους ένθετους χώρους ονομάτων θέλετε.

Ο ορισμός ενός χώρου υποονομάτων με ένθετα μπλοκ κώδικα δεν υποστηρίζεται. Το ακόλουθο παράδειγμα θα επιστρέψει ένα μοιραίο σφάλμα: "Οι δηλώσεις χώρου ονομάτων δεν μπορούν να ενσωματωθούν."

Κλήση κωδικού από χώρο ονομάτων

Εάν θέλετε να δημιουργήσετε μια νέα παρουσία ενός αντικειμένου, να καλέσετε μια συνάρτηση ή να χρησιμοποιήσετε σταθερές από διαφορετικούς χώρους ονομάτων, χρησιμοποιείτε μια ανάστροφη κάθετο. Υπάρχουν τρεις τύποι ορισμών ονομάτων χώρου ονομάτων:
  • Όνομα χωρίς επιφύλαξη
  • Πιστοποιημένο όνομα
  • Πλήρως αναγνωρισμένο όνομα

Ατελές όνομα

Αυτό είναι το όνομα μιας κλάσης, μιας συνάρτησης ή μιας σταθεράς και δεν περιλαμβάνει αναφορά σε κανένα χώρο ονομάτων. Για όσους μόλις αρχίζουν να εργάζονται με χώρους ονομάτων, αυτή είναι μια κοινή άποψη.

Πλήρες όνομα

Αυτός είναι ο τρόπος με τον οποίο έχουμε πρόσβαση στην ιεραρχία του subnamespace. χωρίζεται με ανάστροφη κάθετο.

Το παρακάτω παράδειγμα θα επιστρέψει ένα μοιραίο σφάλμα: "Μοιραίο σφάλμα: Η κλάση "MyProject\Database\MyProject\FileAccess\Input" δεν βρέθηκε" επειδή το MyProject\FileAccess\Input δεν σχετίζεται με τον χώρο ονομάτων στον οποίο βρίσκεστε.

Απόλυτο όνομα

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

Εάν θέλετε να αποκτήσετε πρόσβαση σε μια συνάρτηση, μια κλάση ή μια σταθερά που βρίσκεται σε υψηλότερο επίπεδο της ιεραρχίας, τότε πρέπει να χρησιμοποιήσετε το πλήρες όνομα - μια απόλυτη διαδρομή, όχι μια σχετική. Η κλήση πρέπει να ξεκινά με ανάστροφη κάθετο. Αυτό επιτρέπει στην PHP να γνωρίζει ότι αυτή η κλήση πρέπει να γίνει από το παγκόσμιο διάστημα, αντί να έχει πρόσβαση σε αυτό σε σχέση με την τρέχουσα τοποθεσία σας.

Δεν χρειάζεται να χρησιμοποιούμε το πλήρες όνομα για τις εσωτερικές συναρτήσεις της PHP. Τα ονόματα που δεν πληρούν τις προϋποθέσεις για συναρτήσεις και σταθερές θα οριστούν στον καθολικό χώρο ονομάτων εάν δεν ορίζονται στον τρέχοντα χώρο ονομάτων.

Γνωρίζοντας αυτό, μπορούμε πλέον να υπερφορτώνουμε τις εσωτερικές συναρτήσεις της PHP ενώ μπορούμε να καλέσουμε την αρχική συνάρτηση (ή σταθερά).

"; }

Δυναμικές κλήσεις

Η PHP είναι μια δυναμική γλώσσα προγραμματισμού. ώστε να μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία για να καλέσετε κώδικα από έναν χώρο ονομάτων. Αυτό είναι ουσιαστικά το ίδιο με τη χρήση ενός ονόματος δυναμικής κλάσης ή τη σύνδεση ενός δυναμικού αρχείου χρησιμοποιώντας μια μεταβλητή για την αποθήκευση του ονόματός του. Το διαχωριστικό ονομάτων PHP χρησιμοποιεί τους ίδιους μεταχαρακτήρες σε συμβολοσειρές. Μην ξεχνάτε την ανάστροφη κάθετο όταν αποθηκεύετε το όνομα του χώρου ονομάτων ως συμβολοσειρά!

λέξη-κλειδί χώρου ονομάτων

Η λέξη-κλειδί namespace δεν χρησιμοποιείται μόνο για τον καθορισμό ενός χώρου ονομάτων, αλλά μπορεί επίσης να χρησιμοποιηθεί για την πραγματοποίηση κλήσης στον τρέχοντα χώρο ονομάτων, λειτουργικά παρόμοια με τη λέξη-κλειδί self για κλάσεις.

__NAMESPACE__ σταθερά

Ακριβώς όπως η λέξη-κλειδί self δεν μπορεί να χρησιμοποιηθεί για τον ορισμό του ονόματος της τρέχουσας κλάσης, η λέξη-κλειδί χώρου ονομάτων δεν μπορεί να χρησιμοποιηθεί για τον τρέχοντα χώρο ονομάτων. Επομένως χρησιμοποιούμε τη σταθερά __NAMESPACE__

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

Εισαγάγετε ή δημιουργήστε ένα ψευδώνυμο

δεν απαιτείται να χρησιμοποιείται σε χώρους ονομάτων

Ένα σημαντικό χαρακτηριστικό των χώρων ονομάτων στην PHP είναι η δυνατότητα αναφοράς σε ένα εξωτερικό απόλυτο όνομα από ψευδώνυμο, ή εισαγωγής.

Οι εισαγωγές είναι μια πολύ χρήσιμη και θεμελιώδης πτυχή των χώρων ονομάτων. Αυτό σας δίνει τη δυνατότητα να χρησιμοποιείτε εξωτερικά πακέτα, όπως βιβλιοθήκες, χωρίς να ανησυχείτε για διενέξεις ονομάτων. Η εισαγωγή γίνεται χρησιμοποιώντας τη λέξη-κλειδί χρήση. Εάν θέλετε, μπορείτε να καθορίσετε ένα προσαρμοσμένο ψευδώνυμο χρησιμοποιώντας τη λέξη-κλειδί ως.

Χρήση ως

Πως να το χρησιμοποιήσεις

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

Μια εναλλακτική είναι να εκχωρήσετε ένα ψευδώνυμο με διαφορετικό όνομα

Μπορείτε επίσης να εισαγάγετε καθολικές κλάσεις όπως το Exception. Κατά την εισαγωγή, δεν χρειάζεται να γράψετε το απόλυτο όνομά του.

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

Αν και υπάρχει υποστήριξη για επίκληση δυναμικού χώρου ονομάτων, η δυναμική εισαγωγή δεν υποστηρίζεται.

συμπέρασμα

Οι χώροι ονομάτων χρησιμοποιούνται για να αποφευχθεί η σύγκρουση ορισμού και να εισαχθεί μεγαλύτερη ευελιξία και οργάνωση στον κώδικα του προγράμματος. Να θυμάστε ότι δεν απαιτείται να χρησιμοποιείτε χώρους ονομάτων. Αυτή η δυνατότητα χρησιμοποιείται σε συνδυασμό με μια αντικειμενοστραφή προσέγγιση. Ελπίζω να εξετάσετε το ενδεχόμενο να μεταφέρετε το (μελλοντικό) έργο PHP σας στο επόμενο επίπεδο χρησιμοποιώντας έναν χώρο ονομάτων.