Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Design rules die waren goedgekeurd opgenomen #138

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 190 additions & 0 deletions Design rules/Diversen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
---
layout: page-with-side-nav
title: API Kennisbank
---

## 4. Diversen

### DR4.1 Identificatie van een resource zit altijd op het hoogste niveau van de resource

De identificatie van een resource zit altijd op het hoogste niveau van de resource. Als de identificatie als parameter wordt gebruikt is dat in de vorm en inhoud zoals de identificatie is opgenomen in de resource.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

### DR4.2 Neem voor properties geen waarden op met een speciale betekenis

We nemen geen waarden op met een speciale betekenis die afwijkt van de normale betekenis van het gegeven.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Volgens mij is er van 'opnemen' sowieso geen sprake maar meer van toestaan. N.m.m. dus wijzigen in:

We staan voor een gegeven geen waarden toe met een speciale betekenis, een betekenis die afwijkt van de normale betekenis van het gegeven.


bijvoorbeeld datum "0000-00-00" om aan te geven dat een datum onbekend is
bijvoorbeeld landcode "0000" om aan te geven dat het land onbekend is

Ratio: Als er informatie beschikbaar is moet die als zondanig onderkend en gemodelleerd worden.
Copy link
Contributor

@melsk-r melsk-r May 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bijvoorbeeld door in de bovenstaande voorbeelden een datumOnbekend en landOnbekend te modelleren.

Wellicht in deze DR ook verwijzen naar DR 2.9.


Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

### DR4.3 De description van een property moet semantisch overeenkomen met de betekenis van het gegeven in een gegevenswoordenboek (infromatiemodel)

We nemen bij een property een description op die semantisch overeenkomt met de beschrijving in het gegevenswoordenboek. Deze kan ingekort, vereenvoudigd, of uitgebreid zijn, maar mag de betekenis van het gegeven niet laten afwijken van de betekenis van het corresponderende gegeven in het gegevenswoordenboek.

De description kan worden weggelaten wanneer evident is dat de gebruikers van de API uit de propertynaam weten wat bedoeld wordt (bijvoorbeeld huisnummer).

_**Ratio:**_ Om de description leesbaar te houden voor developers kan ervoor gekozen worden deze in te korten of
binnen de context te vereenvoudigen.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

## DR4.4 Als meerdere componenten dezelfde properties bevatten (generalisatie) gebruik dan de 'allOf' om deze samenhang vorm te geven.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg 1 '#' toe anders staat deze paragraaf op hetzelfde niveau als de paragraaf in regel 6.


Wanneer er meerdere componenten zijn met meerdere dezelfde properties, moet er hergebruik worden gemaakt via een 'allOf' constructie. Dit sluit aan op object oriëntatie in de verschillende programmeeromgevingen.

Bijvoorbeeld een woonadres en een postadres zijn identiek, behalve dat postadres ook een postbusnummer kent. Dan is postadres een extensie op woonadres.
Bijvoorbeeld een natuurlijk persoon en een niet-natuurlijk persoon hebben beide een naam en een adres, maar beide hebben ook eigen gegevens (natuurlijk persoon heeft geboortedatum, niet-natuurlijk persoon heeft eigenaar), dan zijn beide een extensie op een bovenliggende component "Persoon".
Bijvoorbeeld bij een zakelijkGerechtigde worden alleen minimale identificerende gegevens van een persoon opgenomen (alleen naam en identificatie), maar bij de persoon (resource) worden meer eigenschappen van de persoon opgenomen (zoals adres). Dan gebruikt zakelijkGerechtigde het component "persoonBeperkt" en is de uitgebreide persoon een extensie hierop.

Voorbeeld:

```
Adres:
type: "object"
properties:
straat:
type: "string"
example: "Nassaulaan"
huisnummer:
type: "integer"
example: 12
postcode:
type: "string"
example: "2514JS"
woonplaats:
type: "string"
example: "Den Haag"

PostAdres:
allOf:
- $ref: "#/components/schemas/Adres"
- properties:
postbusnummer:
type: "integer"
example: 300
```

## DR4.5 Plaats bij het gebruik van 'allOf' het hergebruikte component als eerste.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg 1 '#' toe anders staat deze paragraaf op hetzelfde niveau als de paragraaf in regel 6.


Bij het gebruik van 'allOf' staat de component die hergebruikt wordt altijd eerst, en staan de toegevoegde properties als tweede.

Voorbeeld van het correct gebruik van 'allOf':

```NaamPersoon:
allOf:
- $ref: "#/components/schemas/Naam"
- description: "Gegevens over de naam van de persoon"
properties:
aanhef:
type: "string"
```

Voorbeeld van _**foutief**_ gebruik van 'allOf':
```
NaamPersoon:
allOf:
- description: "Gegevens over de naam van de persoon"
properties:
aanhef:
type: "string"
- $ref: "#/components/schemas/Naam"
```

_**Ratio:**_ Afwijken van deze regel leidt tot problemen bij het genereren van code uit de API specificaties.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

## DR4.6 Bij het gebruik van 'allOf' is er slechts 1 component waarnaar gerefereerd wordt
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg 1 '#' toe anders staat deze paragraaf op hetzelfde niveau als de paragraaf in regel 6.


Bij gebruik van allOf is er altijd exact één component waarnaar gerefereerd wordt en één gedefinieerd object met ten minste één property.

Voorbeeld van het foutief gebruik van allOf:

```
NaamPersoon:
allOf:
- $ref: "#/components/schemas/Naam"
- $ref: "#/components/schemas/Aanschrijfwijze"
- description: "Gegevens over de naam van de persoon"
properties:
aanhef:
type: "string"
```

Er wordt hier uit twee componenten overgeërfd wat niet correct is.

Voorbeeld van het foutief gebruik van allOf:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dit voorbeeld gaat niet in tegen deze Design Rule. Er is immers slechts 1 component waarnaar gerefereerd wordt.
Ik denk dat dit een andere Design Rule is.

```
NaamPersoon:
allOf:
- $ref: "#/components/schemas/Naam"
- description: "Gegevens over de naam van de persoon"
```

NaamPersoon heeft geen eigen properties wat niet correct is.

Voorbeeld van correct gebruik van allOf:

```
Naam:
type: "object"
properties:
geslachtsnaam:
type: "string"
description: |
De achternaam van een persoon.
example: "Vries"
voorletters:
type: "string"
description: |
De voorletters van de persoon, afgeleid van de voornamen.
example: "P.J."

NaamPersoon:
allOf:
- $ref: "#/components/schemas/Naam"
- description: "Gegevens over de naam van de persoon"
properties:
aanhef:
type: "string"
aanschrijfwijze:
type: "string"
```

_**Ratio:**_

Afwijken van deze regel leidt tot problemen bij het genereren van code uit de API-specificaties.

Datum opname: 15-04-2021
Datum wijziging: 15-04-2021

















Wanneer er meerdere componenten zijn met meerdere dezelfde properties, moet er hergebruik worden gemaakt via een 'allOf' constructie. Dit sluit aan op object oriëntatie in de verschillende programmeeromgevingen.
Copy link
Contributor

@melsk-r melsk-r May 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Waar dienen de bovenstaande witregels voor?
Als deze en onderstaande regels niet bij DR4.6 horen dan wellicht een aparte Design Rule opvoeren of een paragraaf zonder Design Rule opvoeren.

Ik zie trouwens dat deze regels een kopie zijn van de regels 41 t/m 45 dus wellicht kunnen ze weg.


Bijvoorbeeld een woonadres en een postadres zijn identiek, behalve dat postadres ook een postbusnummer kent. Dan is postadres een extensie op woonadres.
Bijvoorbeeld een natuurlijk persoon en een niet-natuurlijk persoon hebben beide een naam en een adres, maar beide hebben ook eigen gegevens (natuurlijk persoon heeft geboortedatum, niet-natuurlijk persoon heeft eigenaar), dan zijn beide een extensie op een bovenliggende component "Persoon".
Bijvoorbeeld bij een zakelijkGerechtigde worden alleen minimale identificerende gegevens van een persoon opgenomen (alleen naam en identificatie), maar bij de persoon (resource) worden meer eigenschappen van de persoon opgenomen (zoals adres). Dan gebruikt zakelijkGerechtigde het component "persoonBeperkt" en is de uitgebreide persoon een extensie hierop.
6 changes: 6 additions & 0 deletions Design rules/Naamgeving.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,9 @@ _**Ratio:**_ Het is niet eenduidig of een einddatum een "tot"-datum is of een "t

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

## DR1.7 Wanneer pas je enkelvoud of meervoud toe in propery-namen

Als het een propertynaam is die verwijst naar eenb gerelateerde resource dan wanneer wordt de resourcenaam enkelvoud als de gerelateerde resource één keer kan voorkomen. Wanneer de gerelateerde resource meerdere keren kan voorkomen, wordt de resourcenaam in meervoud gebruikt.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Als het een propertynaam is die verwijst naar een gerelateerde resource dan wanneer wordt de resourcenaam in enkelvoud uitgedrukt als de gerelateerde resource slechts één keer kan voorkomen. Wanneer de gerelateerde resource meerdere keren kan voorkomen, wordt de resourcenaam in meervoud uitgedrukt.


Als properties of gegevensgroepen meermaals kunnen voorkomen (arrays) wordt meervoud toegepast. Anders wordt enkelvoud toegepast.
142 changes: 142 additions & 0 deletions Design rules/Waarden.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
---
layout: page-with-side-nav
title: API Kennisbank
---


# 2. Waarden, enumeraties en dynamische lijsten

### DR2.1 Voor het uitdrukken van tijdsduur gebruiken we de ISO-8601 standaard
Een toelichting is [hier](https://nl.wikipedia.org/wiki/ISO_8601) te vinden.

_**Ratio:**_
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg regel 12 en 14 samen zodat Ratio's consistent worden opgemaakt.


Dit is een veelgebruikte internationale standaard.

Datum opname : 17-02-2021
Datum wijziging : 29-04-2022 (Toelichting van ISO-8601 standaard toegevoegd)

### DR2.2 Gebruik een boolean voor Ja/Nee of waar/onwaar

Eigenschappen die functioneel alleen de waarde Ja/aan/waar of Nee/uit/onwaar kunnen hebben, worden gedefinieerd als boolean. We gebruiken dus geen enumeratie zoals [J,N] voor dit soort situaties.

_**Ratio:**_ Een boolean is technisch eenduidiger en beter verwerkbaar voor developers.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

### DR2.3 Dynamische domeinwaarden worden in de query-parameters met de code opgenomen

Voor een query-parameter waarin een entry uit een waardelijst of een landelijke tabel als selectie-criterium wordt gebruikt wordt de code van de entry gebruikt.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'Voor een query-parameter ...' --> 'Voor de waarden van een query-parameter ...'


_**Ratio:**_ De omschrijving is human readable tekst. Daar kunnen verschillen in staan, bijvoorbeeld hoofd- of kleine letters. Voor een computer een verschil, voor een mens niet. Daarnaast levert het gebruik van codes ook kortere URL's op.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

### DR2.4 Enumeratie-waarden zijn in snake_case

Voor de waarden van enumeraties wordt snake_case toegepast. Deze bevatten dus alleen kleine letters, cijfers en underscores. Geen spaties, geen speciale tekens en geen hoofdletters.

_**Ratio:**_ In sommige development-omgevingen leveren hoofdletters, spaties of speciale tekens in enumeratie-waarden een probleem op met code-genereren.

Datum opname : 17-02-2021
Datum wijziging : 17-02-2021

### DR2.5 Schema componentnamen voor domeinwaarden en enumeraties krijgen een vaste extensie

Schema componenten voor dynamische domeinwaarden (referentielijsten zoals "Tabel 32 Nationaliteitentabel") en enumeraties krijgen respectievelijk extensie "Tabel" en "Enum" zonder de toevoeging van underscores.

_**Ratio:**_ Vaak heeft de property dezelfde naam als de enumeratie die aangemaakt wordt. Onderscheid is dan prettig en soms zelfs nodig i.r.t. codegenratie. Hetzelfde argument geldt voor referentielijsten.

Datum opname : 29-04-2021
Datum wijziging : 29-04-2021

## DR2.6 Beperk de lengte van enumeratiewaarden

De lengte van enumeratiewaarden wordt beperkt. Bijvoorbeeld "Opstalhouder Nutsvoorzieningen op gedeelte van perceel" krijgt als waarde "nutsvoorzieningen_gedeelte". Het is aan de API-designer en de betreffende community om de toe te passen waarden te bepalen. Gebruik alleen enumeraties als de waarde kort, zelfbeschrijvend en stabiel is.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

De laatste zin van deze alinea riekt naar een eigen Design Rule. Het kenmerk 'stabiel' heeft nl. niets met de lengte van doen.
Dat daargelaten zou ik trouwens verwachten dat die zin als volgt was gedefinieerd:

Gebruik alleen enumeratiewaardes die kort, zelfbeschrijvend en stabiel zijn.


Als er behoefte is aan lange enumeratiewaarde is een referentielijst mogelijk een beter alternatief. Ook als de waarden van de betreffende lijst mutabel is is een referentielijst een betere keuze.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'enumeratiewaarde' --> 'enumeratiewaarden'


Mocht het toch van belang zijn de lange omschrijving te delen met de comsumer-developer, dan kan deze lange omschrijving opgenomen worden in de description van de enumeratie. Indien gewenst zou deze lange omschrijving dan additioneel aangeboden kunnen worden als property.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'comsumer-...' --> 'consumer-...'


'''
taal:
type: string
description: |-
De taal afkorting volgens ISO 639-2:
* dut - Dutch
* eng - English
enum:
- dut
- eng
taalWeergave:
type: string
description: De volledige naam van de taal
'''

_**Ratio:**_
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg regel 78 en 79 samen.

Vanuit developer-perspectief zijn lange enumeratiewaarde onprettig om mee te werken. Ook het tonen van enumeratiewaarden in de User Interface wordt complex als de enumartiewaarden te onnodig lang zijn.
Copy link
Contributor

@melsk-r melsk-r May 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'enumartiewaarden' --> 'enumeratiewaarden'
'te onnodig lang' --> 'onnodig te lang'


Datum opname : 29-04-2022
Datum wijziging : 29-04-2022

## DR2.7 Gebruik betekenisvolle enumeratiewaarden

Gebruik enumeratiewaarden die betekenisvol en begrijpelijk zijn. Dus niet M en V, maar man en vrouw. Hierbij moet een afweging gemaakt worden met het toepassen van Design Rule DR2.6

_**Ratio:**_
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg regel 88 en 89 samen.

Een developer moet bij het coderen begrijpen wat de code betekent, om fouten in de implementatie te voorkomen.

## DR2.8 Overweeg een enumeratiewaarde weer te geven als string in een bevraging-API

Het toepassen van een enumratie brengt het risico van tight coupling en breaking changes met zich mee.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'enumratie' --> 'enumeratie'


Indien een attribuut in het informatiemodel voorkomt als enumeratie, maar de corresponderende property komt alleen voor in de response op een bevraging om aan gebruikers te worden getoond dan is het niet nodig het ook in de API specificaties als een enumeratie te definiëren.

Wanneer de enumeratiewaarde gebruikt wordt in code (algoritmes), definieer dan betekenisvolle maar bondige enumeratiewaarden.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dit lijkt mij al in DR2.7 verwoord en mag hier dus worden verwijderd.


_**Ratio:**_
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voeg regel 99 en 101 samen.


Het opnemen van een enumeratie in de API-definitie betekent dat voor het kunnen tonen van een nieuwe of gewijzigde waarde in de enumeratie een nieuwe versie van de API moet worden uitgebracht. Voor bevraging-API's is dat een ongewenste vorm van tight coupling.

Als het gegeven echter wordt gebruikt in code (algoritme) dan is het van belang dat er niet afgeweken kan worden van de bekende waarden en is een definitie als enumeratie op zijn plaats.

## DR2.9 Neem een indicator op om de betekenis "magic strings" expliciet te maken.

Wanneer het gevuld zijn van een datum functionele betekenis heeft, ook wanneer deze volledig onbekend is, wordt een indicator opgenomen om dit aan te geven. Als bv een datum veld de waarde "00000000" bevat en dat betekenis heeft wordt niet deze ongeldige waarde opgenomen in een date-veld, maar wordt een indicator toegevoegd.

Indien in het onderstaande voorbeeld er helemaal niets bekend is van de overlijdensdatum, maar er is wel bekend dat de persoon overleden is, dan kan dat nergens uit worden afgeleid. Uit de reponse kan je niet opmaken of de overlijdensdatum leeg is omdat iemand niet is overleden of omdat de overlijdensdatum niet bekend is.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'... omdat iemand niet is ...' --> '... omdat iemand niet is ...' (spatie verwijderd)


```
Persoon:
type: object
description: "Natuurlijkpersoon of NietNatuurlijkPersoon"
properties:
identificatie:
type: string
datumOverleden:
$ref: "#/components/schemas/TypePersoonEnum"type: string
voorletters:
type: string
```

Door voor een dergelijke situatie een boolean op te nemen waar de betreffende informatie wordt gerepresenteerd wordt duidelijk wat de situatie is zonder dat er invalide waardes hoeven te worden opgenomen in de datum-velden.

```
Persoon:
type: object
description: "Natuurlijkpersoon of NietNatuurlijkPersoon"
properties:
identificatie:
type: string
datumOverleden:
$ref: "#/components/schemas/TypePersoonEnum"type: string
indicatieOverleden:
type: boolean
voorletters:
type: string
```

_**Ratio:**_
Copy link
Contributor

@melsk-r melsk-r May 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hier geef je als Ratio een voorbeeld, de ratio is volgens mij echter nooit een voorbeeld maar legt uit waarom we dit zo doen. Hier zou je i.i.g. al aan kunnen geven dat we op deze wijze voldoen aan DR4.2 maar wellicht kunnen we codeertechnische redenen aanvoeren waarom dit beter is. Zo vermoed ik dat tegen deze wijze van modelleren eenvoudiger te programmeren is.

Voeg ook regel 141 en 142 samen.

Bijvoorbeeld of een persoon overleden is kan niet worden afgeleid uit het bestaan van een overlijdensdatum wanneer die datum onbekend is. Daarvoor kan een boolean "indicatieOverleden" worden gedefinieerd.