2012-07-21 7 views
5

Eski başlık: Birim başına kaç sınıfın bulunması tavsiye edilir?"Dosya başına bir sınıf" kuralıyla ilgili Delphi'ye özgü bazı sorunlar var mı?

Soruma Delphi özgüdür. Java ve C# dünyasında, genellikle sınıf başına bir dosyaya sahip olmak için oldukça kabul görmüş bir uygulama olduğunu düşünüyorum. Bence Delphi'de takip etmek iyi bir kural çünkü Delphi'deki özel üyeler bir birimde birden fazla sınıfa sahipseniz gerçekten özel değiller.

Ben de çok fazla kodumu bölmek söyle iki farklı üst düzey (ve benden muhtemelen daha deneyimli) programcılar duymak şaşırdı. Bunlardan biri, bir birime 5-6 sınıf yerleştirmek konusunda utanmamamı söyledi.

garanti ve bu programcılar tepkilerini açıklayabilir ben farkında değilim "tek sınıf modül başına" kuralı, bazı sorun var mı?

+0

Delphi ile sorun dosya adı ad olarak iki katına olmasıdır. Bir çok önemli olan birime sahip olmak can sıkıcıdır. – CodesInChaos

+2

İlginç bir soru, SO için uygun olmasa da. Delphi'nin RTL/VCL birimlerine, örneğin, 'Vcl.Controls' bir göz atın. Derslerin tonları. Ama sonra 'Indy' sistemine bakın - birim konsept başına bir sınıfı takip ediyorlar. Bu söyleniyor, bu gerçekten bir fikir meselesi ve en rahatınız. –

cevap

2

Modülle ne demek istediğini bilmiyorum.

Java dosyası başına tek bir kamu sınıf gerektirir ve sınıf adı dosya adı aynı olmalıdır. Aması maması yok. Bu dosyada diğer paket özel veya özel yöntemlere sahip olabilirsiniz, ancak yalnızca bir genel sınıf.

"modül" size "paket" anlamına geliyorsa

, o zaman bu bir paket içinde birden fazla sınıf için ortak olduğunu söyleyebilirim. Norm yok; Bunu görmek için JDK’ya bir bakın. java.util, java.lang, java.sql ve javax.swing'da birçok sınıf vardır.

Bu ikisinden Ayrıca, senin ya da sözde "kıdemli programcılar" atıfta ne hiçbir fikrim yok. Aşırıya bir şey yapmanın mümkün olduğunu kabul ediyorum ve dogmatik kurallar körü körüne takip edilmemelidir.

Ancak ayrıştırma bir bilgisayar bilimidir, bir problem çözme - temeldir. Bunu ihmal etmekten ziyade ihmal etmek daha yaygındır.

+0

Modülle dosya demek istiyorum. Delphi'de birimler denir. –

+1

O zaman "üst düzey programcılarınız" ile aynı fikirde değilim. Genelde dosya başına bir sınıf. Dosya sayısını azaltmanın yararı nedir? 1: 1 ilişki sadece proje sayımına bakarak projenin boyutunu ölçmeme izin verir. Onları birleştirmek beni içeriye bakmaya zorluyor. Fayda nedir? – duffymo

+3

@duffymo, sizin için ortak olabilir, ancak Delphi ekosisteminde nadiren görülür. Her proje başına bir dosya gibi (her ne kadar bazen mümkün olsa da) bir uç nokta olduğu gibi, sınıf başına bir dosya sadece diğer bir aşırıdır. Java sadece bunu gerektiriyor gibi görünüyor, Delphi size kendinize karar verme özgürlüğü veriyor. Dahası, Delphi bir dosyada bile sınıf bulunmasına izin vermez. –

2

Bu, bağlıdır. Takip edilecek kesin bir kural yoktur. Genellikle mantıksal, ortak bağımlılık veya işlevselliğini anlamak için daha iyi birim sınıfları gerekir. Eğer küçük yardımcı, Adiacent, tamamlayıcı sınıfları bir sürü varsa

Örneğin, tek bir ünitede hepsini koymak için bir neden yoktur. Borland'ın DB.pas biriminde yaptığı gibi. Orada tüm genel DB şeyler: TDataSet, TDataSource, TField vs ...

Formlar, yani TForm soyundan yazdığınız zaman Borland ... çünkü dfm kaynak yükleyebilmek vb, genellikle

birimin başına bir tavsiye "FON kullanır ;" derleyicinin FOO’dan her şeyi içerdiği anlamına gelir. Sınıflara, mallara, türlere vb. Erişebilirsiniz ... Yani, bölmek iyidir ama rasyonellik tutmak. Delphi birimlerinin son sürümlerinde

namespaces olarak kabul edilir. Kodunuzu daha iyi düzenleyebilirsiniz.

+0

TForm başına bir dosya bile, bu dosyanın başka sınıflar içeremeyeceği anlamına gelmez. –

0

Birim başına bir sınıf çok sıkı. Bazen sınıflar birbirleriyle ilişkilidir, böylece tek bir birime katılabilirler.

korumalı ve özel değişkenler için arka kapı ile sorun sıkı yönergesini kullanarak düzeltilebilir:

type 
    TClass1 = class 
    private 
    FField1 : Integer; 
    strict private 
    FField2 : Integer; 
    end; 

    TClass2 = class 
    public 
    procedure MessWithClass1; 
    end; 



implementation 
    procedure TClass2.MessWithClass1; 
    var 
    c1 : TClass1; 
    begin 
    c1.FField1 := 1; 
    c1.FField2 := 2; // Fails! 
    end;  
+0

Evet, ilgili sınıfları kabul ediyorum. Kesin direktif hakkında - ne yazık ki, Delphi 7'den sonra tanıtıldı. –

İlgili konular