2009-02-09 31 views
6

Khi sử dụng Delphi: Nếu tôi có một đơn vị đó được lấp đầy với các hằng số như ...Thêm một đơn vị để giao diện sử dụng khoản chứ không phải là việc thực hiện sử dụng khoản

Unit AConsts; 
Interface 
Const 
    Const1 : WideString = 'Const1'; 
    Const2 : WideString = 'Const2'; 
    Const3 : WideString = 'Const3'; 
    Const4 = 100; 
    Const5 = 100; 
Implementation 
end. 

và tôi muốn sử dụng đơn vị này từ đơn vị khác, là có bất kỳ sự khác biệt giữa ...

Unit AUnit; 
Interface 
Uses 
    AConsts; 
Implementation 
end. 

Unit AUnit; 
Interface 
Implementation 
Uses 
    AConsts; 
end. 

? Hay nói cách khác, liệu có sự khác biệt nào giữa hai ứng dụng được biên dịch không?

[Chỉnh sửa 1]

Cảm ơn câu trả lời cho đến nay.

Tôi không đặt câu hỏi này đủ rõ ràng và tôi xin lỗi. Câu hỏi không phải là về phạm vi, tránh tham chiếu vòng tròn vv. Đó là về sự khác biệt trong ứng dụng được biên dịch. Có thể một ví dụ khác sẽ giúp ích cho bạn.

Nếu UnitA, UnitB và UnitC đều sử dụng AConsts, sẽ có sự khác biệt trong ứng dụng được biên dịch (giả sử không có xung đột tên giữa các hằng số trong các đơn vị AConsts và mã khác) giữa App1 nơi tất cả UnitA, UnitB và UnitC đều có AConsts trong điều khoản sử dụng của phần Giao diện và App2 trong đó UnitA, UnitB và UnitC đều có các AConst trong điều khoản sử dụng của mục Thực hiện.

+0

có lẽ tôi là một chút tuổi học nhưng tôi nghĩ rằng trong giao diện, bạn nên sử dụng chỉ các đơn vị bạn cần cho các khai báo của bạn sẽ có sẵn bên ngoài đơn vị, do đó có trong giao diện. Bạn nên đặt tất cả phần còn lại vào triển khai. AFAIK, trong thời cổ đại, điều này đã giúp tốc độ biên dịch và kích thước exe kết quả, tho các phiên bản gần đây xử lý tốt hơn. Tuy nhiên, nó vẫn là một cách gọn gàng. –

Trả lời

10

Sự khác biệt phải làm với nơi bạn được phép tham chiếu đến những thứ mà AConsts có trong phần giao diện của nó. Trong AUnit đầu tiên, bạn có thể sử dụng Const4 để khai báo mảng có kích thước cố định trong rằng phần giao diện. Bạn không thể làm điều đó trong giây thứ hai AUnitConst4 không nằm trong phạm vi.

có thể có ảnh hưởng đến chương trình được biên dịch, nếu bạn không cẩn thận.Giả sử chúng ta có một đơn vị rằng cũng tuyên bố một hằng số tên Const4:

unit BConsts; 
interface 
const 
    Const4 = 50; 
implementation 
end. 

Bây giờ chúng ta định nghĩa một mảng trong UnitA như thế này:

unit AUnit 
interface 
uses BConsts; 
var 
    data: array[0..Pred(Const4)] of Integer; 
implementation 
uses AConsts; 
procedure Work; 
var 
    i: Integer; 
begin 
    for i := 0 to Const4 - 1 do begin 
    data[i] := 8; 
    end; 
end; 
end. 

Đó là mã sẽ viết ngoài khi kết thúc mảng vì Const4 nằm trong phạm vi trong phần giao diện không giống nhau Const4 được sử dụng trong phần triển khai. Điều này không xảy ra thường xuyên với các hằng số. Thông thường chỉ xảy ra với hai số nhận dạng, hàm FindClose được xác định trong WindowsSysUtilsTBitmap, được xác định trong GraphicsWindows. Và trong hai trường hợp đó, trình biên dịch sẽ cho bạn biết rằng bạn đã làm điều gì đó sai, mặc dù nó sẽ không cho bạn biết chính xác rằng bạn đã sử dụng một định danh có hai nghĩa khác nhau. Bạn có thể giải quyết vấn đề bằng cách xác định số nhận dạng:

for i := 0 to BConsts.Const4 - 1 do 
    data[i] := 8; 

Nếu tất cả các biện pháp phòng ngừa trên được giải quyết, thì không có sự khác biệt khi đơn vị được sử dụng. Trong ví dụ của bạn với App1 và App2, hai chương trình sẽ giống nhau. Chúng sẽ không giống nhau - trình biên dịch sẽ xử lý mọi thứ theo thứ tự khác nhau và do đó có thể sẽ đặt mọi thứ ở những nơi khác nhau - nhưng nó sẽ không ảnh hưởng đến việc thực thi chương trình của bạn.

1

Các mục trong câu lệnh sử dụng trong giao diện hiển thị trong toàn bộ đơn vị.

Các mục trong báo cáo sử dụng trong quá trình triển khai chỉ hiển thị trong phần thực hiện.

Ví dụ:

unit A; 
interface 
const 
    cA = 1; 
.. 


unit B; 
interface 
const 
    cB = 1; 
.. 



unit C; 
interface 
uses 
    A; 
const 
    cC1 = cA; 
    cC2 = cB; // Error 

implementation 
uses 
    B; 
const 
    cC3 = cA; 
    cC4 = cB; 

end. 

Bạn có thể tạo các đơn vị phụ thuộc lẫn nhau nếu ít nhất một đơn vị được bao gồm trong phần thi:

unit A; 
interface 
implementation 
uses 
    B; 
end. 


unit B; 
interface 
implementation 
uses 
    A; 
end. 

Nếu cả hai được sử dụng trong phần giao diện nó sẽ không biên dịch/liên kết.

2

IDE cũng sử dụng cách bạn khai báo sử dụng của bạn để xác định những gì cần phải biên dịch.

Nếu phần giao diện của bạn sử dụng UnitA và phần triển khai của bạn sử dụng UnitB, nếu đơn vị B cần biên dịch lại, đơn vị của bạn sẽ không, nhưng nếu unitA thay đổi thì đơn vị của bạn sẽ cần phải được biên dịch lại.

Đó là một trong những bí quyết của tốc độ xây dựng siêu nhanh Delphis.

Khi thực thi xong, tôi mong rằng nó sẽ có cùng kích thước bất cứ nơi nào bạn đặt các khai báo (liên kết thông minh và chỉ các liên kết trong các phương thức vv mà thực sự được ứng dụng của bạn sử dụng), nhưng vị trí thực tế của các nguồn khác nhau gần như chắc chắn sẽ thay đổi nếu thứ tự của các tờ khai đơn vị được thay đổi.

1

Tôi tuân thủ quy tắc mà tôi đặt mọi thứ trên phần Giao diện trừ khi tôi cần giải quyết các vấn đề với tham chiếu vòng tròn. Điều này giúp mang lại một chút rõ ràng. Một số trình thuật sĩ trong Delphi và hộp thoại "Tệp> Sử dụng đơn vị ..." đưa các đơn vị vào phần triển khai.

Ngoại trừ các bẫy phạm vi mà Rob Kennedy nhấn mạnh, điều đó không quan trọng. Làm cho tiêu chuẩn của bạn và gắn bó với nó.

3

Tôi đặt tất cả các tham chiếu trong phần triển khai và chỉ đặt các tên đơn vị đó vào giao diện mà tôi có.

Tôi muốn giới hạn phạm vi của mọi thứ càng nhiều càng tốt, tuy nhiên, và chính sách này là theo đó.

Các vấn đề liên quan