| | 1 | [[TranslatedPages(revision=38)]] |
| | 2 | |
| | 3 | = Οδηγίες Ανάπτυξης = |
| | 4 | |
| | 5 | [[PageOutline(2-2,Table of content,inline)]] |
| | 6 | |
| | 7 | == Πώς θα πρέπει να είναι ο κώδικάς σας == |
| | 8 | |
| | 9 | * Βεβαιωθείτε ότι ο κώδικας είναι συμβατός με Java 11 |
| | 10 | * **Τεκμηριώστε** τον κώδικά σας χρησιμοποιώντας ενσωματωμένα σχόλια και javadoc. Πολλοί άνθρωποι θα σας ευγνωμονούν :) |
| | 11 | * Προσπαθήστε να αποφύγετε τα δημόσια πεδία |
| | 12 | * Το JOSM περιλαμβάνει πολλές βοηθητικές μεθόδους στις κλάσεις `Utils`, `GuiUtils`, `Geometry` .... Χρησιμοποιήστε τις αν χρειάζεστε |
| | 13 | * Ελέγξτε τις παραμέτρους. Μπορείτε να χρησιμοποιήσετε το `Objects.requireNonNull`. |
| | 14 | * Μην γράφετε για απόδοση - γράψτε για αναγνωσιμότητα. Χρησιμοποιήστε `Stream`s, `Function`s και άλλες λειτουργίες Java 8+ αν κάνουν τον κώδικα πιο ευανάγνωστο. |
| | 15 | |
| | 16 | === Threading / Κλείδωμα === |
| | 17 | |
| | 18 | * Το JOSM χρησιμοποιεί διάφορους μηχανισμούς κλειδώματος, ανάλογα με το αντικείμενο. |
| | 19 | * Τα σύνολα δεδομένων προστατεύονται από κλείδωμα RW. Ορισμένες μέθοδοι δεν κλειδώνουν αυτόματα για λόγους απόδοσης. Βεβαιωθείτε ότι έχετε αποκτήσει τα κλειδώματα που απαιτούνται για τις αλλαγές σας. |
| | 20 | * Τα στοιχεία GUI θα πρέπει να τροποποιούνται μόνο στο νήμα EDT. |
| | 21 | * Προτιμήστε να χρησιμοποιείτε τη μέθοδο `SwingUtils.invokeLater` εάν χρειάζεται να εκτελέσετε οτιδήποτε στο νήμα UI. |
| | 22 | * Πολλοί ακροατές εκτελούνται ήδη στο νήμα EDT (αλλαγές επιπέδων) ή έχουν έναν κεντρικό διαχειριστή που σας επιτρέπει να καταχωρείτε ακροατές που εκτελούνται στο EDT (αλλαγές συνόλου δεδομένων, αλλαγές επιλογής). |
| | 23 | |
| | 24 | == Πώς θα πρέπει να είναι η μορφοποίηση του κώδικά σας == |
| | 25 | |
| | 26 | * βεβαιωθείτε ότι δεν υπάρχουν κενά διαστήματα στο τέλος των γραμμών |
| | 27 | * μην χρησιμοποιείτε πολλαπλές συνεχόμενες κενές γραμμές |
| | 28 | * το JOSM χρησιμοποιεί εσοχή 4 χαρακτήρων και καθόλου στηλοθέτες. Εάν χρησιμοποιείτε το Notepad++ μπορείτε να αλλάξετε την προεπιλεγμένη εσοχή στις "Προτιμήσεις" -> "Γλώσσα" -> "Ρυθμίσεις στηλοθέτη" -> επιλέξτε "Αντικατάσταση με κενά" (αυτό είναι μόνιμο) ή με το κουμπί "αλλαγή ρυθμίσεων εσοχής" στη εργαλειοθήκη (αυτή είναι μια προσωρινή ρύθμιση και απαιτεί το πρόσθετο "Προσαρμογή Εργαλειοθήκης"). |
| | 29 | * προσθέστε αγκύλες για κάθε `if`, εκτός εάν ακολουθείται από `return` (ή πιθανώς `throw`) |
| | 30 | * Θα πρέπει να χρησιμοποιήσετε το **checkstyle** πριν από το patch/commit: `ant checkstyle` και ελέγξτε `checkstyle-josm.xml`; εάν διαπιστώσετε ότι η εκτέλεση του checkstyle είναι αργή για όλα τα αρχεία, εκτελέστε την μόνο για τα τροποποιημένα αρχεία: |
| | 31 | {{{ |
| | 32 | #!bash |
| | 33 | # make sure build2 dir exists, if it does not run 'ant checkstyle-compile' before |
| | 34 | |
| | 35 | svn diff --summarize | awk '{ print $2 }' | grep "^[a-z]" | xargs \ |
| | 36 | java -classpath "build2:tools/checkstyle/checkstyle-all.jar" \ |
| | 37 | com.puppycrawl.tools.checkstyle.Main -c tools/checkstyle/josm_checks.xml |
| | 38 | # or |
| | 39 | git diff --name-only | xargs \ |
| | 40 | java -classpath "build2:tools/checkstyle/checkstyle-all.jar" \ |
| | 41 | com.puppycrawl.tools.checkstyle.Main -c tools/checkstyle/josm_checks.xml |
| | 42 | }}} |
| | 43 | |
| | 44 | == Πώς πρέπει να φαίνεται το javadoc σας == |
| | 45 | * Ο [https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#styleguide οδηγός στυλ Oracle Javadoc] χρησιμοποιείται ως βασικός οδηγός |
| | 46 | * Το `@since` χρησιμοποιείται για δημόσιες κλάσεις και μεθόδους (ορατές στους προγραμματιστές πρόσθετων) με την έκδοση JOSM που εισήγαγε το στοιχείο. Παράδειγμα: `@since 5408` |
| | 47 | * Το `@since` ενημερώνεται / προστίθεται όταν αλλάζει η υπογραφή μιας δημόσιας μεθόδου ή εάν μετονομαστεί μια κλάση. |
| | 48 | * Το `@since` μπορεί να παραλειφθεί για δημόσιες μεθόδους και πεδία που εισάγονται ταυτόχρονα με την κλάση, υπό την προϋπόθεση ότι δεν έχουν αλλάξει και η κλάση είναι σωστά τεκμηριωμένη. |
| | 49 | * Μπορεί να υπάρχουν πολλαπλές ετικέτες `@since` tags, e.g. fπ.χ. για την προσθήκη διεπαφών σε μια κλάση. Ο λόγος για αυτές τις ετικέτες πρέπει να προστεθεί Παράδειγμα: `@since 12345 @FunctionalIterface προστέθηκε` |
| | 50 | * Εάν υποβάλετε μια ενημέρωση κώδικα και δεν γνωρίζετε την έκδοση κώδικα, προσθέστε το `@since xxx` έτσι κι αλλιώς. Μπορεί στη συνέχεια, να αντικατασταθεί κατά τη συγχώνευση της ενημέρωσης κώδικα. |
| | 51 | * Το `@throws` προτιμάται από το `@exception` |
| | 52 | * ελέγξτε τις αλλαγές σας πριν από την ενημέρωση κώδικα/επικύρωση δημιουργώντας javadoc: `ant javadoc`, browse output messages; Αν διαπιστώσετε ότι η εκτέλεση του javadoc είναι αργή για όλα τα αρχεία, εκτελέστε το μόνο για τα τροποποιημένα αρχεία: |
| | 53 | |
| | 54 | {{{ |
| | 55 | svn diff --summarize | awk '{ print $2 }' | xargs javadoc -d javadoc |
| | 56 | # or |
| | 57 | git diff --name-only | xargs javadoc -d javadoc |
| | 58 | }}} |
| | 59 | |
| | 60 | === Ρύθμιση του Eclipse === |
| | 61 | [[Image(DevelopersGuide/StyleGuide:styleguide_compiler_16.png,700px)]] |
| | 62 | |
| | 63 | [[Image(DevelopersGuide/StyleGuide:ss1.png,700px)]] |
| | 64 | |
| | 65 | [[Image(DevelopersGuide/StyleGuide:ss2.png,700px)]] |
| | 66 | |
| | 67 | [[Image(DevelopersGuide/StyleGuide:ss3.png,700px)]] |
| | 68 | |
| | 69 | |
| | 70 | == Διεθνοποίηση == |
| | 71 | |
| | 72 | * Βεβαιωθείτε ότι χρησιμοποιείτε το `tr(...)` για όλες τις μεταφραζόμενες συμβολοσειρές |
| | 73 | {{{ |
| | 74 | #!java |
| | 75 | import import static org.openstreetmap.josm.tools.I18n.tr; |
| | 76 | |
| | 77 | // use tr(...) for exception messages |
| | 78 | // |
| | 79 | throw new Exception(tr("error message always in tr()")); |
| | 80 | |
| | 81 | // use tr(...) for labels, title, tooltip texts and the like |
| | 82 | // |
| | 83 | new JLabel(tr("Label always in tr()")); |
| | 84 | |
| | 85 | // etc. |
| | 86 | }}} |
| | 87 | |
| | 88 | * μην συναρμολογείτε μεταφρασμένα μηνύματα με `+`. Χρησιμοποιήστε ειδικούς χαρακτήρες αντικατάστασης. |
| | 89 | |
| | 90 | **ΜΗΝ** |
| | 91 | `new JLabel(tr("My Label " + labelId));` |
| | 92 | |
| | 93 | **ΚΑΝΤΕ ΤΟ** |
| | 94 | `new JLabel(tr("My Label {0}",labelId));` |
| | 95 | |
| | 96 | Μοναδική εξαίρεση: Το `+` μπορεί να χρησιμοποιηθεί για να διακόψει μεγάλες γραμμές μη μεταβλητών κειμένων. |
| | 97 | Οι ειδικοί χαρακτήρες αντικατάστασης είναι υποχρεωτικοί σε απλές μεταφράσεις. |
| | 98 | |
| | 99 | * Όταν χρησιμοποιείτε απόστροφο μέσα σε μεταφράσιμη συμβολοσειρά, πρέπει να διαφεύγει με μία δεύτερη απόστροφο (όπως το backslash στην C):[[BR]] |
| | 100 | {{{#!java |
| | 101 | new JButton(tr("Don''t press me!")) |
| | 102 | }}} |
| | 103 | |
| | 104 | * Ένα περιβάλλον μετάφρασης μπορεί να οριστεί με `trc(...)`. Πρόσθετες συμβουλές για τους μεταφραστές δίνονται από σχόλια java στη συνάρτηση: |
| | 105 | {{{#!java |
| | 106 | /* I18n: house number, street as parameter; place number first for visibility */ |
| | 107 | msg = tr("House number {0} at {1}", s, t); |
| | 108 | }}} |
| | 109 | |
| | 110 | * Χρησιμοποιήστε `trn(...)` για να επιτρέψετε στους μεταφραστές να επιλέξουν τον πληθυντικό για τη συγκεκριμένη γλώσσα: |
| | 111 | {{{#!java |
| | 112 | msg = trn("Object deleted", "Objects deleted", del.size(); |
| | 113 | |
| | 114 | // or with placeholders: |
| | 115 | // |
| | 116 | new JButton(trn(/* I18n: times needed, some name as parameter */ |
| | 117 | "Press {1} {0} times!", n, n, someName)) |
| | 118 | |
| | 119 | // The English singular source string must be given for identification |
| | 120 | // even when its logically invalid and won't occur. For consistency |
| | 121 | // the number placeholder should be set in it. |
| | 122 | // |
| | 123 | msg = trn("Combine {0} way", "Combine {0} ways", n, n); |
| | 124 | }}} |
| | 125 | |
| | 126 | Στα τμήματα πληθυντικού δεν είναι υποχρεωτικοί οι ειδικοί χαρακτήρες αντικατάστασης για τους μεταφραστές. |
| | 127 | |
| | 128 | ---- |
| | 129 | Πίσω στο [wikitr:/DevelopersGuide Οδηγός για Προγραμματιστές] |
| | 130 | |
| | 131 | |
| | 132 | |