| | 1 | [[TranslatedPages(revision=38)]] |
| | 2 | = Utviklingsretningslinjer = |
| | 3 | |
| | 4 | [[PageOutline(2-2,Innholdsfortegnelse,inline)]] |
| | 5 | |
| | 6 | == Hvordan koden din bør se ut == |
| | 7 | |
| | 8 | * sørg for at koden er kompatibel med Java 11 |
| | 9 | * **Dokumenter** koden din ved hjelp av inline-kommentarer og javadoc. Mange vil takke deg :) |
| | 10 | * Prøv å unngå offentlige felt |
| | 11 | * JOSM har mange hjelpemetoder i klassene `Utils`, `GuiUtils`, `Geometry` ... Bruk dem hvis du trenger det |
| | 12 | * Sjekk parametere. Du kan bruke `Objects.requireNonNull`. |
| | 13 | * Ikke skriv for ytelse - skriv for lesbarhet. Bruk `Stream`s, `Function`s og andre Java 8+ funksjoner hvis de gjør koden mer lesbar. |
| | 14 | |
| | 15 | === Tråding / Låsing === |
| | 16 | |
| | 17 | * JOSM bruker ulike låsemekanismer, avhengig av objektet. |
| | 18 | * Datasett er beskyttet av en RW-lås. Noen metoder låser ikke automatisk av ytelsesgrunner. Sørg for å skaffe de nødvendige låsene for endringene dine. |
| | 19 | * GUI-komponenter skal bare endres i EDT-tråden |
| | 20 | * Foretrekk å bruke `SwingUtils.invokeLater` hvis du trenger å kjøre noe på UI-tråden |
| | 21 | * Mange lyttere kjører allerede i EDT-tråden (lagendringer) eller har en sentral manager som lar deg registrere lyttere som kjører i EDT (dataendringer, valgendringer). |
| | 22 | |
| | 23 | == Hvordan formateringen din bør se ut == |
| | 24 | |
| | 25 | * sørg for at det ikke er etterfølgende mellomrom |
| | 26 | * ikke bruk flere påfølgende tomme linjer |
| | 27 | * JOSM bruker 4 tegn innrykk og ingen tabulatorstopp. Hvis du bruker Notepad++, kan du endre standardinnrykket i "Innstillinger" -> "Språk" -> "Tabulatorinnstillinger" -> merk av for "Erstatt med mellomrom" (dette er permanent) eller med knappen "endre innrykksinnstillinger" i verktøylinjen (dette er en midlertidig innstilling og krever tillegget "Tilpass verktøylinje"). |
| | 28 | * legg til krøllparenteser for hver `if`, med mindre den følges av `return` (eller kanskje `throw`) |
| | 29 | * Du bør bruke **checkstyle** før patch/commit: `ant checkstyle` og sjekk `checkstyle-josm.xml`; hvis du synes det er tregt å kjøre checkstyle for alle filer, kjør bare for endrede filer: |
| | 30 | {{{ |
| | 31 | #!bash |
| | 32 | # sørg for at build2-katalogen eksisterer, hvis den ikke gjør det, kjør 'ant checkstyle-compile' først |
| | 33 | |
| | 34 | svn diff --summarize | awk '{ print $2 }' | grep "^[a-z]" | xargs \ |
| | 35 | java -classpath "build2:tools/checkstyle/checkstyle-all.jar" \ |
| | 36 | com.puppycrawl.tools.checkstyle.Main -c tools/checkstyle/josm_checks.xml |
| | 37 | # eller |
| | 38 | git diff --name-only | xargs \ |
| | 39 | java -classpath "build2:tools/checkstyle/checkstyle-all.jar" \ |
| | 40 | com.puppycrawl.tools.checkstyle.Main -c tools/checkstyle/josm_checks.xml |
| | 41 | }}} |
| | 42 | |
| | 43 | == Hvordan javadoc-en din bør se ut == |
| | 44 | * [https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#styleguide Oracle Javadoc-stilguide] brukes som basisguide |
| | 45 | * `@since` brukes for offentlige klasser og metoder (synlige for plugin-utviklere) med JOSM-revisjonen som introduserte elementet. Eksempel: `@since 5408` |
| | 46 | * `@since` oppdateres/legges til når en offentlig metode signatur endres eller hvis en klasse endres navn. |
| | 47 | * `@since` kan utelates for offentlige metoder og felt introdusert samtidig med klassen, forutsatt at de ikke har endret seg og klassen er riktig dokumentert. |
| | 48 | * Det kan være flere `@since`-merker, f.eks. for å legge til grensesnitt til en klasse. Grunnen til disse merkene bør legges til. Eksempel: `@since 12345 @FunctionalIterface ble lagt til` |
| | 49 | * Hvis du sender inn en patch og ikke kjenner revisjonen, legg til `@since xxx` uansett. Den kan erstattes når patchen din flettes. |
| | 50 | * `@throws` foretrekkes fremfor `@exception` |
| | 51 | * sjekk endringene dine før patch/commit ved å generere javadoc: `ant javadoc`, bla gjennom utdatameldinger; hvis du synes det er tregt å kjøre javadoc for alle filer, kjør bare for endrede filer: |
| | 52 | |
| | 53 | {{{ |
| | 54 | svn diff --summarize | awk '{ print $2 }' | xargs javadoc -d javadoc |
| | 55 | # eller |
| | 56 | git diff --name-only | xargs javadoc -d javadoc |
| | 57 | }}} |
| | 58 | |
| | 59 | === Konfigurering av Eclipse === |
| | 60 | [[Image(DevelopersGuide/StyleGuide:styleguide_compiler_16.png,700px)]] |
| | 61 | |
| | 62 | [[Image(DevelopersGuide/StyleGuide:ss1.png,700px)]] |
| | 63 | |
| | 64 | [[Image(DevelopersGuide/StyleGuide:ss2.png,700px)]] |
| | 65 | |
| | 66 | [[Image(DevelopersGuide/StyleGuide:ss3.png,700px)]] |
| | 67 | |
| | 68 | |
| | 69 | == Internasjonalisering == |
| | 70 | |
| | 71 | * sørg for at du bruker `tr(...)` for alle lokaliserte strenger |
| | 72 | {{{ |
| | 73 | #!java |
| | 74 | import import static org.openstreetmap.josm.tools.I18n.tr; |
| | 75 | |
| | 76 | // bruk tr(...) for unntaksmeldinger |
| | 77 | // |
| | 78 | throw new Exception(tr("feilmelding alltid i tr()")); |
| | 79 | |
| | 80 | // bruk tr(...) for etiketter, titler, verktøytips og lignende |
| | 81 | // |
| | 82 | new JLabel(tr("Etikette alltid i tr()")); |
| | 83 | |
| | 84 | // osv. |
| | 85 | }}} |
| | 86 | |
| | 87 | * sammensett aldri lokaliserte meldinger med `+`. Bruk formatplassholdere i stedet. |
| | 88 | |
| | 89 | **IKKE GJØR** |
| | 90 | `new JLabel(tr("Min etikett " + labelId));` |
| | 91 | |
| | 92 | **GJØR** |
| | 93 | `new JLabel(tr("Min etikett {0}",labelId));` |
| | 94 | |
| | 95 | Unntak: `+` kan brukes til å bryte lange linjer med ikke-variable tekster. |
| | 96 | Plassholderne er obligatoriske i enkle oversettelser. |
| | 97 | |
| | 98 | * Når du bruker apostrof i kildestrengen, må den escapes med en annen apostrof (som backslash i C):[[BR]] |
| | 99 | {{{#!java |
| | 100 | new JButton(tr("Ikke trykk på meg!")) |
| | 101 | }}} |
| | 102 | |
| | 103 | * En oversettelseskontekst kan settes med `trc(...)`. Ytterligere hint til oversettere gis av java-kommentarer ved funksjonen: |
| | 104 | {{{#!java |
| | 105 | /* I18n: husnummer, gate som parameter; plasser nummer først for synlighet */ |
| | 106 | msg = tr("Husnummer {0} ved {1}", s, t); |
| | 107 | }}} |
| | 108 | |
| | 109 | * Bruk `trn(...)` for å la oversettere velge det språkspesifikke flertallet: |
| | 110 | {{{#!java |
| | 111 | msg = trn("Objekt slettet", "Objekter slettet", del.size(); |
| | 112 | |
| | 113 | // eller med plassholdere: |
| | 114 | // |
| | 115 | new JButton(trn(/* I18n: nødvendige ganger, noe navn som parameter */ |
| | 116 | "Trykk {1} {0} ganger!", n, n, someName)) |
| | 117 | |
| | 118 | // Den engelske entallsstrengen må oppgis for identifikasjon |
| | 119 | // selv når den er logisk ugyldig og ikke vil forekomme. For konsistens |
| | 120 | // bør nummerplassholderen settes i den. |
| | 121 | // |
| | 122 | msg = trn("Kombiner {0} vei", "Kombiner {0} veier", n, n); |
| | 123 | }}} |
| | 124 | |
| | 125 | I flertallssegmenter er ingen plassholder obligatorisk for oversettere. |
| | 126 | |
| | 127 | ---- |
| | 128 | Tilbake til [wikitr:/DevelopersGuide Utviklerveiledning] |