Datamodule kullanmalımıyız? neden? Avantajları ne?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Datamodule kullanmalımıyız? neden? Avantajları ne?

Mesaj gönderen nitro »

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?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- 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.
Resim
Resim ....Resim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

teşekkürler muharrem abi. demekki datamodule kullanmak lazım :)
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Mesaj gönderen csunguray »

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/)
Cevapla