- Код: Выделить всё
unit MyUnit;
interface
procedure MyPublicProc;
implementation
var
X: Integer;
procedure MyPrivateProc;
begin
X := 5;
end;
procedure MyPublicProc;
begin
MyPrivateProc;
end;
end.
Потом в какой-то момент в паскаль были добавлены объекты (кем, кстати? Эпплом?). Объекты начали поддерживать свои собственные приватные и публичные секции:
- Код: Выделить всё
unit MyUnit;
interface
type
TMyObject = object
private
X: Integer;
procedure MyPrivateMethod;
public
procedure MyPublicMethod;
end;
implementation
procedure TMyObject.MyPrivateMethod;
begin
X := 5;
end;
procedure TMyObject.MyPublicMethod;
begin
MyPrivateMethod;
end;
end.
Ну и уродство!
А вот если бы люди проектировали язык, а не тупо копировали модные тенденции, то мы бы сейчас могли бы наслаждаться реально красивыми модулями, в которых в интерфейсной части нет ничего лишнего, лишь то, что реально должно быть в публичной секции. Всё, что для этого нужно, — использовать уже существующие секции модуля для разграничения доступов (это также отлично согласуется с тем, что внутри одного модуля реально видны все приватные секции, они перестают быть видны за пределами модуля).
- Код: Выделить всё
unit MyUnit;
interface
type
TMyObject = object
procedure MyPublicMethod;
end;
implementation
type
TMyObject = object
X: Integer;
procedure MyPrivateMethod;
begin
X := 5;
end;
// это пример вынесения определения за секцию объекта
procedure MyPublicMethod; forward;
end;
procedure TMyObject.MyPublicMethod;
begin
MyPrivateMethod;
end;
end.
Могу привести пример: допустим, мы хотим реализовать кроссплатформенный объект-обёртку над сообщением в оконной системе для Linux/Windows, сейчас нужно писать как-то так (условному клиенту модуля трудно понять что требуется, потому что нужно вычленить среди кучи подробностей то, что реально нужно, да и детали эти размазаны):
- Код: Выделить всё
unit MySuperMessages;
interface
uses
{$IFDEF WINDOWS}windows{$ENDIF}
{$IFDEF UNIX}SomeLinuxModules{$ENDIF};
type
TMyEvent = object
private
{$IFDEF WINDOWS}
Msg, lParam, wParam: LongInt;
{$ENDIF}
{$IFDEF UNIX}
BlaBlaBlaParam: Pointer;
{$ENDIF}
public
function IsKeyDown: Boolean;
function IsKeyUp: Boolean;
end;
implementation
{$IFDEF WINDOWS}
function TMyEvent.IsKeyDown: Boolean;
begin
Result := Msg = WM_KEYDOWN;
end;
function TMyEvent.IsKeyUp: Boolean;
begin
Result := Msg = WM_KEYUP;
end;
{$ENDIF}
{$IFDEF UNIX}
function TMyEvent.IsKeyDown: Boolean;
begin
Result := BlablablaGetMeIsKeyDownPlease(BlaBlaBlaParam, nil, JUST_DO_IT or YES_I_ACTUALLY_WANT_IT, SizeOf(Boolean));
end;
function TMyEvent.IsKeyUp: Boolean;
begin
Result := BlablablaGetMeIsKeyUpPlease(BlaBlaBlaParam, nil, JUST_DO_IT or YES_I_ACTUALLY_WANT_IT, SizeOf(Boolean));
end;
{$ENDIF}
...
end.
А вот здесь интерфейсная секция гораздо читабельнее! Да и секция реализации, на мой вкус, стала гораздо лучше.
- Код: Выделить всё
unit MySuperMessages;
interface
type
TMyEvent = object
function IsKeyDown: Boolean;
function IsKeyUp: Boolean;
end;
implementation
uses
{$IFDEF WINDOWS}windows{$ENDIF}
{$IFDEF UNIX}SomeLinuxModules{$ENDIF};
type
{$IFDEF WINDOWS}
TMyEvent = object
Msg, lParam, wParam: LongInt;
function TMyEvent.IsKeyDown: Boolean;
begin
Result := Msg = WM_KEYDOWN;
end;
function TMyEvent.IsKeyUp: Boolean;
begin
Result := Msg = WM_KEYUP;
end;
end;
{$ENDIF}
{$IFDEF UNIX}
TMyEvent = object
BlaBlaBlaParam: Pointer;
function TMyEvent.IsKeyDown: Boolean;
begin
Result := BlablablaGetMeIsKeyDownPlease(BlaBlaBlaParam, nil, JUST_DO_IT or YES_I_ACTUALLY_WANT_IT, SizeOf(Boolean));
end;
function TMyEvent.IsKeyUp: Boolean;
begin
Result := BlablablaGetMeIsKeyUpPlease(BlaBlaBlaParam, nil, JUST_DO_IT or YES_I_ACTUALLY_WANT_IT, SizeOf(Boolean));
end;
end;
{$ENDIF}
...
end.
А теперь можете проголосовать и сказать что об этом думаете.