Πρότυπο Κωδικοποίησης
Αυτό το έγγραφο περιγράφει τους κανόνες και τις συστάσεις για την ανάπτυξη του 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 περιέχει αποστρόφους.
Συμβάσεις Ονοματοδοσίας
- Μην χρησιμοποιείτε συντομογραφίες, εκτός αν το πλήρες όνομα είναι πολύ μεγάλο.
- Για διγράμματες συντομογραφίες χρησιμοποιήστε κεφαλαία γράμματα, για μεγαλύτερες συντομογραφίες PascalCase/camelCase.
- Για το όνομα της κλάσης χρησιμοποιήστε ουσιαστικό ή φράση ουσιαστικού.
- Τα ονόματα των κλάσεων πρέπει να περιέχουν όχι μόνο την εξειδίκευση
(
Array
), αλλά και τη γενικότητα (ArrayIterator
). Εξαίρεση αποτελούν τα attributes της γλώσσας PHP. - Οι σταθερές κλάσεων και τα enums πρέπει να χρησιμοποιούν PascalCase.
- Τα Interfaces και οι
abstract κλάσεις δεν πρέπει να περιέχουν προθέματα ή επιθήματα όπως
Abstract
,Interface
ήI
.
Αναδίπλωση και Άγκιστρα
Το 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 κελιών, η οποία χρησιμοποιείται συχνότερα σε φορητούς υπολογιστές, αυτό είναι περισσότερο από το ένα τέταρτο των διαθέσιμων κελιών που σπαταλούνται χωρίς καμία πληροφορία.