Использование недвижимости VS Getter / Benters в бизнес-классах

StackOverflow https://stackoverflow.com/questions/3963874

Вопрос

При работе с классами Buisness, таких как типичные классы клиентов и сотрудников, лучше ли использовать Getter и Getters только или использовать свойства?

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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 пропускает постоянное значение в качестве аргумента для методов Getter / Setter.

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 / Design Time Properties etc), но этот пост начал получать немного долго ...

Больше можно прочитать на этих сайтах:

Свойства являются большим преимуществом Delphi. Я сделал совсем немного java и Delphi и определенно пошел бы на недвижимость. Практически оба подхода в конечном итоге сделают то же самое, что единственное различие о том, что свойства выглядят много блестящими, чем GetTers / Benters.

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

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

Для Passal вроде программистов, очень ясно, если вы читаете или пишу значение, поэтому я думаю, что код более читабелен, если вы не используете GetTers и Setters в Java-Arty Way, где вы пишете GetXxx или SetXXX в любое предложение Ваша программа.

Для меня, и я предполагаю, что большинство программистов PASCAL, код более читабелен, если вы просто поместите имя недвижимости, которое вы чтете / письма, и мы все знаем, что будет предъявлен метод Petter или Setter (при необходимости) Отказ

Кроме того, я думаю, что это огромная выгода (и элегантность) из модели свойств Delphi, которую вы можете получить / установить значение свойства непосредственно из поля, чтобы иметь много методов Get / Set только с линейкой кода, где значение назначен или читается из поля, является полная трата усилий / времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top