Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизНарушаете ли вы инкапсуляцию намерянно? Найти похожие ветки
← →
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]> Я такие штуки делаю, и не понимаю, чем
Вскорости написания. Если полей много, то значительно…
> А зачем класс?
Это пример.
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c