Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Нарушаете ли вы инкапсуляцию намерянно?   Найти похожие ветки 

 
Kolan ©   (2007-08-02 13:26) [0]

Здравствуйте,
 Есть такой подхо, при котором разрешается нарушать инкапсуляцию для ускорения разработки.
Например в простом контернере:

TCoords = class
public
 FX, FY: Integer;
end;


Поступаете ли вы так?


 
alex_*** ©   (2007-08-02 13:33) [1]

жуть какая. Спрячь и никому не показывай


 
Mystic ©   (2007-08-02 13:35) [2]

А зачем класс? Структура самое то. И FX у public полей это лишнее. И мы получим TPoint.

Но в более сложных случаях может образовываться ООП-спагетти, которое не так то просто разрулить. Как по мне, куда более плохое, нежели goto.

Класс желательно должен быть целостным в том смысле, чтобы его нельзя было взять и испортить из другого модуля нехакерскими методами. Если некоторым полям можно присваивать значения без ограничений, то сделай их доступными свойствами, или выдели их в отдельную структуру, которой можно было бы инициализировать класс и т. д. На самом деле это не так уж замедляет разработку.


 
DVM ©   (2007-08-02 13:38) [3]


> А зачем класс?

Бывают случаи когда нужна цепочка вот таких классов, наследующихся друг от друга и каждый добавляет какие-то свои свойства. С записями не очень выглядит.


 
alex_*** ©   (2007-08-02 13:42) [4]


>
> Но в более сложных случаях может образовываться ООП-спагетти,
>  которое не так то просто разрулить. Как по мне, куда более
> плохое, нежели goto.
>

куда проще сделать спагетти из структур и процедур которые их обрабатывают


 
TUser ©   (2007-08-02 13:42) [5]

Я такие штуки делаю, и не понимаю, чем

TMyClass = class
...
public
  X, Y: integer;
end;

хуже, чем

TMyClass = class
  ...
  FX, FY: integer;
public
  ...
  property X: integer read FX write FX;
end;

Разумеется, в классе есть другие поля и методы, в противном случае был бы record.


 
DVM ©   (2007-08-02 13:44) [6]

вот кстати прямо сейчас занимаюсь тем же


type

 TServerResponse = class
 public
   FAttributes: TAttributes;
   ResponseDate: TDateTime;
   Response: string;
   ResponseMessage: string;
   ActionID: string;
   ResponseString: string;
   ResponseCode: integer;
   constructor Create;
   destructor Destroy; override;
   procedure FillFields(Msg: string); virtual;
 end;

 THelloResponse = class(TServerResponse)
 public
   Version: string;
   MD5: string;
   procedure FillFields(Msg: string); override;
 end;

 TServerBusyResponse = class(THelloResponse);
 TAccessDeniedResponse = class(THelloResponse);

 TAuthResponse = class(TServerResponse);

     TLogOffResponse = class(TAuthResponse);
     TAuthAcceptResponse = class(TAuthResponse);
     TAuthFailedResponse = class(TAuthResponse);
     TAuthRequiredResponse = class(TAuthResponse);

 TPongResponse = class(TServerResponse);

 TErrorResponse = class(TServerResponse);

     TMissingActionResponse = class(TErrorResponse);
     TInvalidCommandResponse = class(TErrorResponse);


 
Игорь Шевченко ©   (2007-08-02 13:45) [7]


>  Нарушаете ли вы инкапсуляцию намерянно?


Эликировали ли вы машек силически ? (с) Роберт Шекли


 
Kolan ©   (2007-08-02 14:11) [8]

> Я такие штуки делаю, и не понимаю, чем

Вскорости написания. Если полей много, то значительно&#133


> А зачем класс?

Это пример.


 
Kolan ©   (2007-08-02 14:17) [9]


> Эликировали ли вы машек силически ?

Указать даты всех случаев?


 
{RASkov} ©   (2007-08-02 14:50) [10]

> [5] TUser ©   (02.08.07 13:42)

"Обсалютно" одинаково.... т.е. безсмысленно...


 
{RASkov} ©   (2007-08-02 14:51) [11]

Т.е. "Абсолютно" )


 
{RASkov} ©   (2007-08-02 14:53) [12]

Т.е.
"Абсолютно" одинаково.... т.е. бессмысленно...)


 
DVM ©   (2007-08-02 14:54) [13]


> {RASkov}

надо было пить безалкогольное пиво


 
{RASkov} ©   (2007-08-02 14:57) [14]

> [13] DVM ©   (02.08.07 14:54)

Я не пью вообще... :) бросил.
Вот и праздник сегодня, аж не в своей тарелке... :(
А ошибки.... дык у меня по русскому тройки были всегда, а тут еще жара...:)


 
Sandman29 ©   (2007-08-02 15:24) [15]

Никакого ускорения.
Набираем
property X: Integer; и нажимаем Ctrl+Shift+C.
Получаем объявление FX и SetFx.

Или набираем
property X: Integer read FX;
Получаем объявление Fx.

Или набираем
property X: Integer write FX;
Получаем объявление FX и read FX.


 
vpbar ©   (2007-08-03 10:50) [16]

А я вообще не вижу чем тут нарушается  инкапсуляция. Если  поля класса должны быть общедоступны то я делаю так.
TCoords = class
public
X, Y: Integer;
end;
Если в дальнейшем понадобится чтото делать при чтении записи поля то

TCoords = class
 FX:integer;
public
Y: Integer;
property X: Integer read FX write SetX;
end;
А коду использующему этот клас все равно что там поле или свойство. Правда потребуется лишьняя перекомпиляция.


 
Суслик ©   (2007-08-03 15:56) [17]

сильно зависит от ситуации.
иногда классы, объявленные под implementation, не насилую лишний раз, т.е. иногда нарушаю эту инкапсуляцию.

между модулями - никогда.


 
oxffff ©   (2007-08-03 16:27) [18]


> Kolan ©   (02.08.07 13:26)  
> Здравствуйте,
>  Есть такой подхо, при котором разрешается нарушать инкапсуляцию
> для ускорения разработки.
> Например в простом контернере:
>
> TCoords = class
> public
>  FX, FY: Integer;
> end;


А где здесь нарушение инкапсуляции?


 
Kolan ©   (2007-08-03 16:39) [19]

> А где здесь нарушение инкапсуляции?

А что есть по твоему инкапсуляция?


 
oxffff ©   (2007-08-03 16:57) [20]


> А что есть по твоему инкапсуляция?


Инкапсуля́ция — свойство языка программирования, позволяющее скрывать реализацию объекта от пользователя. При этом пользователю предоставляется только спецификация ( интерфейс) объекта. Пользователь может взаимодействовать с объектом только через интерфейс.

Почему по твоему мнению FX, FY не может являться интерфейсом?

FX, FY не влияют на другие данные.
Поэтому операторы присваивания и взятия значение (write и read) можно оставить по умолчанию.


 
vpbar ©   (2007-08-03 16:58) [21]

>>Kolan ©   (03.08.07 16:39) [19]
Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейс класса и не вникать в его внутреннюю реализацию. Этот принцип (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.

Под интерфейсом понимается способ взаимодействия с классом (как  минимум набор методов класса). Кроме методов иногда включают свойства(параметры) класса. Во многих ЯП свойства класса соответствуют полям в терминах Delphi. Property  добавлены для удобства и их можно заменить парой методов.

Т.о. если FX, FY: Integer; являются частью интерфейса класса то инкапсуляция здесь не нарушается.
Хотя если следовать соглашениям именования иднтификаторов в Delphi то FX - предпологается скрытое поле. Для доступного из вне параметра больше подойдет имя X



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
1-1181927807
olevacho_
2007-06-15 21:16
2007.09.02
Чтение sms с мобильника


3-1178863927
Dmitry_177
2007-05-11 10:12
2007.09.02
Создание таблицы в DataBase


15-1185958293
Grant
2007-08-01 12:51
2007.09.02
Создание трехзвенной системы


4-1173028061
GrayFace
2007-03-04 20:07
2007.09.02
Access Violation в shell32.dll при вызове IFolderView.Items


3-1178528451
DmitrichJ
2007-05-07 13:00
2007.09.02
Как проверить установлен или нет firebird?