Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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]

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

Вскорости написания. Если полей много, то значительно&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.046 c
2-1186744190
mfender
2007-08-10 15:09
2007.09.02
TADOQuery и его соедитение с БД


3-1178529064
bss
2007-05-07 13:11
2007.09.02
Как присвоить blob-полю значение NULL?


1-1180716813
Мелодик
2007-06-01 20:53
2007.09.02
Мерцает компонент


15-1186067656
Kenifer
2007-08-02 19:14
2007.09.02
Как инжектирывать свой процесс в чужой процесс?


2-1186731423
Первоклашка
2007-08-10 11:37
2007.09.02
работа с видео





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский