powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Базовый класс для бизнес-сущностей
25 сообщений из 84, страница 1 из 4
Базовый класс для бизнес-сущностей
    #39703149
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, использовал в своих программах бизнес-сущности, типа
Код: c#
1.
2.
3.
4.
TPerson = class
FID:Integer;
….
property ID:Integer read FID write FID;



В итоге поняв, что это ни что иное как DataSet, сделал:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
type
  TField = record
    FName: string;
    FValue: Variant;
  end;

type
  TBase = class
  private
    FFields: TList<TField>;
    function GetField(const AName: string): Variant;
    procedure SetField(const AName: string; const AValue: Variant);
  protected
  public
    property Fields[const ANames: string]: Variant read GetField write SetField; default;
    constructor Create(ANames: array of string);
    destructor Destroy;

  end;

implementation

{ TBase }

constructor TBase.Create(ANames: array of string);
var
  AField: TField;
  I: Integer;
begin
  FFields := TList<TField>.Create;
  for I := Low(ANames) to High(ANames) do
  begin
    AField.FName := ANames[I];
    AField.FValue := null;
    FFields.Add(AField);
  end;
end;

function TBase.GetField(const AName: string): Variant;
var
  I: Integer;
begin
  Result := null;
  for I := 0 to FFields.Count - 1 do
    if FFields[I].FName = AName then
      Result := FFields[I].FValue;
end;

procedure TBase.SetField(const AName: string; const AValue: Variant);
var
  I: Integer;
  TempRec: TField;
begin
  for I := 0 to FFields.Count - 1 do
    if FFields[I].FName = AName then
    begin
      TempRec := FFields[I];   // способ 1
      TempRec.FValue := AValue;
      FFields[I] := TempRec;
    end;
end;

end.



Вопрос - как мне в моем коде применить Dictionary? Я с ними не сильно знаком, по смыслу можно объявив наверное
Код: c#
1.
FDictionaryList = Dictionary<String, TField>



Например как с помощью них реализовать поиск по имени?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703152
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую задачу вы пытаетесь решить? Чем не устроил вариант
wsnet
Код: pascal
1.
2.
3.
4.
TPerson = class
FID:Integer;
….
property ID:Integer read FID write FID;

???
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703153
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wsnetНапример как с помощью них реализовать поиск по имени?
contains key ?

А вообще жесть, конечно. Бизнес-сущности...
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703156
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Да слишком много этих классов, это же неудобно каждый раз описывать ...
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703157
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_original,
На примере моем как-то можете показать?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703158
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetДа слишком много этих классов, это же неудобно каждый раз описывать ...

Во-первых, их не больше, чем бизнес-сущностей.
Во-вторых, каждый раз описывать и не надо, есть наследование.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703159
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_original,
А почему не TryGetValue?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703161
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я их не наследую, слишком они разные эти сущности, общего ничего нет у них, как быть тогда?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703164
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetЯ их не наследую, слишком они разные эти сущности, общего ничего нет у них, как быть тогда?

Тогда надо проводить анализ глубже, ибо общего у них как минимум ID.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703170
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется шаблоном Active Record .

Если внутри будет буфер с полным списком объектов (например, по ID), то остальной поиск делается через обычные циклы for item in itemsList. И возвращает обычный список со ссылками TList<Object> (Т.е. меняя их меняется и "база").
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703173
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wsnetjmp_original,
А почему не TryGetValue?
Не знаю. У тебя надо спросить.
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703174
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, можно на моем примере показать ActiveRecord ?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703176
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Но неужели мой подход плох ? Он не имеет право на жизнь ?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703181
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, скажи в моем коде чтобы ты дополнил, полагаю может какие-то проверки?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703184
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

варианты чего? Если нужен поиск, то делается банальный цикл по всем записям с проверкой по нужному полю. Если нужны данные по ID, то через TryGetValue (если там где-то внутри будет храниться Dictionary).
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703190
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

Тот же Dictionary сделать полем моего класса TBase ? А где его создавать в конструкторе TBase?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703196
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetНо неужели мой подход плох ? Он не имеет право на жизнь ?

Имеет, почему нет. Забавное извращение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703201
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Почему извращение ?)
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703202
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

для чего он нужен? Обычно, когда что-то сложное -- весь код для работы с базой вообще в отдельном объекте/объектах хранят, чтобы не перемешивать бизнес-логику с логикой работы с базой. Т.е. типа TPerson и TPersonsTable(TBaseTable). И вот уже в TBaseTable можно и Dictionary применить для подгрузки туда данных из базы, и всё остальное типа обновления/удаления (TBaseTable.Update(ARecord: TBase)).
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703203
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703206
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetJaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ?
Используй механизм транзакций. Запусти транзакцию с уровнем изоляции "repeatable read", и в ее контексте формируй клиентский набор данных.
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703208
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetПочему извращение ?)

1) Потому что TDataset уже есть и твоему велосипеду ещё до него расти и расти;
2) В процессе этого роста ты откроешь для себя забавные возможности автоформирования UI
(которые в TDataset тоже уже есть);
3) Кодировать придётся на порядок больше, чем в тривиальном первом способе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703210
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetJaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ?
Списки на стороне клиента. Это НЕ реальные данные с базой, а фактически их слепок на какой-то момент времени (чисто для удобства, чтобы по каждому чиху не лазить в базу). Контроль целостности реализуется миллионом способов, начиная от базы данных (блочить таблицу или запись в самой базе при начале редактирования, такое позволяет тот же оракл) и заканчивая самим приложением (хранить сведения о последних изменениях в базе, после их обновлять на клиенте, если что-то меняется).

Например, мне нравится такое решение:
- в базе у объектов есть время последнего изменения;
- при начале редактирования все данные по объекту подгружаются на форму;
- после чего пользователь их изменяет;
- при сохранении происходит проверка текущих данных в базе;
- если их дата изменилась, то пользователь видит предупреждение об изменении и предложении подумать, действительно ли он хочет переписать их своими, тем самым затерев чужие изменения.
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703213
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия, а Read Commited не хватит ?
...
Рейтинг: 0 / 0
Базовый класс для бизнес-сущностей
    #39703216
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetКотовасия, а Read Commited не хватит ?
Ну, если ты уверен, что в поцессе формировпния клиентского датасета никто другой не закоммитит изменения - хватит.
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Базовый класс для бизнес-сущностей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]