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