merhabalar.
daha önceki yaptığım programlarda database nesnesini (delphi7-firebird) ve tabloları, datasetleri ana forma koymuştum.
daha sonrada quickreportlarda QREXPR hesaplamaları için, bağlı olunan sorgunun quickreport ile aynı formda veya datamodülde olması gerektiği gibi bir sonuç gördüm. Datamodule kullanılmasıın bir avantajı bu idi.
Peki farklı avantajları nelerdir?
Kullanılmalı mı?
Hız açısından bir etkisi olur mu?
Datamodule kullanmalımıyız? neden? Avantajları ne?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- Benzer işlemi yapmanın bir çok methodu vardır. Her ikisi de olduğu zamanlar çoğunlukla da olsa, ayrıldığı noktalar; bazıları programa hız kazandırır, bazıları ise program yazana kolaylık sağlar.
- Bu sorduğun soru, ikinci kısma giriyor. Yani programcıya kolaylık sağlar.
- Kendi yazdığın kod içerisinde kaybolman durumunu ortadan kaldırmaya yardımcı bir unsurdur. Ek özellikleri ise kolaylığın derecesini arttırır.
- Dolaylı yoldan hız kazandırıcı özelliği de vardır. Şöyle ki lazım olan her form için müstakil Query nesnesi oluşturulması, connection kurulması vb. işlemler sistem kaynaklarına yönelik küçük yüklerdir. Bir araya gelen diğer işlemlerle beraber programının sistem üzerindeki yükünü belirlerler. Aynı anda açık formlar ve veritabanı nesneleri varsa ve aynı tabloya aynı anda erişiyorlarsa onun için de trafik ayarlaması yapmak gerekir vs. vs.
- Bu yük arttıkça sistem dolayısı ile programın ve diğer programların çalışması olumsuz etkilenir. Bir tablo bir form ihmal edilebilecek kadar küçüktür. Bu sorunu daha genel anlamda cevaplamak için bunları yazdım.
- Bu sorduğun soru, ikinci kısma giriyor. Yani programcıya kolaylık sağlar.
- Kendi yazdığın kod içerisinde kaybolman durumunu ortadan kaldırmaya yardımcı bir unsurdur. Ek özellikleri ise kolaylığın derecesini arttırır.
- Dolaylı yoldan hız kazandırıcı özelliği de vardır. Şöyle ki lazım olan her form için müstakil Query nesnesi oluşturulması, connection kurulması vb. işlemler sistem kaynaklarına yönelik küçük yüklerdir. Bir araya gelen diğer işlemlerle beraber programının sistem üzerindeki yükünü belirlerler. Aynı anda açık formlar ve veritabanı nesneleri varsa ve aynı tabloya aynı anda erişiyorlarsa onun için de trafik ayarlaması yapmak gerekir vs. vs.
- Bu yük arttıkça sistem dolayısı ile programın ve diğer programların çalışması olumsuz etkilenir. Bir tablo bir form ihmal edilebilecek kadar küçüktür. Bu sorunu daha genel anlamda cevaplamak için bunları yazdım.
DataModule iş kurallarını mantıksal olarak ayırmanın bir yoludur. Ben her zaman kullanırım. Genelde şöyle kullanırım: Tüm DB tabloları için bir Table bileşeni koyarım DataModul'e. Sonra onların BeforePost ve BeforeDelete event'larını yazarım. Formlar içinde ise doğrudan bunları kullanmam. Bunun yerine yeni bir Table veya Query bileşeni create edip eventlarını DataModule dekine eştliyorum. Eğer field lar için bir onchange veya onvalidate yazmak gerekirse onları da form üzerindeki bileşende gerçekleştiriyorum. Böylece Database işlemeri nin %90 ını formlardan bağımsızlaştırmış oluyorum. Bu yapı ileride çok katmanlı programlamaya geçerken de çok faydalı olacaktır. Biz bu yolla Bir çok ciddi uygulama geliştirdik ve yapıdan çok memnunum. En azından Form tasarımcılarıyla iş kuralları yazıcılarının işi ayrıldı. Örnek Kod:
Kod: Tümünü seç
procedure TDM.StokFisDetBeforeDelete(DataSet: TDataSet);
var
QStok: TADOQuery;
begin
StartTransaction;
try
try
QStok:=CreateQuery(Stok, 'REF='+FormatFloat('0', DataSet.FieldByName('STOKREF').AsInteger)); // Burada Stok isimli Table ın bir kopyası oluşturuluyor.
if QStok.RecordCount>0 then
begin
QStok.Edit;
if (DataSet.FieldByName('TIP').AsInteger<11) then
begin
QStok.FieldByName('GIREN').AsFloat := QStok.FieldByName('GIREN').AsCurrency - DataSet.FieldByName('MIKTAR').AsCurrency;
QStok.FieldByName('GIRENTL').AsCurrency:= QStok.FieldByName('GIRENTL').AsCurrency - DataSet.FieldByName('TUTAR').AsCurrency;
end else
begin
QStok.FieldByName('CIKAN').AsFloat := QStok.FieldByName('CIKAN').AsCurrency - DataSet.FieldByName('MIKTAR').AsCurrency;
QStok.FieldByName('CIKANTL').AsCurrency:= QStok.FieldByName('CIKANTL').AsCurrency - DataSet.FieldByName('TUTAR').AsCurrency;
end;
QStok.Post;
end;
QStok.Close;
finally
FreeAndNil(QStok);
end;
CommitTransaction;
except
RollbackTransaction;
raise;
end;
end;
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri
Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
csunguray at netbilisim.kom
Net Bilişim Hizmetleri
Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)