Διαδρομές
/
C#
C#
/
Ασκήσεις
/
Σύστημα πιστοποίησης
Σύστημα πιστοποίησης

Σύστημα πιστοποίησης

Άσκηση εκμάθησης

Εισαγωγή

Σταθερές

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

private const int num = 1729;
public const string title = "Grand" + " Master";

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

private readonly int num;
private readonly System.Random rand = new System.Random();

public MyClass(int num)
{
    this.num = num;
}

Αμυντική αντιγραφή

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

Συλλογές μόνο για ανάγνωση

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

readonly List<int> ints = new List<int>();

void Foo()
{
    ints.Add(1);    // ok
    ints = new List<int>(); // fails to compile
}

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

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

  • Το ReadOnlyDictionary<T> εκθέτει ένα Dictionary<T> ως μόνο για ανάγνωση.
  • Το ReadOnlyCollection<T> εκθέτει μια List<T> ως μόνο για ανάγνωση.

Οδηγίες

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

1. Όρισε τα κατάλληλα πεδία και τις ιδιότητες ως const

Αυτή είναι μια εργασία refactoring. Πρόσθεσε τον τροποποιητή const σε όποια μέλη των Authenticator ή Identity κρίνεις κατάλληλα.

2. Όρισε τα κατάλληλα πεδία ως readonly

Αυτή είναι μια εργασία refactoring. Πρόσθεσε τον τροποποιητή readonly σε όποια πεδία της κλάσης Authenticator ή του struct Identity κρίνεις κατάλληλα.

3. Βεβαιώσου ότι η κλάση δε μπορεί να αλλάξει αφού δημιουργηθεί

Αφαίρεσε τον προσπελαστή set ή κάνε τον private σε όποια ιδιότητα της κλάσης Authenticator ή του struct Identity κρίνεις κατάλληλη.

4. Βεβαιώσου ότι ο διαχειριστής δε μπορεί να παραποιηθεί

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

5. Βεβαιώσου ότι οι προγραμματιστές δε μπορούν να παραποιηθούν

Προς το παρόν, το λεξικό που περιέχει τις καρφωτές ταυτότητες των προνομιούχων προγραμματιστών επιστρέφεται από μια κλήση στη GetDevelopers(). Αυτό δεν είναι ιδανικό, καθώς ο καλών μπορεί να τροποποιήσει το λεξικό. Βρες έναν τρόπο να εμποδίσεις τον καλούντα να τροποποιεί τα στοιχεία των προγραμματιστών στο αντικείμενο Authenticator.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
C# Exercism

Έτοιμος να ξεκινήσεις την άσκηση Σύστημα πιστοποίησης;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.