Πρότυπο Κωδικοποίησης

Αυτό το έγγραφο περιγράφει τους κανόνες και τις συστάσεις για την ανάπτυξη του Nette. Κατά τη συνεισφορά κώδικα στο Nette, πρέπει να τους τηρείτε. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να μιμηθείτε τον υπάρχοντα κώδικα. Στόχος είναι όλος ο κώδικας να φαίνεται σαν να τον έγραψε ένα άτομο.

Το Nette Coding Standard αντιστοιχεί στο PSR-12 Extended Coding Style με δύο κύριες εξαιρέσεις: για την εσοχή χρησιμοποιεί tabs αντί για κενά και για τις σταθερές κλάσεων χρησιμοποιεί PascalCase.

Γενικοί Κανόνες

  • Κάθε αρχείο PHP πρέπει να περιέχει declare(strict_types=1).
  • Δύο κενές γραμμές χρησιμοποιούνται για τον διαχωρισμό μεθόδων για καλύτερη αναγνωσιμότητα.
  • Ο λόγος χρήσης του τελεστή σίγασης (@) πρέπει να τεκμηριώνεται: @mkdir($dir); // @ - ο κατάλογος μπορεί ήδη να υπάρχει.
  • Αν χρησιμοποιείται τελεστής σύγκρισης με αδύναμη τυποποίηση (δηλ. ==, !=, …), πρέπει να τεκμηριώνεται η πρόθεση: // == αποδοχή null.
  • Σε ένα αρχείο exceptions.php μπορείτε να γράψετε πολλαπλές εξαιρέσεις.
  • Στα interfaces δεν καθορίζεται η ορατότητα των μεθόδων, επειδή είναι πάντα public.
  • Κάθε ιδιότητα, τιμή επιστροφής και παράμετρος πρέπει να έχει δηλωμένο τύπο. Αντίθετα, στις τελικές σταθερές δεν δηλώνουμε ποτέ τον τύπο, επειδή είναι προφανής.
  • Για τον οριοθέτηση ενός string θα πρέπει να χρησιμοποιούνται απλά εισαγωγικά, εκτός από τις περιπτώσεις όπου το ίδιο το literal περιέχει αποστρόφους.

Συμβάσεις Ονοματοδοσίας

Αναδίπλωση και Άγκιστρα

Το Nette Coding Standard αντιστοιχεί στο PSR-12 (ή PER Coding Style), σε ορισμένα σημεία το συμπληρώνει ή το τροποποιεί:

  • Οι arrow functions γράφονται χωρίς κενό πριν την παρένθεση, δηλ. fn($a) => $b.
  • Δεν απαιτείται κενή γραμμή μεταξύ διαφορετικών τύπων use import statements.
  • Ο τύπος επιστροφής της συνάρτησης/μεθόδου και το αρχικό άγκιστρο { είναι πάντα σε ξεχωριστές γραμμές:
	public function find(
		string $dir,
		array $options,
	): array
	{
		// σώμα της μεθόδου
	}

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

Μπλοκ Τεκμηρίωσης (phpDoc)

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

Μπλοκ τεκμηρίωσης για ορισμό κλάσης:

  • Ξεκινά με την περιγραφή της κλάσης.
  • Ακολουθεί μια κενή γραμμή.
  • Ακολουθούν οι annotations @property@property-read, @property-write), μία μετά την άλλη. Η σύνταξη είναι: annotation, κενό, τύπος, κενό, $name.
  • Ακολουθούν οι annotations @method, μία μετά την άλλη. Η σύνταξη είναι: annotation, κενό, τύπος επιστροφής, κενό, name(type $param, ...) .
  • Η annotation @author παραλείπεται. Η πατρότητα διατηρείται στην ιστορία του πηγαίου κώδικα.
  • Μπορούν να χρησιμοποιηθούν οι annotations @internal ή @deprecated.
/**
 * MIME message part.
 *
 * @property string $encoding
 * @property-read array $headers
 * @method string getSomething(string $name)
 * @method static bool isEnabled()
 */

Το μπλοκ τεκμηρίωσης για μια ιδιότητα, που περιέχει μόνο την annotation @var, θα πρέπει να είναι σε μία γραμμή:

/** @var string[] */
private array $name;

Μπλοκ τεκμηρίωσης για ορισμό μεθόδου:

  • Ξεκινά με μια σύντομη περιγραφή της μεθόδου.
  • Καμία κενή γραμμή.
  • Annotations @param σε ξεχωριστές γραμμές.
  • Annotation @return.
  • Annotations @throws, μία μετά την άλλη.
  • Μπορούν να χρησιμοποιηθούν οι annotations @internal ή @deprecated.

Μετά από κάθε annotation ακολουθεί ένα κενό, εκτός από το @param, μετά το οποίο για καλύτερη αναγνωσιμότητα ακολουθούν δύο κενά.

/**
 * Finds a file in directory.
 * @param  string[]  $options
 * @return string[]
 * @throws DirectoryNotFoundException
 */
public function find(string $dir, array $options): array

Tabulators αντί για Κενά

Οι tabulators έχουν αρκετά πλεονεκτήματα έναντι των κενών:

  • Το μέγεθος της εσοχής μπορεί να προσαρμοστεί στους επεξεργαστές κειμένου και στον web.
  • Δεν επιβάλλουν στον κώδικα την προτίμηση του χρήστη για το μέγεθος της εσοχής, οπότε ο κώδικας είναι πιο φορητός.
  • Μπορούν να γραφτούν με ένα πάτημα πλήκτρου (οπουδήποτε, όχι μόνο σε επεξεργαστές που μετατρέπουν τους tabulators σε κενά).
  • Η εσοχή είναι ο σκοπός τους.
  • Σέβονται τις ανάγκες των συναδέλφων με προβλήματα όρασης και των τυφλών.

Χρησιμοποιώντας tabulators στα έργα μας, επιτρέπουμε την προσαρμογή του πλάτους, η οποία μπορεί να φαίνεται περιττή στους περισσότερους ανθρώπους, αλλά είναι απαραίτητη για άτομα με προβλήματα όρασης.

Για τους τυφλούς προγραμματιστές που χρησιμοποιούν οθόνες Braille, κάθε κενό αντιπροσωπεύει ένα κελί Braille. Αν λοιπόν η προεπιλεγμένη εσοχή είναι 4 κενά, η εσοχή 3ου επιπέδου σπαταλά 12 πολύτιμα κελιά Braille πριν καν αρχίσει ο κώδικας. Σε μια οθόνη 40 κελιών, η οποία χρησιμοποιείται συχνότερα σε φορητούς υπολογιστές, αυτό είναι περισσότερο από το ένα τέταρτο των διαθέσιμων κελιών που σπαταλούνται χωρίς καμία πληροφορία.