2010-02-17 17 views
7

Sono nuovo alla programmazione orientata agli oggetti e sto lentamente imparando come applicarlo a javascript. Quindi, per favore abbiate pazienza con me. :)Qual è il modo corretto di controllare gli oggetti correlati in javascript?

ho due oggetti di base:

  1. "record", che contiene i metodi per la modifica di un singolo record da un set di record. (creare, salvare, caricare, ecc.)

  2. "recordList" che contiene i metodi per l'emissione di un elenco impaginato di titoli di record.

Vorrei che questi oggetti potessero funzionare insieme. Ad esempio, se viene chiamato record.save(), viene chiamato anche recordList.refresh(), in modo che l'elenco impaginato rifletta i dati aggiornati.

Per fare ciò, ho creato un terzo oggetto "controllo" che contiene istanze sia di "record" che di "recordList". Sto usando "controllo" nel modo seguente:

control = {} 

    control.record = object.create("record"); 
    control.recordList = object.create("recordList"); 

    control.save = function() { 

     this.record.save(); 
     this.recordList.refresh(); 

    }; 

Questo funziona. Ma mi chiedo, è corretto? (Voglio essere sicuro di non violare nessuna delle regole del design di OO nel fare ciò.) C'è un modo migliore?

Grazie in anticipo per il vostro aiuto.

+0

perché si desidera fornire oop in JavaScript? – Roman

+0

@Roman: Perché sto giocando con la creazione di un'app che fa un uso pesante di ajax. Di conseguenza, gran parte della logica è stata spostata dal back-end verso l'interno e verso l'alto. Il che complica un po 'il front-end. Quindi, potrebbe anche imparare OOP nella lingua in cui lo userò. :) – Travis

risposta

1

Parlando da una prospettiva OOP, non credo che un record si salverebbe. Un record in un database è semplicemente dati e il database stesso è ciò che fa le cose con quei dati, sia che si tratti di salvataggio o caricamento o ecc. Detto questo, farei registrare semplicemente un oggetto che contiene dati e creerebbe un oggetto recordset per interagire con i dati. All'interno dell'oggetto recordset puoi inserire la tua lista record e aggiornarla di conseguenza. Qualcosa di simile:

var recordset = function() { 
    var me = this; 
    var currentRecord = object.create("record"); 
    var recordList = object.create("recordList"); 
    me.save = function() { 
      //Insert record.save code here 
      recordList.refresh(); 
    }; 
}; 

Qualcosa da notare su quel codice. In quella configurazione non è possibile accedere a currentRecord e recordList dall'esterno della funzione e pertanto si dispone di incapsulamento, uno dei tratti distintivi di OOP. Questo perché la funzione recordset è una chiusura che "chiude" tutte le variabili all'interno, il che significa che ogni funzione all'interno ha accesso alle variabili nell'ambito del recordset.

Si potrebbe lasciare che il mondo esterno ottenere l'accesso attraverso le funzioni di ottenere o impostare:

me.getRecordList = function() { 
     return recordList.getArray(); //Not generally a good idea to simply return your internal object 
    }; 
+0

Grazie per le informazioni. Il consiglio di spostare alcuni dei metodi dal record e nell'oggetto di controllo sembra semplificare le cose. Saluti. Riguardo al tuo esempio di incapsulamento - è questo ciò a cui si riferiscono come il modello del modulo? – Travis

0

Se è una cosa che ho imparato nel corso del tempo, è che seguire qualsiasi paradigma della lettera si tradurrà in maggiore frustrazione e difficoltà rispetto a portare il concetto il più lontano possibile e usare il buon senso per dettare le proprie deviazioni.

Detto questo, la soluzione funzionerà correttamente ed è normale creare una classe contenitore per più oggetti di tipi diversi accoppiati. Se vuoi un altro modo per gestirlo, dai un'occhiata a Client Event Pooling. L'unica cosa che posso dire su ciò che hai fatto è essere sicuro che stai usando object.create come previsto.

Utilizzando questo metodo è possibile creare un evento che, una volta attivato, eseguirà una serie di altri comandi associati al proprio evento. L'ho usato con grande successo in tutti i tipi di applicazioni, dall'aggancio dell'evento previsto alla semplificazione delle iniezioni javascript inline dopo un postback.

Buona fortuna.

+0

Grazie - l'articolo sul pooling di eventi è interessante. Posso chiederti di chiarire cosa intendi usando object.create come è inteso? Grazie. – Travis

0

perché non si fornisce la registrazione alla registrazione?

var record = object.create("record"); 
record.recordList = object.create('recordList'); 
record.save = function(){ 
    /* 
     do something 
    */ 
    this.recordList.refresh(); 
} 
+0

Vedo cosa stai dicendo. Ma non penso che abbia senso, anche se funziona. Vale a dire, non ha senso che un singolo oggetto del record contenga un oggetto recordList, considerando cosa rappresenta ciascun oggetto. In realtà, l'app funziona già correttamente, proceduralmente. Quindi lo sto riscrivendo come esercizio per imparare OO. Ecco perché sono schizzinoso, cioè cercando di mantenere il modo in cui i miei oggetti interagiscono "significativi". :) Il record – Travis

+0

non contiene recordSet, contiene un puntatore al set di record, che utilizza, quindi non ci sono problemi con lo spreco di memoria o qualcos'altro, e in nessun modo si rompe l'app. – shiberz

+0

Se desideri esercitarti in OOP, dovresti decidere quale OO patern ti rendi conto - ORM o ActiveRecord - in realtà eseguono lo stesso, ma in modo diverso – shiberz

1

La soluzione è soddisfacente. Due piccoli suggerimenti per il miglioramento

  1. Utilizzare un nome più specifico del controllo (anche 'recordControl' è ok). Potresti finire con un sacco di controlli per diversi set di funzionalità.

  2. Utilizzare un oggetto letterale per creare l'intero oggetto. Mantiene il vostro codice più ordinato e più leggibile (e salva pochi byte)

(Ci scusiamo per la mancanza di distanza - editore non fare quello che voglio fare!)

recordControl = { 
     record : object.create("record"), 
     recordList : object.create("recordList"), 
     save : function() { 
      this.record.save(); 
      this.recordList.refresh(); 
     } 
    } 
Problemi correlati