Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Еще раз о Классах Delphi  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 152
Всем привет, возник вопрос по классах, возможно покажется глупым и дурацким, не ругайте громко.

Допустим есть класс.
TUsers = class


есть поля класса

FID:Integer;
FLogin:string;
FID_parent:Integer;
....
и т. д

Есть проперти

 property ID:Integer read FID write setID;
 property Login:string read FLogin write setLogin;
 property ID_parent:string read FID_parent write setID_parent;
....
и т. д


Есть различные методы класса.

В случае если где то необходимо использовать один из методов при етом метод использует не все поля класса , как правильно поступать, использовать конструктор по умолчанию user.create() а потом сетать значения необходимым полям user.id:=1; , user.login='login'; или создавать несколько конструкторов используя Overload?
11 янв 19, 15:30    [21782953]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25068
Sashaua
В случае если где то необходимо использовать один из методов при етом метод использует не все поля класса , как правильно поступать, использовать конструктор по умолчанию user.create() а потом сетать значения необходимым полям user.id:=1; , user.login='login'; или создавать несколько конструкторов используя Overload?

Без разницы.

Обычно делаю один супер-метод, который покрывает все необходимые поля, а потом прикручиваю к нему через overload со значениями по умолчанию, если не получается обойтись с помощью default (например, порядок/тип переменных неоднозначный).
11 янв 19, 15:33    [21782960]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 630
Sashaua
...или...

Пофиг. Это ж не капитальное строительство высотного здания, практически все и всегда переделать можно.
11 янв 19, 16:01    [21782993]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2028
Открой для себя рефакторинг, почитай по нему книжки. И делай как проще. А потом по мере вырисовывания/развития/изменения архитектуры будешь рефакторить. А там видно будет, что в итоге лучше применить на конкретном этапе развития продукта...
12 янв 19, 02:25    [21783448]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 437
Вопрос нормальный, архитектурный.
В целом, это дело вкуса, хотя:
- больше 3-4 параметров в подпрограмме - не гут (рекомендация)
- куча перегруженных конструкторов может запутать, да и не всегда на все сочетания можно наклепать вариантов
- если поле допускает дефолтное значение, то логично сделать его свойством. С другой стороны, если значение должно присваиваться строго при создании, то либо конструктор, либо отдельный метод типа Init.
14 янв 19, 09:58    [21784500]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3068
Если делаешь для себя или для внутреннего ограниченного использования, то можешь делать как угодно. Потом поправите, если что. Если код на сторону или на продажу, желательно, что бы он имел стабильное API. И лучше заранее максимально хорошо продумать.
14 янв 19, 11:32    [21784570]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1582
Sashaua
...
В случае если где то необходимо использовать один из методов при етом метод использует не все поля класса , как правильно поступать, использовать конструктор по умолчанию user.create() а потом сетать значения необходимым полям user.id:=1; , user.login='login'; или создавать несколько конструкторов используя Overload?
Да, как уже сказали тут дело вкуса.
На мой вкус лучше в Create передавать минимальный обязательный набор свойств, обычно те, которые не могут меняться.
Когда много параметров и особенно с overload легко запутаться. Возможны несчастные случаи когда в зависимости от типа входного параметра может поменяться логика работы, например Integer можно без проблем передавать в Double, но при наличии нескольких overload может поменяться вызываемый метод и смысл передаваемого значения.
constructor Create(Id: integer); overload;
constructor Create(Price: Double); overload;
...
X := TCoolObject.Create(Query.FieldByName('Id').Value); 
// Value какого типа? Integer, Double, Variant, ... 
// Какая версия конструктора будет вызвана?
14 янв 19, 13:31    [21784688]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14085
roschinspb,

Вот ещё гадать на кофейной гуще. Гораздо проще надо. А ля как ты говоришь в Create передавать минимальный обязательный набор свойств. После вызвать Init... религии не запрещают.
imho буде лучше, чем CreateById и CreateByPrice
14 янв 19, 14:00    [21784725]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1582
Gator
roschinspb,

Вот ещё гадать на кофейной гуще. Гораздо проще надо...
Собственно, пример на это толсто намекает
14 янв 19, 16:38    [21784924]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 152
Подскажите еще ответ на такой дурацкий вопрос, с всего прочитанного в нете несевсем для меня понятно.

Если есть метод которому на вход надо передать параметр .
get_users (id_user);

как правильно делать.

1. можна сразу в метод передавать парамерт
var
TUsers:users;
 begin
users.get_users (1);


2. или
var
TUsers:users;
 begin
users.id_user=1 
users.get_users;

А уже в реализации метода get_users id_user брать из поля класса, значение которого я передал перед вызовом метода?
Заранее спасибо.
6 фев 19, 14:57    [21802741]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25068
Sashaua
А уже в реализации метода get_users id_user брать из поля класса, значение которого я передал перед вызовом метода?

Зависит от...

Например, если ожидается более одного вызова, то можно и второй способ использовать.
А так особой роли не играет.
6 фев 19, 15:06    [21802750]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29651

совершенно похеру.
ты сам творец.
тебе решать.

Posted via ActualForum NNTP Server 1.5

6 фев 19, 15:06    [21802751]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25068
wadman
Например, если ожидается более одного вызова

Имею в виду: если ожидается более одного вызова метода или методов, которым понадобится единожды установленный параметр.
6 фев 19, 15:08    [21802756]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
DimaBr
Member

Откуда:
Сообщений: 10926
Параметры - это дополнительная информация для метода, которую он не знает.
Если 1 - это параметр id_user, то передавать его не нужно.
6 фев 19, 15:50    [21802823]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1582
Мимопроходящий
совершенно похеру.
ты сам творец.
тебе решать.

Обычно, "творцы" которым "похеру", не приложения пишут, а выгребные ямы наполняют.

Лучше все-таки исходить из того, что проект будут сопровождать и развивать в будущем, возможно даже что не вы. Поэтому стоит с самого начала использовать стандартные подходы и наименования. Например: префиксы Get и Set прочно ассоциируются с геттерами и сеттерами. Первые возвращают значения, вторые принимают. Если наоборот, то это вызывает когнитивный диссонанс...
Я бы сделал так:
TUsers = class(...)
private
  FId: Integer;
  procedure SetId(const Value: Integer);
proteted
  procedure Change; 
public
  property Id: Integer read FId write SetId;

...
procedure TUsers.SetId(const Value: Integer);
begin
  if FId <> Value then
  begin
    FId := Value;
    Change;
  end;
end;

...

Users.Id := 1;
10 фев 19, 17:45    [21805753]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14085
roschinspb,
Именно! Иначе - голимые извраты, писанные извращенцами.
10 фев 19, 19:58    [21805796]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29651

10.02.2019 17:45, roschinspb пишет:
> Лучше все-таки исходить из того, что проект будут сопровождать и развивать в будущем, возможно даже что не вы.
> Поэтому стоит с самого начала использовать стандартные подходы и наименования. Например:
> префиксы Get и Set прочно ассоциируются с геттерами и сеттерами. Первые возвращают значения, вторые принимают.
> Я бы сделал так:

не чейтатетель.
но советователь.
ога.

Posted via ActualForum NNTP Server 1.5

11 фев 19, 14:45    [21806462]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о Классах Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14085
Мимопроходящий
не чейтатетель.
но советователь.
ога.

Да ладно.
Представь, параметрх[ы] зашиты жестко, а алгоритм вычисления поменялся поменялся... Нафига класс менять?
11 фев 19, 15:32    [21806535]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить