Digitazione dinamica su tutto lo stack tecnologico: dove applicare la validità dei dati?

5

Negli ultimi due anni, ho giocato con le nuove tecnologie nei miei progetti collaterali. Come sviluppatore web, sono andato dal seguente (e ancora il seguente, al lavoro):

Lo stack tecnologico "classico"

  1. Moduli POST per browser Web per ...
  2. a C # -coded application server-side, che comunica con ...
  3. servizi esterni via XML, quindi in definitiva ...
  4. scrivere lo stato dell'applicazione su un database SQL.

Per usare un arrangiamento molto diverso:

Lo stack tecnologico completamente dinamico

  1. Browser Web che invia XmlHttpRequests a ...
  2. un Node.js con codice JavaScript codificato sul lato server, che comunica con ...
  3. altri servizi esterni tramite servizi RESTful in JSON, in definitiva ...
  4. scrivere lo stato dell'applicazione in un database non SQL

È arrivato al punto in cui il mio intero stack ha assolutamente nessuna applicazione di tipo o schema, ovunque .

Ora, questo è stato benissimo prima, quando si consumano servizi web di altri. Potrebbe anche essere andato bene fino a quando i database SQL non sono stati abbandonati (insieme ai loro schemi DB). Ma ora sono bloccato a:

Dove posso dichiarativamente definire qual è la struttura valida dei dati del mio dominio aziendale?

Voglio far valere la validità dei dati prima di rendere pubblicamente disponibili i miei progetti - dopo tutto, cosa impedisce a qualcuno di inviare solo dati non validi ai miei servizi, e di utilizzarli tutti come un semplice provider di database libero da hacky? Ad un certo punto, si deve far rispettare che "questo servizio web accetterà solo una raccolta di almeno un X. X deve contenere A, B e facoltativamente C".

La prima soluzione che ho pensato era di fare la convalida all'interno del mio node.js, attraverso un grosso blocco di codice imperativo / if-elses / etc. Questo mi sembrava sbagliato.

Utilizzo CouchDB e per un po 'ho pensato che sarebbe stato meglio inserire il codice di convalida nei _update handler. Almeno stiamo eseguendo la convalida come parte della persistenza, ma è ancora un brutto blocco imperativo.

Successivamente, ho esaminato i linguaggi dello schema JSON. Non c'è uno standard per quanto posso vedere e non ero sicuro delle molteplici soluzioni offerte. Potrei creare il mio, ma poi espanderei solo il corpo dei linguaggi di schema JSON non standard.

XML? Potrei inserire X in AJAX e averli convalidati sullo schema sul lato server. Tuttavia, ciò non sembra seguire le tendenze nello sviluppo del software. Nessuno dei due avrebbe usato un archivio dati XML invece di un livello di persistenza MongoDB CouchDB / BSON JSON.

Quindi, sono bloccato. Idee?

TL; DR dove definisco in modo dichiarativo la struttura valida dei dati del mio dominio aziendale quando non utilizzo alcun linguaggio statico orientato agli oggetti e nessun database SQL legato allo schema nel mio stack tecnologico? È possibile che ci sia qualche tipo di tipizzazione statica (o schema DB, o XML validato) da qualche parte per uno stack tecnologico che abbia senso? Se sì, dove?

    
posta Stoive 10.05.2012 - 06:46
fonte

3 risposte

4

Mi sembra che tu stia per creare una piattaforma interna per compensare la mancanza di semantica inerente la lingua che hai scelto.

Anche definizioni dello schema (sia XML DTD, o schema JSON o schema di mangusta ) non ti fornirà la sicurezza dell'analisi statistica. Tutto ciò che puoi veramente usare per garantire che il tuo sistema non si comporti silenziosamente in un comportamento indefinito e alla fine fallisca.

Non sono proprio sicuro del motivo per cui non userai una lingua, che fornisce semplicemente questo fuori dalla scatola. Usare un linguaggio tipizzato dinamicamente e incorporare vincoli di tipo in questo sembra combinare il peggio di entrambi i mondi. Ancor di più, perché i linguaggi tipizzati in modo moderno sono in grado di dedurre implicitamente vaste parti di tali vincoli.

Personalmente ti suggerisco di dare un'occhiata a Haxe Back-end JavaScript . C'è un sito dedicato allo sviluppo di node.js con Haxe - potresti iniziare da lì. I tipi anonimi di Haxe possono essere rapidamente utilizzati per legare i sorgenti JSON in modo sicuro, senza sovraccarico di runtime. Tuttavia, se lo desideri, le sue strutture di meta-programmazione ti consentono di generare automaticamente il codice di convalida da quello al momento della compilazione.

Ovviamente Haxe non è di gran lunga l'unica opzione disponibile per indirizzare JavaScript in modo tipicamente sicuro. Quindi, se ritieni di aver bisogno dei benefici della digitazione statica, dovresti investire il tempo per trovare una lingua di tuo gradimento, che in realtà incorpori queste informazioni direttamente nella sua semantica staticamente analizzabile.

    
risposta data 10.05.2012 - 08:03
fonte
2

Elimina la nozione di tipi del tutto.

L'intero punto della digitazione dinamica, almeno nelle lingue che lo fanno per lo più corretto, è che non devi pensare ai tipi il più delle volte. Le verifiche di tipo hanno senso in un linguaggio precompilato, perché il compilatore può quindi rilevare molti errori prima ancora di tentare di eseguire il codice, ma quando il codice è interpretato o compilato con JIT, i vantaggi dei controlli di tipo statici sono marginale e non pesa sulla flessibilità aggiunta che la programmazione dinamica ha da offrire.

Invece di convalidare i tipi, convalidare i valori - cioè, se vuoi che qualcosa sia numerico, esegui un controllo 'is-numerico'. Se vuoi che qualcosa abbia una certa proprietà, controlla se la proprietà esiste. Se vuoi che qualcosa sia in un certo intervallo, controlla se è effettivamente all'interno dell'intervallo. Ecc. Ecc.

Ci sono due filosofie: il check-before-you-go più tradizionale, ovvero, prima di dividere a per b , ci si assicura che b sia diverso da zero; e il percorso Python più facile da chiedere-perdonare-di-prendere, cioè, basta dividere a di b , e poi catturare l'eccezione di divisione per zero in seguito.

Sfortunatamente, non c'è un modo significativo di farlo in modo dichiarativo di cui io sia a conoscenza. Ma poi, il confine tra codice e dati è molto più sfocato nella programmazione dinamica: il codice è anche un dato che è possibile manipolare ei dati possono assumere il ruolo di codice. Un pezzo di codice javascript che convalida un oggetto JSON è solo un altro pezzo di testo e puoi trattarlo come semplici vecchi dati; puoi anche generare quel testo in fase di esecuzione e poi eseguirlo (anche se dovresti fare molta attenzione, specialmente se usi i dati da fonti non attendibili nel processo di generazione del codice).

Per quanto riguarda gli schemi, ancora una volta, controllare rigorosamente se un determinato oggetto JSON corrisponde a uno schema è raramente necessario - invece, basta controllare se le proprietà richieste sono presenti e se le invarianti a livello di valore sono valide. Se esistono proprietà extra, va bene - semplicemente le ignori. Se manca qualcosa, puoi salvare o sostituire un valore predefinito. E se qualcosa ha il tipo sbagliato, di nuovo, puoi eseguire il bail (trova una stringa non numerica in cui era previsto un numero), oppure puoi recuperare con garbo (sostituire un valore predefinito, arrotondare, troncare, convertire in booleano, ecc.).

Un'altra cosa da considerare è che XML è molto più complesso di JSON - XML ha namespace, attributi, entità e devi decidere come effettuare il marshalling tra gli oggetti nella tua lingua e le rappresentazioni XML. In JSON, la scelta è generalmente ovvia: è scalare (int, float, string, boolean, null), una semplice lista (array) o una collezione di valori-chiave (oggetto).

Sfortunatamente, ci sono poche lingue (se ce ne sono) che ottengono il tipo di casting trasparente a destra - Javascript, PHP, Python, tutte richiedono occasionalmente giocoleria di tipo esplicito, quindi non sarai in grado di raggiungere la situazione teoricamente ideale.

    
risposta data 10.05.2012 - 08:00
fonte
2

Come il tuo stack di programmazione non si preoccupa dei tipi, perché dovresti.

La risposta è che i tuoi utenti potrebbero. Quindi quello che vuoi fare è applicare le regole aziendali applicabili ai tuoi dati.

Questo può essere fatto da JavaScript sui moduli immessi, codificando la convalida nel codice del tuo server Node.js quando viene ricevuta una richiesta, o anche codificando le regole in xsd e ottenendo che il parser convalidi l'input xml.

Il punto è implementare la convalida delle regole di business e non la convalida tecnica. Dovresti controllare le regole come "Un numero a tre cifre compreso tra 001 e 700" che significa qualcosa per il tuo utente finale, piuttosto che "questo è numerico". Quindi se il tuo utente pensa che "La notte prima di Natale" è una data valida e la tua applicazione può convivere con essa, allora è una data valida.

    
risposta data 10.05.2012 - 08:36
fonte

Leggi altre domande sui tag