Przypuśćmy, że mamy do napisania obiekt Active Record - Owoc, który ma zawierać -metody CRUD,
-i jakieś 2 metody biznesowe
Mapujemy sobie tabelę Owoc:
1: class Owoc
2: {3: // "Dane" owocu
4: public int Id { get; set; }
5: public int Nazwa { get; set; }
6: public decimal Cena { get; set; }
7: public decimal Rabat { get; set; }
8: }Dopiszmy metody CRUD na samym początku:
1: class Owoc
2: {3: public Owoc() {}
4: 5: public Owoc(int id)
6: { 7: Owoc o = Find(id);8: this.Id = o.Id;
9: this.Nazwa = o.Nazwa;
10: this.Cena = o.Cena;
11: this.Rabat = o.Rabat;
12: } 13: 14: public static Find(int id)
15: {16: Owoc o = // Wyciagniecie owocu z bazy i zmapowanie go
17: return o;
18: } 19: 20: public Owoc Save()
21: {22: // Zapis
23: } 24: 25: public void Update()
26: {27: // Update
28: } 29: 30: public void Delete()
31: {32: // Usunięcie
33: } 34: }Tutaj trzeba zwrócić uwagę na metodę Find, która musi być statyczna.
Jeśliby nie była, to nie moglibyśmy w stanie jej użyć do konstrukcji obiektu.
Rzućmy okiem na użycie Rekordu Aktywnego:
1: // Wyciagamy owoc o id 4
2: Owoc o = new Owoc(4);
3: Owoc o = Owoc.Find(4); 4: 5: // Zapisujemy nowy owoc do bazy
6: Owoc o = new Owoc() { Nazwa = "jablko", Cena = 20, Rabat = 50 };
7: o.Save(); 8: 9: // Updatujemy dane owocu
10: o.Nazwa = "Gruszka";
11: o.Update(); 12: 13: // Usuwamy go
14: o.Delete();Bardzo wygodne, prawda? ;)
Teraz podepnijmy getter biznesowy obliczający cenę jabłka z rabatem:
1: class Jablko
2: {3: // ...
4: public decimal CenaZrabatem
5: { 6: get 7: {8: return cena - rabat;
9: } 10: } 11: }No to jak nam tak dobrze idzie, to dopiszmy kolejny getter biznesowy
określający czy jabłko jest na promocji:
1: class Jablko
2: {3: // ...
4: public bool CzyNaPromocji
5: { 6: get 7: {8: return rabat > 0;
9: } 10: } 11: }Szybki przykład użycia (trochę bezsensowny, no ale trzeba z obrazować problem ;) ):
1: decimal cenaOwocu = 0;
2: 3: Owoc jablko = new Owoc(5);
4: 5: cenaOwocu = jablko.Cena; 6: 7: if ( jablko.CzyNaPromocji )
8: { 9: cenaOwocu = jablko.CenaZrabatem; 10: }No i git, wszystko ładnie i pięknie... czy aby do końca jest to prawda?
Jak to zwyklę bywa... nie.
-Active Record nie powinniśmy stosować gdy mamy do czynienia ze złozoną logiką
biznesową
-AC wiąże się z konkretną bazą (np. CRUD zawiera SQL dla konkretnej bazy, nie jesteśmy go w stanie podmienić)
Niby tylko dwa minusy, ale za to jakie ;)
2 komentarze:
Great post! Keep going man! Kiedy bedzie druga czesc postu o integracji SVN z Visual Studio? Chetnie poznalbym blizej ten program.
dzięki,
pamiętam Twój poprzedni komentarz, właśnie o SVNie przewiduje w przyszłym tygodniu w sobotę bądź niedziele, trochę trzeba poczekać lecz na prawdę nie dam rady inaczej.
Prześlij komentarz