- Код: Выделить всё
- 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.
А теперь можете проголосовать и сказать что об этом думаете.









 .
 .   топик стартер, хотел устроить "геноцид" по отношению к спецификаторам: protected, published, private, public, strict private. А "геноцид" - художники допустить не могут
  топик стартер, хотел устроить "геноцид" по отношению к спецификаторам: protected, published, private, public, strict private. А "геноцид" - художники допустить не могут