Pemahaman
Unit dapat saling bergantung dan saling merujuk satu sama lain. Ketika satu unit merujuk unit lain, unit yang dirujuk bisa diletakkan di bagian interface antarmuka, atau hanya di bagian implementation implementasi. Berikut perbedaan dari kedua cara tersebut:
Diletakkan di interface (rujukan bagian antarmuka) Anda bisa mendefinisikan elemen publik baru (prosedur, tipe buatan sendiri, dan lain-lain) yang bisa diakses dari luar berdasarkan isi unit yang dirujuk, dan semua unit lain di seluruh proyek dapat mengakses elemen tersebut.
Hanya diletakkan di implementation (rujukan bagian implementasi) Jangkauan penggunaannya terbatas: Pengenal di dalam unit yang dirujuk hanya bisa digunakan di kode implementasi unit saat ini, dan tidak dapat diakses dari luar unit.
Contoh
Kode di bawah hanya sebagai demonstrasi. Pembaca belum mempelajari class, jadi cukup pahami konsep dasarnya saja untuk sekarang.
Buat berkas unit baru bernama Classes.pas
unit Classes;
{$mode objfpc}{$H+}
interface
type
TObject=class;
TComponent=class(TObject)
constructor Create(AOwner:TComponent);virtual;
end;
TObject=class
destructor Destroy;virtual;
end;
implementation
constructor TComponent.Create(AOwner:TComponent);begin end;
destructor TObject.Destroy;begin end;
end.
Kemudian rujuk unit ini di dalam berkas AnotherUnit.pas
unit AnotherUnit;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
interface
uses
Classes;
// Kelas TComponent didefinisikan di unit Classes, sehingga bagian interface harus merujuk Classes
procedure DoSomethingWithComponent(var C: TComponent);
implementation
uses SysUtils; // Hanya merujuk SysUtils di bagian implementasi
procedure DoSomethingWithComponent(var C: TComponent);
begin
// FreeAndNil berasal dari SysUtils dan hanya dipanggil di kode implementasi, cukup merujuknya di bagian implementation saja
FreeAndNil(C);
end;
end.Code language: JavaScript (javascript)
Catatan Penting
1 Ketergantungan siklus dua arah dilarang di bagian interface
Dua unit tidak diperbolehkan saling merujuk satu sama lain secara bersamaan di bagian interface masing-masing unit.
Prinsipnya: Saat kompiler memproses antarmuka sebuah unit, kompiler harus menyelesaikan semua unit dependen yang terdaftar di klausul uses bagian interface unit tersebut terlebih dahulu. Bahasa Pascal mematuhi aturan ini dengan ketat, yang memberikan dua keuntungan utama:
Proses kompilasi menjadi lebih cepat; kompiler dapat mendeteksi secara otomatis unit mana yang perlu dikompilasi ulang tanpa Anda harus mengelola skrip build Makefile yang rumit secara manual. Setelah mengubah kode, Anda tidak perlu mengkompilasi ulang seluruh proyek untuk memastikan semua dependensi terupdate secara sinkron.
2 Ketergantungan siklus diizinkan di bagian implementation
Ketergantungan siklus dianggap sah selama minimal salah satu unit hanya merujuk unit lawan di bagian implementation implementasi.
Contoh: Unit A merujuk Unit B di bagian interface, sedangkan Unit B hanya merujuk Unit A di bagian implementation. Struktur siklus dua arah seperti ini sepenuhnya didukung oleh kompiler.