DedSec Project

dart — συγκεντρωτικός οδηγός — DedSec Project

dart — συγκεντρωτικός οδηγός Dart Βασική ιδέα Η Dart υποστηρίζει sound null safety και async προγραμματισμό για Flutter και command-line εφαρμογές. Μικρό εκπαιδευτικό απόσπασμα Άσκηση…

Dart

Βασική ιδέα

Η Dart υποστηρίζει sound null safety και async προγραμματισμό για Flutter και command-line εφαρμογές.

Μικρό εκπαιδευτικό απόσπασμα

void main() {
  final xs = [1, 2, 3];
  print(xs.reduce((a,b) => a + b));
}

Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά

Υπολόγισε άθροισμα και σύγκρινε reduce με fold σε κενή λίστα· έλεγξε nullable τιμή.

Διάγνωση και όρια

Τα Flutter widgets απαιτούν Flutter runtime· η Dart CLI δεν παρέχει από μόνη της rendering engine.

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

Dart — Αναλυτικός οδηγός εξάσκησης

Ρητή ανάλυση εισόδου

Με null safety η int.tryParse επιστρέφει int?. Δεν μετατρέπει σιωπηλά τα λάθη σε μηδέν. Σε προσωρινό bin/parse_scores.dart γράψε:

void main() {
  final raw = <String>['12', 'bad', '0', '-3'];
  final values = raw.map(int.tryParse).toList();
  assert(values[0] == 12);
  assert(values[1] == null);
  assert(values[2] == 0);
  assert(values[3] == -3);
  print(values);
}

Αναμένονται οι τιμές 12, null, 0, -3. Εκτέλεσε με κατάλληλη εντολή dart run της εγκατεστημένης έκδοσης. Πρόσεξε ότι τα assert μπορεί να είναι απενεργοποιημένα σε παραγωγική διαμόρφωση. Δεν υπήρχε διαθέσιμη Dart runtime για εκτέλεση εδώ.

Συμβόλαιο τύπων

Μια List<int?> δεν γίνεται List<int> επειδή τα περισσότερα στοιχεία είναι αριθμοί. Πρέπει πρώτα να αποκλειστούν οι ελλείπουσες τιμές και να αποδειχθεί ο τύπος των υπολοίπων. Ο τελεστής ! δεν ελέγχει αν το κείμενο είναι σωστό· απλώς απαιτεί μη-null αποτέλεσμα και μπορεί να πετάξει εξαίρεση αν η τιμή λείπει.

Πολιτική σφάλματος

Σύγκρινε την int.tryParse με την int.parse, η οποία δημιουργεί FormatException για αποτυχημένη ανάλυση. Έλεγξε "", " 12 " και "12x" και αποφάσισε αν θα αφαιρείς κενά πριν από την ανάλυση. Άλλο ζήτημα είναι αν οι αρνητικοί αριθμοί επιτρέπονται από την εφαρμογή: το -3 μπορεί να είναι αριθμητικά έγκυρο αλλά επιχειρησιακά απαγορευμένο.

Αυτοτελές εργαστήριο

Υλοποίησε sumValidScores(Iterable<String>) και τεκμηρίωσε αν παραλείπει ή απορρίπτει άκυρα στοιχεία. Πρόσθεσε αυστηρή εκδοχή που αναφέρει τη θέση του πρώτου λάθους. Κάνε τεστ για κενή είσοδο, μηδέν, διπλές τιμές και εξαιρετικά μεγάλο ακέραιο. Η συμπεριφορά μεγάλων αριθμών μπορεί να διαφέρει ανάμεσα σε native Dart και μεταγλώττιση για web. Πηγές: https://api.dart.dev/dart-core/int/tryParse.html και https://dart.dev/null-safety

Dart — Παραδείγματα πραγματικού κώδικα

Εκτέλεση των παραδειγμάτων

Τα παραδείγματα είναι μικρά και αυτοτελή. Χρησιμοποίησε τη σχετική εγκατεστημένη γλώσσα. Ενδεικτικά: dart run {file}. Μη συγχέεις τα ονόματα αρχείων με αυτόματη εγκατάσταση. Δούλεψε σε δοκιμαστικό φάκελο.

Dart — Διαδρομή ουσιαστικής εξάσκησης

Στάδιο 1: κατανόηση εκτέλεσης

Γράψε pure parser για μη αρνητικό integer με int.tryParse που επιστρέφει null ή tagged result. Δοκίμασε null, spaces, μεγάλο αριθμό και διαφορετικό decimal separator.

Στάδιο 2: απόδειξη με ελεγχόμενες δοκιμές

Με Future.delayed προσομοίωσε δύο αναζητήσεις που ολοκληρώνονται ανάποδα. Πρόσθεσε αυξανόμενα request IDs ώστε η παλιά απάντηση να αγνοείται. Το debounce μόνο του δεν εγγυάται σωστή σειρά.

Στάδιο 3: μικρό ολοκληρωμένο έργο

Μοντελοποίησε Loading, Success, Failure με sealed states σε συμβατή Dart. Έλεγξε όλες τις περιπτώσεις εμφάνισης. Ξεχώρισε απλό Dart CLI από Flutter widgets.

Dart — Τεχνικά σημεία και συχνές παγίδες

Τεχνική γνώση

  1. Το null safety αναπαριστά προαιρετικές τιμές στο σύστημα τύπων.
  2. Τα Future και Stream περιγράφουν ασύγχρονα αποτελέσματα και ακολουθίες.
  3. Το Flutter είναι πλαίσιο διεπαφής, όχι ταυτόσημο με τη βασική Dart.