Why need to specify unit names?

In the previous article "Crack C# namespaces in 30 seconds" I demonstrated how to make error having no idea about it. So you will have a lovely time in debugging. But in C# you're condemned to use using directive or your code will be unreadable with all these horrible specifiers MySolution.AppModules.Accounting.AccountingType.DefaultValue.

In Delphi and Free Pascal you don't obligate to specify the unit name but this practice is highly recommended to avoid similar errors.

A simple example is followed.

Main program:

program Print;
 
uses
  Orders;
 
begin
  writeln('Order default state is ', DefaultState);
end.

The constant is defined in Orders unit:

unit Orders;
 
interface
 
const
  DefaultState = 'submitted';
 
implementation
 
end.

When running, the results is as expected:

Order default state is submitted

One fine day, you need to use some functions from Calculs unit.

unit Calculs;
 
interface
 
const
  DefaultState = 10234;
 
implementation
 
end.

Add this unit in the main program:

uses
  Orders, Calculs;

When running, you will be surprised...

Order default state is 10234

The correction is evident:

writeln('Order default state is ', Orders.DefaultState);

Conclusions

  • It is a good idea to specify unit name for the constants, generic named functions and even for some public types.
  • The declaration order in uses section is important not only because of initialization/finalization sections. You should better start with core units such as SysUtils and Classes, then OS-specific (Windows, Unix ...), , then framework-specific (Forms, Dialogs...) and finish by application-specific units.