2012-07-21 5 views
5

Stary tytuł: Ile zajęć na jednostkę powinno być?Czy są jakieś specyficzne problemy Delphi z zasadą "Jedna klasa na plik"?

Moje pytanie dotyczy Delphi. Myślę, że w świecie Java i C# jest raczej akceptowaną praktyką, aby generalnie mieć jeden plik na klasę. Myślę, że jest to dobra zasada, którą należy przestrzegać również w Delphi, ponieważ członkowie Delphi nie są prywatni, jeśli masz więcej niż jedną klasę w jednostce.

Tak więc byłem zaskoczony, słysząc od dwóch różnych starszych (i prawdopodobnie bardziej doświadczonych niż ja) programistów, którzy mówią mi, że zbyt dużo kodu dzielę. Jeden z nich powiedział mi, abym nie zawstydził się umieszczeniem 5-6 klas w jednostce.

Czy jest jakiś problem z zasadą "jedna klasa na moduł", której nie jestem świadomy, który mógłby uzasadnić i wyjaśnić reakcje tych programistów?

+0

Problem z Delphi jest to, że nazwa pliku może służyć jako nazw. Posiadanie jednego do ważnego, że wiele jednostek jest denerwujące. – CodesInChaos

+2

Interesujące pytanie, chociaż nie pasuje do SO. Rzuć okiem na jednostki RTL/VCL Delphi, np. 'Vcl.Controls'. Mnóstwo zajęć. Ale spójrz na system "Indy" - zdają się podążać za jedną klasą na jednostkę. Biorąc to pod uwagę, to naprawdę kwestia opinii i jak najbardziej Ci odpowiada. –

Odpowiedz

2

Nie wiem, co masz na myśli przez moduł.

Java wymaga jednej klasy publicznej dla pliku, a nazwa klasy musi być zgodna z nazwą pliku. Żadnych jeśli, i albo ale. W tym pliku możesz mieć inne pakiety prywatne lub prywatne, ale tylko jedną klasę publiczną.

Jeśli "moduł" oznacza "pakiet" do Ciebie, to powiedziałbym, że często jest więcej niż jedna klasa w pakiecie. Nie ma norm; spójrz na sam JDK, aby to zobaczyć. Istnieje wiele klas w java.util, java.lang, java.sql i javax.swing.

Poza tymi dwoma, nie mam pojęcia, do czego odnoszą się ty lub rzekomi "starsi programiści". Zgodziłbym się, że można zrobić wszystko, aby nadmiar, a zasady dogmatyczne nie powinny być przestrzegane ślepo.

Ale dekompozycja to informatyka - nie, rozwiązywanie problemów - podstawowe. Częściej jest go lekceważyć niż przesadzać.

+0

Według modułu mam na myśli plik. W Delphi nazywane są jednostkami. –

+1

Potem nie zgadzam się z waszymi "starszymi programistami". Zazwyczaj jest to jedna klasa dla mnie. Chciałbym zapytać, jaką korzyść ma zmniejszenie liczby plików? Relacja 1: 1 pozwala mi ocenić rozmiar projektu po prostu patrząc na liczbę plików. Łączenie ich zmusza mnie do zajrzenia do środka. Jakie są korzyści? – duffymo

+3

@duffymo, może być powszechne, ale rzadko jest widoczne w ekosystemie Delphi. Tak jak jeden plik na projekt jest ekstremalny (nawet jeśli czasami jest to możliwe), tak więc jeden plik na klasę jest tylko drugim krańcem. Podczas gdy Java wydaje się po prostu tego wymagać, Delphi daje ci swobodę decydowania o sobie. Co więcej, Delphi nawet nie dopuszcza żadnej klasy do pliku. –

2

To zależy. Nie ma dokładnej reguły do ​​naśladowania. Zazwyczaj musisz grupować jednostki w jednostkach przez logiczną, wspólną zależność lub lepiej zrozumieć funkcjonalność biznes.

Na przykład, jeśli masz dużo małych pomocnika, sąsiednich przedziałów gdzie zachodzi, uzupełniające klas nie ma powodu, aby umieścić je wszystkie w jednym urządzeniu. Podobnie jak Borland w jednostce DB.pas. Wszystko ogólnie DB rzeczy tam: TDataSet, TDataSource, TField etc ...

Forms, tj TForm potomkowie Borland zaleca jeden za sztukę, z powodu obciążenia zasobów DFM etc ...

Zwykle, gdy piszesz „używa FOO ; " oznacza, że ​​kompilator zawiera wszystkie rzeczy od FOO. Możesz uzyskać dostęp do klas, const, typów itp. Tak więc, dobrze jest dzielić, ale zachowując racjonalność.

W najnowszej wersji urządzenia Delphi są traktowane jako namespaces. Możesz lepiej zorganizować swój kod.

+0

Nawet jeden plik na TForm nie oznacza, że ​​ten plik nie może zawierać innych klas. –

0

Jedna klasa na jednostkę jest zbyt rygorystyczna. Czasami zajęcia są powiązane, więc można je połączyć w jedną całość.

Problem z backdoor dla zmiennych chronionych i prywatnych mogą być mocowane za pomocą ścisłego dyrektywy:

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

Tak, zgadzam się z powiązanymi klasami. O dyrektywie stricte - wprowadzono ją niestety po Delphi 7. –