{"title":"Φιλοσοφίες σχεδιασμού","version":"2.2","locale":"el","docname":"misc/design-philosophies","url":"/el/2.2/misc/design-philosophies/","canonical":"https://djangodocs.dev/el/2.2/misc/design-philosophies/","summary":"Αυτό το άρθρο εξηγεί μερικές από τις θεμελιώδεις φιλοσοφίες των developers του Django οι οποίοι ακολουθώντας τες, έχτισαν το framework. Ο στόχος τους είναι να…","html":"<h1>Φιλοσοφίες σχεδιασμού<a class=\"heading-anchor\" href=\"#design-philosophies\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Αυτό το άρθρο εξηγεί μερικές από τις θεμελιώδεις φιλοσοφίες των developers του Django οι οποίοι ακολουθώντας τες, έχτισαν το framework. Ο στόχος τους είναι να εξηγήσει το παρελθόν και να οδηγήσει το μέλλον.</p>\n<section id=\"overall\">\n<h2>Γενικά<a class=\"heading-anchor\" href=\"#overall\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"loose-coupling\">\n<span id=\"id1\"></span><h3>Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)<a class=\"heading-anchor\" href=\"#loose-coupling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p id=\"index-0\">Ένας θεμελιώδης στόχος των πολλαπλών επιπέδων του Django (models, views, templates κλπ) είναι: <a class=\"reference external\" href=\"http://c2.com/cgi/wiki?CouplingAndCohesion\">ανεξαρτητοποίηση των οντοτήτων και η σταθερή συνοχή του καθενός</a>. Τα διάφορα επίπεδα του framework δεν θα πρέπει να «γνωρίζουν» το ένα το άλλο εκτός και αν κριθεί απολύτως αναγκαίο.</p>\n<p>Για παράδειγμα, το σύστημα των templates δε ξέρει απολύτως τίποτα σχετικά με τα Web requests, το επίπεδο της βάσης δεδομένων δε ξέρει τίποτα για την εμφάνιση των δεδομένων και, τέλος, δεν ενδιαφέρει το σύστημα των views ποιο σύστημα template χρησιμοποιεί ο προγραμματιστής.</p>\n<p>Παρόλο που, για λόγους ευκολίας, το Django περιέχει όλα τα επίπεδα προεγκατεστημένα, καθένα από αυτά είναι ανεξάρτητο του άλλου, όπου αυτό είναι δυνατόν.</p>\n</section>\n<section id=\"less-code\">\n<span id=\"id2\"></span><h3>Λιγότερος κώδικας<a class=\"heading-anchor\" href=\"#less-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Οι Django εφαρμογές (apps) θα πρέπει να χρησιμοποιούν όσο το δυνατόν λιγότερο κώδικα. Με άλλα λόγια θα πρέπει να στερούνται στερεότυπους κώδικες. Το Django θα πρέπει να εκμεταλλευτεί πλήρως τις δυναμικές ικανότητες της Python όπως είναι η ενδοσκόπηση (introspection).</p>\n</section>\n<section id=\"quick-development\">\n<span id=\"id3\"></span><h3>Γρήγορη ανάπτυξη<a class=\"heading-anchor\" href=\"#quick-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ο στόχος ενός Web framework, στον 21ο αιώνα, είναι να κάνει τις ανιαρές πτυχές του Web development γρήγορες. Το Django κάνει τη διαδικασία του Web development εξαιρετικά γρήγορη.</p>\n</section>\n<section id=\"don-t-repeat-yourself-dry\">\n<span id=\"dry\"></span><h3>Μην επαναλαμβάνεστε (Don’t repeat yourself, DRY)<a class=\"heading-anchor\" href=\"#don-t-repeat-yourself-dry\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p id=\"index-1\">Κάθε ξεχωριστή έννοια ή/και κάποιο κομμάτι δεδομένων θα πρέπει να βρίσκεται σε ένα και μόνο ένα σημείο. Ο πλεονασμός είναι κακός. Η ομαλοποίηση είναι καλή.</p>\n<p>Το framework, μέσα σε λογικά πλαίσια, θα πρέπει να εξάγει όσο το δυνατόν περισσότερα από όσο το δυνατόν λιγότερα.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Δείτε επίσης</p>\n<p>The <a class=\"reference external\" href=\"http://wiki.c2.com/?DontRepeatYourself\">discussion of DRY on the Portland Pattern Repository</a></p>\n</aside>\n</section>\n<section id=\"explicit-is-better-than-implicit\">\n<span id=\"id5\"></span><h3>Το να λες κάτι ρητά είναι καλύτερο απ’ το να το υπονοείς (Explicit is better than implicit)<a class=\"heading-anchor\" href=\"#explicit-is-better-than-implicit\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Αυτό είναι η θεμελιώδης αρχή της Python η οποία περιλαμβάνεται στο <span class=\"target\" id=\"index-6\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0020/\"><strong>PEP 20</strong></a> και σημαίνει ότι το Django δεν θα πρέπει να κάνει πολλά «μαγικά.» Τα μαγικά δεν πρέπει να υπάρχουν εκτός και αν υπάρχει ένας πολύ καλός λόγος. Τα μαγικά αξίζει να γίνουν αν προσφέρουν τεράστια ευκολία η οποία είναι ανέφικτη με άλλους τρόπους και η υλοποίηση τους έχει γίνει με τέτοιο τρόπο που να μην μπερδεύει τους προγραμματιστές οι οποίοι προσπαθούν να καταλάβουν πως να χρησιμοποιήσουν το feature.</p>\n</section>\n<section id=\"consistency\">\n<span id=\"id6\"></span><h3>Συνοχή<a class=\"heading-anchor\" href=\"#consistency\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το framework θα πρέπει να έχει συνοχή σε όλα τα επίπεδα. Η έννοια της συνοχής εφαρμόζεται στα πάντα, από τα χαμηλού επιπέδου (το στυλ του Python κώδικα που χρησιμοποιείται) μέχρι τα υψηλού επιπέδου (η «εμπειρία» πάνω στο Django).</p>\n</section>\n</section>\n<section id=\"models\">\n<h2>Μοντέλα<a class=\"heading-anchor\" href=\"#models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"id7\">\n<h3>Το να λες κάτι ρητά είναι καλύτερο απ’ το να το υπονοείς (Explicit is better than implicit)<a class=\"heading-anchor\" href=\"#id7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Τα πεδία (fields) δεν θα πρέπει να υποθέτουν κάποιες συμπεριφορές βασιζόμενα μόνο και μόνο στο όνομα του πεδίου. Αυτό απαιτεί πολλή γνώση από το σύστημα και είναι ευάλωτο σε λάθη. Αντιθέτως, οι συμπεριφορές θα πρέπει να βασίζονται στα keyword arguments και, σε μερικές περιπτώσεις, στον τύπο του πεδίου.</p>\n</section>\n<section id=\"include-all-relevant-domain-logic\">\n<h3>Περίληψη όλων των σχετικών με το μοντέλο πληροφορίες<a class=\"heading-anchor\" href=\"#include-all-relevant-domain-logic\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Τα μοντέλα θα πρέπει να ενσωματώσουν όλες τις έννοιες που αφορούν ένα «object,» σύμφωνα με το άρθρο <a class=\"reference external\" href=\"https://www.martinfowler.com/eaaCatalog/activeRecord.html\">Active Record</a> του Martin Fowler σχετικά με πρακτικές σχεδιασμού.</p>\n<p>Να λοιπόν γιατί τα δεδομένα που αναπαριστώνται από το μοντέλο και οι πληροφορίες σχετικά με αυτά (το όνομα όπως θα εμφανίζεται στον χρήστη, επιλογές όπως προεπιλεγμένη ταξινόμηση κλπ) ορίζονται μέσα στην κλάση του μοντέλου. Όλη η πληροφορία που χρειάζεται για να κατανοηθεί ένα μοντέλο θα πρέπει να αποθηκεύεται <em>μέσα</em> στο μοντέλο.</p>\n</section>\n</section>\n<section id=\"database-api\">\n<h2>Το API της βάσης δεδομένων<a class=\"heading-anchor\" href=\"#database-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Οι βασικοί στόχοι του API της βάσης δεδομένων είναι:</p>\n<section id=\"sql-efficiency\">\n<h3>Αποδοτικότητα της SQL<a class=\"heading-anchor\" href=\"#sql-efficiency\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το framework θα πρέπει να εκτελεί όσο το δυνατόν λιγότερες φορές τις SQL εντολές και να τις βελτιστοποιεί στο εσωτερικό του.</p>\n<p>Να γιατί οι developers χρειάζεται να καλούν την μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> ρητώς, παρά να επαφίενται στο framework να αποθηκεύει σιωπηλά τα objects στο παρασκήνιο.</p>\n<p>Επίσης, αυτός είναι ο λόγος της ύπαρξης της μεθόδου <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> του <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Είναι ένας προαιρετικός αρωγός απόδοσης για συνηθισμένες περιπτώσεις του τύπου «επέλεξε κάθε συσχετισμένο object».</p>\n</section>\n<section id=\"terse-powerful-syntax\">\n<h3>Λακωνική, ισχυρή σύνταξη<a class=\"heading-anchor\" href=\"#terse-powerful-syntax\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το API της βάσης δεδομένων θα πρέπει να επιτρέπει πλούσια και εκφραστικά statements με όσο το δυνατόν λιγότερη σύνταξη. Δεν θα πρέπει να βασίζεται στην εισαγωγή (import) άλλων modules ή βοηθητικών objects.</p>\n<p>Οι εντολές “JOIN” της SQL θα πρέπει να γίνονται αυτομάτως, στο παρασκήνιο, όταν είναι απαραίτητο.</p>\n<p>Κάθε object θα πρέπει να έχει πρόσβαση σε κάθε συσχετισμένο object, μέσα σε όλο το σύστημα. Αυτού του είδους η πρόσβαση θα πρέπει να δουλεύει και ανάποδα.</p>\n</section>\n<section id=\"option-to-drop-into-raw-sql-easily-when-needed\">\n<h3>Επιλογή να μπορεί γράφεται SQL εύκολα, όποτε χρειάζεται<a class=\"heading-anchor\" href=\"#option-to-drop-into-raw-sql-easily-when-needed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το API της βάσης δεδομένων θα πρέπει να συνειδητοποιήσει ότι είναι μια συντόμευση και όχι απαραίτητα ένα API που τα κάνει όλα. Το framework θα πρέπει να κάνει εύκολη τη γραφή προσαρμοσμένων SQL εντολών – είτε ολόκληρων είτε προσαρμοσμένων <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> εντολών μόνο, ως παραμέτρους στις κλήσεις του API.</p>\n</section>\n</section>\n<section id=\"url-design\">\n<h2>Σχεδιασμός URL<a class=\"heading-anchor\" href=\"#url-design\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"id8\">\n<h3>Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)<a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Τα URLs μέσα σε μια Django εφαρμογή (app) δεν θα πρέπει να εμπλέκονται με τον Python κώδικα που είναι γραμμένος. Η σύνδεση των URLs σε ονόματα Python συναρτήσεων είναι Κακό Και Άσχημο Πράγμα.</p>\n<p>Σύμφωνα με τα ανωτέρω, το σύστημα URL του Django θα πρέπει να επιτρέπει τα URLs της ίδιας εφαρμογής να είναι διαφορετικά ανάμεσα σε διαφορετικά πλαίσια (contexts). Για παράδειγμα, ένα site μπορεί να φιλοξενήσει την εφαρμογή “stories”  στη διεύθυνση <code class=\"docutils literal notranslate\"><span class=\"pre\">/stories/</span></code> ενώ ένα άλλο να φιλοξενήσει την ίδια εφαρμογή στη διεύθυνση <code class=\"docutils literal notranslate\"><span class=\"pre\">/news/</span></code>.</p>\n</section>\n<section id=\"infinite-flexibility\">\n<h3>Απεριόριστη ευελιξία<a class=\"heading-anchor\" href=\"#infinite-flexibility\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Τα URLs θα πρέπει να είναι όσο το δυνατόν πιο ευέλικτα. Κάθε νοητή σχεδίαση ενός URL θα πρέπει να επιτρέπεται.</p>\n</section>\n<section id=\"encourage-best-practices\">\n<h3>Ενθάρρυνση καλών πρακτικών<a class=\"heading-anchor\" href=\"#encourage-best-practices\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το framework θα πρέπει να κάνει εύκολη (αν όχι ευκολότερη), για τον developer, τη σχεδίαση όμορφων παρά άσχημων URLs.</p>\n<p>Οι καταλήξεις αρχείων στα URLs ιστοσελίδων πρέπει να αποφεύγονται.</p>\n<p>Τα κόμματα, τύπου Vignette, στα URLs χρήζουν αυστηρής τιμωρίας.</p>\n</section>\n<section id=\"definitive-urls\">\n<span id=\"id9\"></span><h3>Οριστικά URLs<a class=\"heading-anchor\" href=\"#definitive-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p id=\"index-3\">Σε τεχνικό επίπεδο, το <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar/</span></code> είναι δύο διαφορετικά URLs και τα ρομπότ των μηχανών αναζήτησης (όπως επίσης και μερικά εργαλεία ανάλυσης της κίνησης στο Web) θα τα μεταχειριστούν ως διαφορετικές σελίδες. Το Django θα πρέπει να καταβάλλει προσπάθεια προκειμένου να «ομαλοποιήσει» τα URLs ούτως ώστε τα ρομπότ των μηχανών αναζήτησης να μην μπερδευτούν.</p>\n<p>Αυτό είναι ο λόγος πίσω από τη ρύθμιση <a class=\"reference internal\" href=\"/el/2.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a>.</p>\n</section>\n</section>\n<section id=\"template-system\">\n<h2>Σύστημα template<a class=\"heading-anchor\" href=\"#template-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"separate-logic-from-presentation\">\n<span id=\"separation-of-logic-and-presentation\"></span><h3>Διαχωρισμός μεταξύ λογικής και παρουσίασης<a class=\"heading-anchor\" href=\"#separate-logic-from-presentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Βλέπουμε το σύστημα του template ως ένα εργαλείο που ελέγχει την παρουσίαση και ότι έχει να κάνει με την λογική πίσω από την παρουσίαση. Μόνο αυτό. Το σύστημα template δεν θα πρέπει να πάει παραπέρα από αυτό τον στόχο.</p>\n</section>\n<section id=\"discourage-redundancy\">\n<h3>Αποθάρρυνση του πλεονασμού<a class=\"heading-anchor\" href=\"#discourage-redundancy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Η πλειονότητα των δυναμικών ιστοσελίδων χρησιμοποιεί ένα είδος κοινού σχεδιασμού ολόκληρου του site – κοινό header, footer, μπάρα πλοήγησης κλπ. Το σύστημα template του Django θα πρέπει να κάνει εύκολη την αποθήκευση αυτών των στοιχείων σε ένα μέρος, εξαλείφοντας τη χρήση επαναλαμβανόμενου κώδικα.</p>\n<p>Αυτή είναι η φιλοσοφία πίσω από την <a class=\"reference internal\" href=\"/el/2.2/ref/templates/language/#template-inheritance\"><span class=\"std std-ref\">κληρονομικότητα του template</span></a>.</p>\n</section>\n<section id=\"be-decoupled-from-html\">\n<h3>Μη συσχέτιση με την HTML<a class=\"heading-anchor\" href=\"#be-decoupled-from-html\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το σύστημα template δεν θα πρέπει να σχεδιαστεί για να παράγει μόνο HTML. Θα πρέπει να είναι εξίσου καλό στο να παράγει και άλλες μορφές που βασίζονται στο κείμενο ή απλώς σκέτο κείμενο.</p>\n</section>\n<section id=\"xml-should-not-be-used-for-template-languages\">\n<h3>Η XML δεν θα πρέπει να χρησιμοποιείται σε γλώσσες template<a class=\"heading-anchor\" href=\"#xml-should-not-be-used-for-template-languages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p id=\"index-4\">Η χρήση μιας XML μηχανής για να αναλύσει τα templates εισάγει έναν εντελώς νέο κόσμο από ανθρώπινα λάθη κατά την επεξεργασία τους. Παράλληλα προσθέτει ένα απαράδεκτο overhead κατά την επεξεργασία του template.</p>\n</section>\n<section id=\"assume-designer-competence\">\n<h3>Υποθέτει τη συμμετοχή του designer<a class=\"heading-anchor\" href=\"#assume-designer-competence\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το σύστημα template δεν θα πρέπει να σχεδιαστεί με τρόπο που τα templates να εμφανίζονται, απαραιτήτως, ως WYSIWYG επεξεργαστές, όπως το Dreamweaver. Αυτό αποτελεί σημαντικό περιορισμό και δεν επιτρέπει στη σύνταξη να είναι τόσο όμορφη όσο θα έπρεπε να είναι. Το Django υποθέτει ότι οι συντάκτες των templates είναι εξοικειωμένοι με την επεξεργασία της HTML.</p>\n</section>\n<section id=\"treat-whitespace-obviously\">\n<h3>Διαχείριση των κενών χαρακτήρων με τον προφανή τρόπο<a class=\"heading-anchor\" href=\"#treat-whitespace-obviously\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το σύστημα template δεν θα πρέπει να κάνει μαγικά πράγματα με τους κενούς χαρακτήρες (whitespace). Αν ένα template περιέχει κενά, τότε το σύστημα θα τα διαχειριστεί ως κείμενο και θα τα εμφανίσει. Κάθε κενό που δεν βρίσκεται μέσα σε κάποιο template tag θα εμφανίζεται.</p>\n</section>\n<section id=\"don-t-invent-a-programming-language\">\n<h3>Όχι στην εφεύρεση μια γλώσσας προγραμματισμού<a class=\"heading-anchor\" href=\"#don-t-invent-a-programming-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ο στόχος δεν είναι να εφεύρουμε μια γλώσσα προγραμματισμού. Ο στόχος είναι να προσφέρουμε ένα είδος προγραμματιστικής λειτουργίας στο template όπως ο βρόγχος επανάληψης και οι δομές ελέγχου, κάτι το οποίο είναι ζωτικής σημασίας όταν σχεδιάζουμε ένα template. H <a class=\"reference internal\" href=\"/el/2.2/topics/templates/#template-language-intro\"><span class=\"std std-ref\">Γλώσσα Template του Django (DTL)</span></a> αποφεύγει τις προχωρημένες λογικές.</p>\n<p>Το σύστημα template του Django αναγνωρίζει ότι τα templates γράφονται συχνά από <em>designers</em>, όχι από <em>προγραμματιστές</em> και, επομένως, δεν θα πρέπει να απαιτεί από τον συντάκτη να έχει γνώσεις Python.</p>\n</section>\n<section id=\"safety-and-security\">\n<h3>Ασφάλεια και προστασία<a class=\"heading-anchor\" href=\"#safety-and-security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το σύστημα template, εξ ορισμού, θα πρέπει να μην επιτρέπει την εισαγωγή κακόβουλου κώδικα – όπως εντολές οι οποίες διαγράφουν δεδομένα από την βάση δεδομένων.</p>\n<p>Αυτός είναι ένας άλλος λόγος που το σύστημα template δεν επιτρέπει την εισαγωγή Python κώδικα.</p>\n</section>\n<section id=\"extensibility\">\n<h3>Επεκτασιμότητα<a class=\"heading-anchor\" href=\"#extensibility\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το σύστημα template θα πρέπει να παρέχει στους προχωρημένους συντάκτες template τη δυνατότητα επέκτασης και περαιτέρω παραμετροποίησης του.</p>\n<p>Αυτή είναι η φιλοσοφία πίσω από τα παραμετροποιήσιμα φίλτρα και template tags.</p>\n</section>\n</section>\n<section id=\"views\">\n<h2>Views<a class=\"heading-anchor\" href=\"#views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"simplicity\">\n<h3>Απλότητα<a class=\"heading-anchor\" href=\"#simplicity\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Η σύνταξη ενός view θα πρέπει να είναι τόσο απλή όσο μιας Python συνάρτησης. Οι developers δεν θα πρέπει να αρχικοποιούν (instantiate) μια κλάση όταν μπορούν να χρησιμοποιήσουν, απλώς, μια συνάρτηση.</p>\n</section>\n<section id=\"use-request-objects\">\n<h3>Χρήση των request objects<a class=\"heading-anchor\" href=\"#use-request-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Τα views θα πρέπει να έχουν πρόσβαση σε ένα request object – ένα object, δηλαδή, που αποθηκεύει metadata σχετικά με το τρέχον request (αυτό που έκανε ο χρήστης). Το object θα πρέπει να περαστεί απ’ ευθείας στη συνάρτηση view, παρά η συνάρτηση view να έχει πρόσβαση στα request data μέσω μιας global μεταβλητής. Αυτό το καθιστά ελαφρύ, καθαρό και εύκολο να ελεγχθούν τα views περνώντας ως όρισμα «ψεύτικα» request objects.</p>\n</section>\n<section id=\"id10\">\n<h3>Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)<a class=\"heading-anchor\" href=\"#id10\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ένα view δεν θα πρέπει να ενδιαφέρεται για το σύστημα template που χρησιμοποιεί ο developer – ή ακόμη και για το αν χρησιμοποιείται κάποιο.</p>\n</section>\n<section id=\"differentiate-between-get-and-post\">\n<h3>Διαφοροποίηση μεταξύ GET και POST<a class=\"heading-anchor\" href=\"#differentiate-between-get-and-post\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το GET και το POST είναι ξεχωριστά. Οι developers θα πρέπει να δηλώνουν ρητώς ποια μέθοδο θα χρησιμοποιούν. Το framework θα πρέπει να κάνει εύκολο το διαχωρισμό μεταξύ των GET και POST δεδομένων.</p>\n</section>\n</section>\n<section id=\"cache-framework\">\n<span id=\"cache-design-philosophy\"></span><h2>Cache Framework<a class=\"heading-anchor\" href=\"#cache-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Οι βασικοί στόχοι του <a class=\"reference internal\" href=\"/el/2.2/topics/cache/\"><span class=\"doc\">cache framework</span></a> του Django είναι:</p>\n<section id=\"id11\">\n<h3>Λιγότερος κώδικας<a class=\"heading-anchor\" href=\"#id11\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Μια cache θα πρέπει να είναι όσο γίνεται πιο γρήγορη. Επομένως, όλος ο κώδικας του framework που περιβάλλει την cache backend θα πρέπει να διατηρείται σε χαμηλά επίπεδα, ειδικά για περιπτώσεις που ζητάμε κάτι από την cache (<code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>).</p>\n</section>\n<section id=\"id12\">\n<h3>Συνοχή<a class=\"heading-anchor\" href=\"#id12\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το API της cache θα πρέπει να παρέχει ένα interface με συνοχή ανάμεσα σε διαφορετικά cache backends.</p>\n</section>\n<section id=\"id13\">\n<h3>Επεκτασιμότητα<a class=\"heading-anchor\" href=\"#id13\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Το API της cache θα πρέπει να είναι επεκτάσιμο σε επίπεδο εφαρμογής ανάλογα με τις απαιτήσεις του developer (για παράδειγμα, δείτε στην <a class=\"reference internal\" href=\"/el/2.2/topics/cache/#cache-key-transformation\"><span class=\"std std-ref\">αλλαγή κλειδιών της cache</span></a>).</p>\n</section>\n</section>","rootId":"design-philosophies","toc":[{"title":"Γενικά","anchor":"overall","children":[{"title":"Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)","anchor":"loose-coupling","children":[]},{"title":"Λιγότερος κώδικας","anchor":"less-code","children":[]},{"title":"Γρήγορη ανάπτυξη","anchor":"quick-development","children":[]},{"title":"Μην επαναλαμβάνεστε (Don’t repeat yourself, DRY)","anchor":"don-t-repeat-yourself-dry","children":[]},{"title":"Το να λες κάτι ρητά είναι καλύτερο απ’ το να το υπονοείς (Explicit is better than implicit)","anchor":"explicit-is-better-than-implicit","children":[]},{"title":"Συνοχή","anchor":"consistency","children":[]}]},{"title":"Μοντέλα","anchor":"models","children":[{"title":"Το να λες κάτι ρητά είναι καλύτερο απ’ το να το υπονοείς (Explicit is better than implicit)","anchor":"id7","children":[]},{"title":"Περίληψη όλων των σχετικών με το μοντέλο πληροφορίες","anchor":"include-all-relevant-domain-logic","children":[]}]},{"title":"Το API της βάσης δεδομένων","anchor":"database-api","children":[{"title":"Αποδοτικότητα της SQL","anchor":"sql-efficiency","children":[]},{"title":"Λακωνική, ισχυρή σύνταξη","anchor":"terse-powerful-syntax","children":[]},{"title":"Επιλογή να μπορεί γράφεται SQL εύκολα, όποτε χρειάζεται","anchor":"option-to-drop-into-raw-sql-easily-when-needed","children":[]}]},{"title":"Σχεδιασμός URL","anchor":"url-design","children":[{"title":"Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)","anchor":"id8","children":[]},{"title":"Απεριόριστη ευελιξία","anchor":"infinite-flexibility","children":[]},{"title":"Ενθάρρυνση καλών πρακτικών","anchor":"encourage-best-practices","children":[]},{"title":"Οριστικά URLs","anchor":"definitive-urls","children":[]}]},{"title":"Σύστημα template","anchor":"template-system","children":[{"title":"Διαχωρισμός μεταξύ λογικής και παρουσίασης","anchor":"separate-logic-from-presentation","children":[]},{"title":"Αποθάρρυνση του πλεονασμού","anchor":"discourage-redundancy","children":[]},{"title":"Μη συσχέτιση με την HTML","anchor":"be-decoupled-from-html","children":[]},{"title":"Η XML δεν θα πρέπει να χρησιμοποιείται σε γλώσσες template","anchor":"xml-should-not-be-used-for-template-languages","children":[]},{"title":"Υποθέτει τη συμμετοχή του designer","anchor":"assume-designer-competence","children":[]},{"title":"Διαχείριση των κενών χαρακτήρων με τον προφανή τρόπο","anchor":"treat-whitespace-obviously","children":[]},{"title":"Όχι στην εφεύρεση μια γλώσσας προγραμματισμού","anchor":"don-t-invent-a-programming-language","children":[]},{"title":"Ασφάλεια και προστασία","anchor":"safety-and-security","children":[]},{"title":"Επεκτασιμότητα","anchor":"extensibility","children":[]}]},{"title":"Views","anchor":"views","children":[{"title":"Απλότητα","anchor":"simplicity","children":[]},{"title":"Χρήση των request objects","anchor":"use-request-objects","children":[]},{"title":"Ανεξαρτητοποίηση μεταξύ οντοτήτων (loose coupling)","anchor":"id10","children":[]},{"title":"Διαφοροποίηση μεταξύ GET και POST","anchor":"differentiate-between-get-and-post","children":[]}]},{"title":"Cache Framework","anchor":"cache-framework","children":[{"title":"Λιγότερος κώδικας","anchor":"id11","children":[]},{"title":"Συνοχή","anchor":"id12","children":[]},{"title":"Επεκτασιμότητα","anchor":"id13","children":[]}]}],"breadcrumbs":[{"docname":"misc/index","title":"Εγχειρίδιο Meta και πολλά άλλα","url":"/el/2.2/misc/"}],"prev":{"docname":"misc/api-stability","title":"Σταθερότητα του API","url":"/el/2.2/misc/api-stability/"},"next":{"docname":"misc/distributions","title":"Διανομές του Django από τρίτους","url":"/el/2.2/misc/distributions/"},"formats":{"html":"/el/2.2/misc/design-philosophies/","markdown":"/el/2.2/misc/design-philosophies.md","json":"/el/2.2/misc/design-philosophies.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/misc/design-philosophies.txt","official":"https://docs.djangoproject.com/el/2.2/misc/design-philosophies/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}