DedSec Project

Γλωσσάρι: στοίβες, static typing και streams — DedSec Project

Γλωσσάρι: στοίβες, static typing και streams Stack Πραγματική σημασία Last-in-first-out δομή: push προσθέτει και pop αφαιρεί το πιο πρόσφατο item. Το call stack κρατά execution frames αλλά…

Stack

Πραγματική σημασία

Last-in-first-out δομή: push προσθέτει και pop αφαιρεί το πιο πρόσφατο item. Το call stack κρατά execution frames αλλά διαφέρει από explicit data-structure stack.

Συγκεκριμένη αφετηρία

stack=[]
stack.append('open'); stack.append('close')
assert stack.pop()=='close'
assert stack.pop()=='open'

Εφαρμογή του κανόνα

Χρησιμοποίησε stack για parentheses matching και δοκίμασε unmatched closing/opening bracket.

Αντιπαράδειγμα

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

Static typing

Πραγματική σημασία

Έλεγχος τύπων πριν την εκτέλεση ή στη μεταγλώττιση, π.χ. TypeScript και Rust. Οι στατικοί τύποι δεν επικυρώνουν αυτόματα εξωτερικό JSON στο runtime.

Συγκεκριμένη αφετηρία

type Record = {score: number};
const r: Record = {score: 3};
// const bad: Record = {score: '3'}; // compile error

Εφαρμογή του κανόνα

Κάνε compile με strict mode, δοκίμασε το bad assignment και υλοποίησε runtime parser που απορρίπτει string input.

Αντιπαράδειγμα

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

Stream

Πραγματική σημασία

Ακολουθία που επεξεργάζεται σταδιακά και δεν χρειάζεται να φορτωθεί ολόκληρη. File/network streams και async iterators διαφέρουν σε buffering, backpressure και errors.

Συγκεκριμένη αφετηρία

from io import StringIO
with StringIO('first\nsecond\n') as src:
    assert [line.strip() for line in src]==['first','second']

Εφαρμογή του κανόνα

Επεξεργάσου μεγάλο συνθετικό αρχείο line-by-line χωρίς readlines(), μέτρησε μνήμη και όρισε line-length limit.

Αντιπαράδειγμα

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

String

Πραγματική σημασία

Διατεταγμένη αναπαράσταση κειμένου. Τα Python strings περιέχουν Unicode code points, όχι ωμά UTF-8 bytes. Combining characters επηρεάζουν οπτικό μήκος.

Συγκεκριμένη αφετηρία

text='Γεια'
assert len(text)==4
assert len(text.encode('utf-8'))>len(text)

Εφαρμογή του κανόνα

Σύγκρινε 'é' και 'e\u0301' πριν/μετά NFC normalization, μαζί με code points και UTF-8 byte lengths.

Αντιπαράδειγμα

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

Timeout

Διαφορετικές έννοιες

Timeout είναι όριο αναμονής ή εκτέλεσης. Connection timeout, idle-read timeout και συνολικό deadline διαφέρουν. Αν ο client σταματήσει να περιμένει, δεν σημαίνει ότι ο server ακύρωσε την πράξη· μία πληρωμή ή μεταφορά ίσως ολοκληρώθηκε λίγο πριν την αποσύνδεση.

Τοπικό εργαστήριο με subprocess

import subprocess
import sys

try:
    subprocess.run(
        [sys.executable, "-c", "import time; time.sleep(2)"],
        timeout=0.2,
        check=True,
    )
except subprocess.TimeoutExpired:
    print("timed out")

Η αναμενόμενη έξοδος είναι timed out, επειδή η διεργασία κοιμάται περισσότερο από το επιτρεπτό όριο. Η subprocess.run σκοτώνει και περιμένει το άμεσο child στο timeout. Δεν εγγυάται τερματισμό όλων των εγγονικών διεργασιών ή ακριβές συνολικό όριο 0.2 δευτερολέπτων μαζί με τη δημιουργία process.

Δοκιμές σωστής απόκρισης

  1. Βάλε γρήγορη εντολή αντί του sleep και κατέγραψε κανονικό return code.
  2. Προκάλεσε άμεσο μη μηδενικό exit με check=True και ξεχώρισε CalledProcessError από TimeoutExpired.
  3. Για HTTP αλλαγές κατάστασης χρησιμοποίησε idempotency key. Μετά από timeout έλεγξε τι καταχώρησε ο server πριν επαναλάβεις εγγραφή.
  4. Σχεδίασε retry/backoff με συνολικό deadline: πολλά μικρά timeouts μπορεί να ξεπεράσουν την τελική προθεσμία.
  5. Κλείσε αρχεία και locks στην ακύρωση· το κλείσιμο μιας UI οθόνης δεν ακυρώνει απαραίτητα δουλειά στο backend.

Αποδείξεις

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