Kiedy stosować uses w interface a kiedy w Implementation?
Google (oraz forumowa szukajka z 4P) nie gryzą :P
Cykliczna zależność pomiędzy modułami
Moduły
https://stackoverflow.com/questions/528472/difference-between-adding-a-unit-to-the-interface-or-the-implementation-section
https://stackoverflow.com/questions/33123053/is-there-any-difference-delphi-uses-unit-after-interface-or-implementation
neytro napisał(a):
Kiedy stosować uses w interface a kiedy w Implementation?
Zawsze, kiedy możesz to zrobić.
W sekcji Interface
powinny być tylko te moduły, które są niezbędne dla deklaracji twoich typów w danym module.
Sekcje interface
oraz implementation
oddzielają deklaracje od definicji oraz dane lokalne od globalnych.
W sekcji Interface
muszą się znajdować dane, które mają być dostępne na zewnątrz danego modułu. Z reguły w tej sekcji trzyma się typy danych, deklaracje klas i interfejsów, a także stałe i zmienne. Natomiast to co ma być niewidoczne na zewnątrz, powinno być zadeklarowane/zaimplementowane w sekcji implementation
.
Małe wyjaśnienie — nazwy tych sekcji sugerują, że w jednej deklaruje się jakieś nagłówki (interface
), a w drugiej się je definiuje (implementation
). Takie spojrzenie jest zgodne np. z klasami, kiedy to klasę deklaruje się w interface
, a jej metody implementuje w implementation
. Jednak o ile w tym przypadku jest to mus (podprogramy zdefiniowane w sekcji interface
są niezgodne ze specyfikacją języka, spowodują błąd kompilacji), to nic nie stoi na przeszkodzie, aby klasy deklarować i definiować w implementation
.
Wiem, że to może wydawać się zagmatwane, ale takie nie jest. Po prostu w przypadku klas oraz podprogramów, deklarować je można w obu sekcjach, ale definiować je można wyłącznie w sekcji implementation
. Wszystko inne można deklarować w obu sekcjach, w zależności od tego jaką mają mieć widoczność.
Rozgadałem się, a to nie o dane chodzi, a o uses
. :D
Moduły można dołączać w obu sekcjach. Sam preferuję takie podejście, że w interface
dodaję tylko te moduły, które są konieczne do deklaracji danych znajdujących się w tej sekcji. Moduły wymagane na potrzeby danych oraz definicji metod (i innych podprogramów) dołączam w implementation
. Czyli ogólnie, aby widoczność była jak najmniejsza.
Tutaj ważne też jest to, jakie moduły chce się dołączyć w uses
. Jeśli chodzi o moduły z biblioteki standardowej lub komponentów, a także zewnętrznych bibliotek, to masz pełną dowolność, choć sugeruję podejście z poprzedniego akapitu. Natomiast jeśli chodzi o używanie własnych modułów, to deklaruj je w implementation
zawsze kiedy możesz, aby uniknąć problemów z circular unit reference
.