использование свойства против геттеров / сеттеров в бизнес-классах - PullRequest
14 голосов
/ 19 октября 2010

При работе с классами бизнеса, такими как типичные классы Customer и Employee, лучше ли использовать только методы получения и установки или использовать свойства?

Я перевожу в Delphi (для самообучения) некоторые примеры OOиз книг Java, в этих примерах всегда есть GetName () и SetName (), свойства не используются.

Теперь я вижу, что если я создаю компонент с опубликованными свойствами, у меня есть очень веская причина дляиспользуя свойства, но в обычных классах какой подход лучше?Является ли код более читабельным для методов получения и установки (которые подчеркивают тот факт, что мы читаем / пишем свойство) или для свойств (которые на первый взгляд можно спутать с методами без параметров)?

Ответы [ 4 ]

35 голосов
/ 19 октября 2010

Ничего себе.Свойства - это намного больше, чем «они просто обертки для методов получения и установки».

Свойства - это элегантный, но мощный способ предоставления контролируемого доступа к полям класса.

Доступ к полям

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

TMyClass = class
private
  FValue: String;
public
  property Value: String read FValue write FValue;
end; 

Позже вы можете изменить дизайн своего класса для проверки и управления доступом к полю с помощью методов.Публичный интерфейс будет прежним.

TMyClass = class
private
  FValue: String;
  procedure SetValue(AValue: String);
public
  property Value: String read FValue write SetValue;
end; 

procedure TMyClass.SetValue(AValue: String);
begin
  if AValue = '' 
  then FValue := 'No value!'
  else FValue := AValue;
end;

Управление доступом

Свойства дает вам простой обзор полей только для чтения / записи.Например, доступный только для чтения / неизменный класс:

TClient = class
private
  FName: String;
  FSite: String;
  FMail: String;
public
  constructor Create(AName, ASite, AMail: String);
  property Name: String read FName;
  property Site: String read FSite;
  property Mail: String read FMail;
end; 

Полиморфизм

TClient = class
private
  FName: String;
protected
  function GetName: String; virtual; abstract;
public
  property Name: String read GetName write FName;
end; 

TImportantClient = class(TClient)
protected
  function GetName: String; override;
end; 

TArgumentativeClient = class(TClient)
protected
  function GetName: String; override; 
end; 

function TImportantClient.GetName: String; 
begin
  Result := '+++ ' + FName;
end; 

function TArgumentativeClient.GetName: String; 
begin
  Result := ':-( ' + FName;
end; 

{----- ----- ----- ----- -----}
var
  ClientA,
  ClientB: TClient;
begin
  ClientA := TImportantClient.Create;
  ClientB := TArgumentativeClient.Create;

  ClientA.Name := 'Mr. Nice';
  ClientB.Name := 'Mr. Dumbhead';

  ShowMessage(ClientA.Name);
  ShowMessage(ClientB.Name);
end;
{----- ----- ----- ----- -----}

Свойства по умолчанию

В вашем классе вы можете определить поля класса по умолчанию, что означает, что вы можетедоступ к полю напрямую без указания имени свойства.

A := MyStringList[i]:
MyStringList[i] := B;

{ instead of }

A := MyStringList.Strings[i];
MyStringList.Strings[i] := B;

{ or }

A := MyStringList.GetString(i);
MyStringList.SetString(i, B);

Индекс

С ключевым словом Index Delphi передаст постоянное значение в качестве аргумента методам получения / установки.

TMyRect = class
private
  FValues: Array[0..3] of Integer;
  function GetProperty(Index: Integer): Integer;
public
  property Top    : Integer  Index 0  read GetProperty;
  property Left   : Integer  Index 1  read GetProperty;
  property Width  : Integer  Index 2  read GetProperty;
  property Height : Integer  Index 3  read GetProperty;
end;


function TMyRect.GetProperty(Index: Integer): Integer;
begin
  Result := FValues[Index];
end; 

Некоторые ресурсы

Есть еще несколько тем для обсуждения (реализация интерфейсов, сохраненные значения, свойства RTTI / времени разработки и т. Д.), Но этот пост начал становиться немного длиннее ...

Подробнее можно прочитать на этих сайтах:

12 голосов
/ 19 октября 2010

Нет. Методы получения и установки есть только в Java, потому что у него нет свойств. Это делает код более понятным для использования свойств. И затем, если вам нужен метод получения или установки, вы можете встроить его в свойство, но вам не нужно засорять код доступа множеством вызовов функций.

10 голосов
/ 19 октября 2010

Свойства являются большим преимуществом Delphi.Я сделал немало Java и Delphi и определенно выбрал бы Properties.Практически оба подхода в конечном итоге будут делать то же самое, с той лишь разницей, что свойства выглядят НАМНОГО лучше, чем геттеры / сеттеры.

Я предлагаю вам выбрать свойства и в полной мере использовать их!

4 голосов
/ 19 октября 2010

Это действительно вопрос вкуса и использования.

Для программистов, похожих на паскаль, очень ясно, читаете ли вы или записываете значение, поэтому я думаю, что код более читабелен, если вы не используете геттеры и сеттеры способом, подобным java, когда вы пишете GetXXXили SetXXX в каждом предложении вашей программы.

Для меня, и я предполагаю, что для большинства программистов на Паскале код более читабелен, если вы просто введете имя свойства, которое вы читаете / пишете, и мы все знаем, что метод Getter или Setterбыть вызванным (при необходимости).

Кроме того, я думаю, что это огромная выгода (и элегантность) от модели свойств delphi, которую вы можете получить / установить значение свойства непосредственно из поля./ Устанавливать методы с помощью только строки кода, где значение присваивается или читается из поля, - это пустая трата усилий / времени.

...