2012-01-18 14 views
9

Sto cercando un modo di rappresentare graficamente oggetti JavaScript ...UML per javascript?

So che c'è UML, ma per esempio, come rappresentare i catena tra 2 oggetti, come ad esempio:

var a, b; 

a = {}; 
b = Object.create(a); 

Intuitivamente, mi piacerebbe disegnare qualcosa di simile:

+-----+ 
|b | 
|-----| 
|  | 
+--+--+ 
    |  +-----+ 
    +---->|a | 
     |-----| 
     |  | 
     +-----+ 

ma c'è una rappresentazione decente in UML?

E che dire di mixins?

c = $.extend({}, a, b) 

+-----+   +-----+ 
|a |   |b | 
|-----|   |-----| 
|  |<----------|  | 
+-----+   +-----+ 
    +  +-----+ 
    |  |c | 
    |  |-----| 
    +---->|  | 
     +-----+ 

risposta

3

Sembra che si stia tentando di mostrare la relazione tra istanze di oggetto in un diagramma di classi. Questo non funzionerà davvero; probabilmente vorrai provare a utilizzare un diagramma di istanza UML (potrebbe anche essere chiamato un diagramma di oggetti). Un diagramma di classe ha lo scopo di catturare i concetti di sistema, la loro struttura e le loro relazioni in modo statico. Può essere d'aiuto iniziare con un diagramma di classe e poi passare a un diagramma di istanze in cui è possibile collegare alcuni valori nelle "slot" o proprietà delle istanze dell'oggetto per vedere se il modello nel diagramma di classe funziona.

6

La prima cosa che devi sapere è che JavaScript utilizza prototype-based inheritance. Ciò significa che non vi è alcuna distinzione tra classi e istanze come in altri linguaggi OO (come Java). Ci sono solo oggetti. Una delle implicazioni è che la differenziazione tra class e object diagrams non ha senso.

Per il vostro primo esempio:

var a, b; 

a = {}; 
b = Object.create(a); 

Questa è l'eredità - oggetto b eredita proprietà dell'oggetto a.

modo corretto per modellare questo UML è questo diagramma classe/oggetto:

object b inherits from object a

Mixin può essere visto come una forma di ereditarietà multipla, oggetto c eredita oggetti di oggetto a e b, diagramma per che potrebbe assomigliare a questo:

object c inherits from a and b

+1

Non del tutto preciso che non ci siano differenze tra un oggetto e la sua classe. Almeno non da un punto di vista teorico. Ogni oggetto ha un determinato tipo. Qualsiasi oggetto con lo stesso prototipo deriva dallo stesso tipo e qualsiasi oggetto con lo stesso prototipo e le stesse proprietà dell'oggetto hanno lo stesso tipo. Quindi puoi avere e sono probabilmente in grado di avere più oggetti rispetto ai tipi. Ciò tuttavia non inficia il tuo punto :) –

+0

Un modo tecnicamente più corretto per dire che non esiste alcuna rappresentazione della classe in JavaScript. – ArtB

+0

Poiché ci sono stati alcuni anni da questo post. Consentitemi di chiarire a chiunque legge ciò che ECMAScript 2015 include ora le classi e non si allontana dall'ereditarietà basata su prototipi. [collegamento] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) – Nightforce2

0

I suoi esempi sono le relazioni che rappresentano anche tra oggetti, non classi, quindi il diagramma degli oggetti UML è la strada da percorrere (come già sottolineato da RobertMS).

Gli oggetti sono collegati tra loro, nel senso che (nel primo caso) oggetto a è il prototipo dell'oggetto b. Vorrei usare una relazione di dipendenza per questo. Wikipedia ha una buona descrizione della notazione di dipendenza UML here.

Il razionale per l'utilizzo di una dipendenza è che riflette la nozione che "una modifica all'elemento di modellazione influente o indipendente può influire sulla semantica dell'elemento di modellazione dipendente". Poiché spesso utilizziamo oggetti prototipo per contenere proprietà predefinite, nonché metodi, per una raccolta di oggetti "dipendenti" (ad es., oggetti della stessa "classe"), questo uso della dipendenza sembra giustificabile, se non forse un po 'controverso.

Vorrei etichettare la dipendenza con lo stereotipo "< proto >>".

UML ti offre molta flessibilità, sebbene sia piacevole seguire la convenzione.

C'è un buon trattamento degli schemi di oggetti su this page by Scott Ambler.

Nel secondo esempio, utilizzando la funzione extend di jQuery, non si dispone di una vera relazione prototipo, ma si uniscono le proprietà di alcuni oggetti in un altro oggetto. In questo caso, non sono sicuro che ci sia un termine di modellizzazione generale per questo. C'è una sorta di dipendenza qui, però. Suggerirei di consultare l'elenco degli stereotipi di dipendenza UML standard (elencati nella pagina di Wikipedia sopra menzionata) e vedere se qualcosa ha senso nella vostra applicazione specifica. Forse < < raffina >> funziona per te?

+0

Perché non utilizzare l'ereditarietà? Credo che sia più adatto in questo caso, perché l'ereditarietà indica una relazione molto più stretta tra due oggetti rispetto alla semplice dipendenza. Ignorerei che non dovresti usare diagrammi di classe, UML non è stato progettato pensando all'eredità basata sul prototipo. – romario333

+0

I _would_ utilizzare l'ereditarietà UML per JS _if_ l'esempio dell'OP era diverso, ad es. un censore di forma con un prototipo e un censore di Circle il cui prototipo era collegato a Shape.prototype! Ma l'OP mostrava solo oggetti singoli, e non mostrava mai nulla che mi sembrasse sottoclasse. Tutto ciò che riuscivo a vedere erano oggetti derivati ​​da altri oggetti. Se mai, nel primo esempio, è più come "a" è il "tipo" e "b" è "l'istanza" (è così che viene usato "Object.create"). Nessuna sottoclasse. Sono d'accordo con te, tuttavia, sul fatto che dovremmo sfruttare la flessibilità di UML e ignorare le cose dove necessario. –

+0

L'ereditarietà dell'utilizzo di 'Object.create' è piuttosto [pratica comune] (http://javascript.crockford.com/prototypal.html). Un altro motivo per cui credo che l'ereditarietà sia l'approccio migliore qui è che tutte le proprietà all'interno dell'oggetto "a" sono "ereditate" da "b", diventano parte dell'interfaccia di b. – romario333