2010-02-17 15 views
7

Jestem nowicjuszem programowania obiektowego i powoli uczę się, jak zastosować go do javascript. Więc proszę, weź mnie ze sobą. :)Jaki jest właściwy sposób kontrolowania powiązanych obiektów w javascript?

Mam dwie podstawowe obiekty:

  1. "record", która zawiera metody edycji pojedynczy rekord z rekordów. (tworzenie, zapisywanie, ładowanie itp.)

  2. "recordList", która zawiera metody wyprowadzania paginowanej listy tytułów rekordów.

Chciałbym, aby te obiekty mogły współpracować ze sobą. Na przykład, jeśli wywoływana jest funkcja record.save(), wywoływana jest również funkcja recordList.refresh(), dzięki czemu lista stronowana odzwierciedla zaktualizowane dane.

Aby to osiągnąć, utworzyłem trzeci obiekt "kontrola", który zawiera wystąpienia zarówno "rekordu" i "rekordList". Używam "kontroli" w następujący sposób:

control = {} 

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

    control.save = function() { 

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

    }; 

To działa. Ale zastanawiam się, czy to właściwe? (Chcę mieć pewność, że nie łamie to żadnej z zasad projektowania OO). Czy istnieje lepszy sposób?

Z góry dziękuję za pomoc.

+0

dlaczego chcesz zapewnić oop w javascript? – Roman

+0

@Roman: Ponieważ bawię się z budową aplikacji, która sprawia, że ​​ciężko korzysta z ajax. W rezultacie większość logiki została przeniesiona z zaplecza do iz przodu. Co dość mocno komplikuje front-end. Więc równie dobrze może się nauczyć OOP w języku, w którym zamierzam go używać. :) – Travis

Odpowiedz

1

Mówiąc z perspektywy OOP, nie sądzę, by zapis się uratował. Rekord w bazie danych to po prostu dane, a sama baza danych to, co robi dane z tymi danymi, czy to jest zapisywanie, czy ładowanie, itp. Mówiąc w ten sposób, nagrałbym po prostu obiekt przechowujący dane i tworzący obiekt zestawu rekordów do interakcji z danymi. W tym obiekcie zestawu rekordów możesz umieścić swoją listę rekordów i odpowiednio ją zaktualizować. Coś takiego:

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(); 
    }; 
}; 

Coś, o czym należy pamiętać. W tym ustawieniu currentRecord i recordList nie mogą być dostępne spoza tej funkcji, dlatego masz enkapsulację, jedną z cech charakterystycznych OOP. Jest tak, ponieważ funkcja zestawu rekordów jest zamknięciem, które "zamyka" wszystkie zmienne w obrębie, co oznacza, że ​​każda funkcja w obrębie ma dostęp do zmiennych w zakresie zestawu rekordów.

Można niech świat poza uzyskać dostęp za pośrednictwem funkcji pobrać lub ustawić:

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

Dzięki za informację. Porada dotycząca przeniesienia niektórych metod z zapisu do kontrolującego obiektu wydaje się upraszczać. Twoje zdrowie. Jeśli chodzi o twój przykład enkapsulacji - czy to jest to, co oni nazywają wzorcem modułów? – Travis

0

Jeśli nauczyłem się czegoś, to znaczy, że stosowanie się do każdego paradygmatu doprowadzi do większej frustracji i trudności niż przyjęcie koncepcji tak daleko, jak to tylko możliwe i stosowanie zdrowego rozsądku do dyktowania odchyleń.

To powiedziawszy, twoje rozwiązanie będzie działało dobrze i normalne jest tworzenie klasy kontenerów dla wielu obiektów o różnych typach, które są sprzężone. Jeśli chcesz zmienić sposób obsługi, sprawdź numer Client Event Pooling. Jedyne, co mogę powiedzieć o tym, co zrobiłeś, to upewnić się, że używasz obiektu. Stwórz sposób, w jaki był przeznaczony.

Za pomocą tej metody można utworzyć wydarzenie, które po uruchomieniu wykona serię innych poleceń powiązanych ze zdarzeniem. Używałem tego z wielkim sukcesem we wszelkiego rodzaju aplikacjach, od zamierzonego zahaczania zdarzeń do uproszczenia inline wstrzykiwań javascript po odświeżeniu.

Powodzenia.

+0

Dzięki - artykuł na temat łączenia zdarzeń jest interesujący. Czy mogę prosić o wyjaśnienie, co masz na myśli, używając object.create, ponieważ jest to zamierzone? Dzięki. – Travis

0

dlaczego nie podasz swojej rekordowej listy rekordów?

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

Widzę, co mówisz. Ale nie sądzę, żeby to miało sens, mimo że działa. To znaczy, nie ma sensu, aby pojedynczy obiekt rekordu zawierał obiekt rekordList, biorąc pod uwagę to, co reprezentuje każdy obiekt. W rzeczywistości mam już działającą aplikację - proceduralnie. Więc przepisuję to jako ćwiczenie, aby nauczyć się OO. Właśnie dlatego jestem wybredny - tzn. Staram się utrzymać sposób, w jaki moje obiekty wchodzą w interakcje "znaczące". :) Rekord – Travis

+0

nie zawiera zestawu rekordów, zawiera wskaźnik do zestawu rekordów, z którego korzysta, więc nie ma problemów z marnowaniem pamięci lub czymś innym, a przy tym nie zepsułaby aplikacji. – shiberz

+0

Jeśli chcesz ćwiczyć w OOP, powinieneś zdecydować, który OO patern sobie tam zdasz - ORM lub ActiveRecord - robią to samo, ale w różny sposób – shiberz

1

Twoje rozwiązanie jest w porządku. Dwie drobne sugestie ulepszeń:

  1. Użyj bardziej specyficznej nazwy niż kontrolki (nawet "recordControl" jest w porządku). Możesz skończyć z wieloma kontrolkami dla różnych zestawów funkcji.

  2. Użyj literału obiektu, aby utworzyć cały obiekt. Zachowuje kod porządniej i bardziej czytelne (i oszczędza kilka bajtów)

(przeprosiny za brak odstępów - redaktor nie robić to, co chcę robić!)

recordControl = { 
     record : object.create("record"), 
     recordList : object.create("recordList"), 
     save : function() { 
      this.record.save(); 
      this.recordList.refresh(); 
     } 
    } 
Powiązane problemy