powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Spring4D
25 сообщений из 86, страница 2 из 4
Spring4D
    #39947552
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот тоже со скепсисом к ней отношусь, но бы хотел послушать описние вкуса устриц от тех кто их ел.
...
Рейтинг: 0 / 0
Spring4D
    #39947656
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Если вы разрабатываете приложение командой
Если у вас применяется многослойная архитектура приложения, например по аналогии с CleanArchitecture
Если вы покрываете все модульными тестами

То применение IoC позволит вам более гибче реагировать на изменения в проекте, а также поддерживать модульные тесты...

К примеру в asp .net core идет из коробки собственная реализация IoC и реализовывать все заложенные абстракции можно только через него, что очень удобно...
Описал в одном месте все зависимости, а в классах пишешь только то, что эти классы должны делать согласно принципам SOLID...
Весь код модульный и легко изучаемый... Каждый новый миньон на проекте не будет погружаться в тонны лапши, а изучив архитектуру приложения, поймет, что если надо реализовать такую абстракцию, то делаем так.. Если надо другую абстракцию, то делаем так...

Самая большая проблема в том, что Delphi - это RAD... Но какой-то кустарный и мягко говоря не расширяемый...
Поэтому применение современных мировых практик очень плохо накладываются на него..
...
Рейтинг: 0 / 0
Spring4D
    #39947676
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
реализация IoC <..> согласно принципам SOLID
<..>
если надо реализовать такую абстракцию, то делаем так.. Если надо другую абстракцию, то делаем так...
Нифига не понял.
А можно по простому, для тех кто в танке?

Простейший пример кода бы объяснил больше чем страницы абстрактной теории.
...
Рейтинг: 0 / 0
Spring4D
    #39947683
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Простейший пример кода бы объяснил больше чем страницы абстрактной теории.

Процедурные типы и классовые ссылки. Фсё. Это тебе сразу и инъекции зависимостей и инверсия управления
...
Рейтинг: 0 / 0
Spring4D
    #39947684
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Spring4D
    #39947699
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем опять мне "в гугль" послали. :)

Я конечно все понимаю, но когда "простейший" пример - это проект из десятка файлов - то:
...
Рейтинг: 0 / 0
Spring4D
    #39947723
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот фреймворк не предназначен для простейших приложений...

Вы для приложения сначала проектируете архитектуру, выделяете все абстракции, взаимосвязи между ними..
Затем в одном месте по сути описываете реализации абстракций - профит...
Каждый класс - имеет одну и только одну причину для изменений
Тестировать такие классы одно удовольствие..
Изменение внутренней реализации таких классов не сломает другие, и не сломает другую логику...

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

Для юниттестов удобно делать моки классов по работе с бд, сервисами и прочими зависимостями, которые будут эмулировать работу, Тем самым не нужно для тестирования бизнес-логики разворачивать инфраструктуру... и т.д.

Вообщем для тех кто пишет ПО кидая на форму компоненты и прямо там же код логики - это не подойдет...

Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
program SpringExample;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Spring.Container;

type
  IMove = interface
  ['{A1A2EB2E-A499-4D9A-8D11-FA94EA1F231D}']
    procedure Move;
  end;

  TSwim = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  TRun = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  TWalk = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  IPeople = interface
  ['{0CFC7987-8DE0-4BCB-A78F-99CA46D5DA08}']
    procedure GoToWork;
  end;

  TPeople = class(TInterfacedObject, IPeople)
  strict private
    FMove: IMove;
  public
    constructor Create(const aMove: IMove);
    procedure GoToWork;
  end;

{ TSwim }

procedure TSwim.Move;
begin
  Writeln('I Swim ');
end;

{ TRun }

procedure TRun.Move;
begin
  Writeln('I Run ');
end;

{ TWalk }

procedure TWalk.Move;
begin
  Writeln('I Walk ');
end;

{ TPeople }

constructor TPeople.Create(const aMove: IMove);
begin
  FMove := aMove;
end;

procedure TPeople.GoToWork;
begin
  FMove.Move();
end;

begin
  GlobalContainer.RegisterType<IMove, TSwim>();
//  GlobalContainer.RegisterType<IMove, TRun>();
//  GlobalContainer.RegisterType<IMove, TWalk>();
  GlobalContainer.RegisterType<IPeople, TPeople>();

  GlobalContainer.Build();

  var People := GlobalContainer.Resolve<IPeople>();
  People.GoToWork();
  People := nil;
  Readln;
end.

...
Рейтинг: 0 / 0
Spring4D
    #39947728
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Этот фреймворк не предназначен для простейших приложений...

Вы для приложения сначала проектируете архитектуру, выделяете все абстракции, взаимосвязи между ними..
Затем в одном месте по сути описываете реализации абстракций - профит...
Каждый класс - имеет одну и только одну причину для изменений
Тестировать такие классы одно удовольствие..
Изменение внутренней реализации таких классов не сломает другие, и не сломает другую логику...

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

Для юниттестов удобно делать моки классов по работе с бд, сервисами и прочими зависимостями, которые будут эмулировать работу, Тем самым не нужно для тестирования бизнес-логики разворачивать инфраструктуру... и т.д.

Вообщем для тех кто пишет ПО кидая на форму компоненты и прямо там же код логики - это не подойдет...

Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
program SpringExample;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Spring.Container;

type
  IMove = interface
  ['{A1A2EB2E-A499-4D9A-8D11-FA94EA1F231D}']
    procedure Move;
  end;

  TSwim = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  TRun = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  TWalk = class(TInterfacedObject, IMove)
  strict private
    procedure Move;
  end;

  IPeople = interface
  ['{0CFC7987-8DE0-4BCB-A78F-99CA46D5DA08}']
    procedure GoToWork;
  end;

  TPeople = class(TInterfacedObject, IPeople)
  strict private
    FMove: IMove;
  public
    constructor Create(const aMove: IMove);
    procedure GoToWork;
  end;

{ TSwim }

procedure TSwim.Move;
begin
  Writeln('I Swim ');
end;

{ TRun }

procedure TRun.Move;
begin
  Writeln('I Run ');
end;

{ TWalk }

procedure TWalk.Move;
begin
  Writeln('I Walk ');
end;

{ TPeople }

constructor TPeople.Create(const aMove: IMove);
begin
  FMove := aMove;
end;

procedure TPeople.GoToWork;
begin
  FMove.Move();
end;

begin
  GlobalContainer.RegisterType<IMove, TSwim>();
//  GlobalContainer.RegisterType<IMove, TRun>();
//  GlobalContainer.RegisterType<IMove, TWalk>();
  GlobalContainer.RegisterType<IPeople, TPeople>();

  GlobalContainer.Build();

  var People := GlobalContainer.Resolve<IPeople>();
  People.GoToWork();
  People := nil;
  Readln;
end.



Попробуйте Swap(A, B);
...
Рейтинг: 0 / 0
Spring4D
    #39947732
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Вот пример оттуда в одном файле, если сложно воспринимать)))

Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
program SpringExample;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Spring.Container;

type
  TOrder = class
  end;

  IOrderValidator = interface
  ['{6D0F52B4-A96F-4C96-97A4-DE45324FDE1B}']
    function ValidateOrder(aOrder: TOrder): Boolean;
  end;

  IOrderEntry = interface
  ['{8D272909-3324-4849-A128-C85E249520CD}']
    function EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
  end;

  IOrderProcessor = interface
  ['{978361F2-65F0-49F7-A00C-964C05683682}']
    function ProcessOrder(aOrder: TOrder): Boolean;
  end;

  TOrderEntry = class(TInterfacedObject, IOrderEntry)
  public
    function EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
  end;

  TOrderProcessor = class(TInterfacedObject, IOrderProcessor)
  private
    FOrderValidator: IOrderValidator;
    FOrderEntry: IOrderEntry;
  public
    constructor Create(aOrderValidator: IOrderValidator; aOrderEntry: IOrderEntry);
    function ProcessOrder(aOrder: TOrder): Boolean;
  end;

  TOrderValidator = class(TInterfacedObject, IOrderValidator)
  public
    function ValidateOrder(aOrder: TOrder): Boolean;
  end;

{ TOrderEntry }

function TOrderEntry.EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
begin
  Result := Assigned(aOrder);
  Writeln('Entering order into the database....');
end;

{ TOrderProcessor }

constructor TOrderProcessor.Create(aOrderValidator: IOrderValidator; aOrderEntry: IOrderEntry);
begin
  FOrderValidator := aOrderValidator;
  FOrderEntry := aOrderEntry;
end;

function TOrderProcessor.ProcessOrder(aOrder: TOrder): Boolean;
var
  OrderIsValid: Boolean;
begin
  Result := False;
  OrderIsValid := FOrderValidator.ValidateOrder(aOrder);
  if OrderIsValid then
    Result := FOrderEntry.EnterOrderIntoDatabase(aOrder);
  Writeln('Order has been processed....');
end;

{ TOrderValidator }

function TOrderValidator.ValidateOrder(aOrder: TOrder): Boolean;
begin
  Result := Assigned(aOrder);
  Writeln('Validating Order....');
end;

begin
  GlobalContainer.RegisterType<TOrderEntry>;
  GlobalContainer.RegisterType<TOrderProcessor>;
  GlobalContainer.RegisterType<TOrderValidator>;

  GlobalContainer.Build;

  var Order := TOrder.Create;
  try
    var OrderProcessor := GlobalContainer.Resolve<IOrderProcessor>;
    if OrderProcessor.ProcessOrder(Order) then
      Writeln('Order successfully processed....');
  finally
    Order.Free;
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
Spring4D
    #39947746
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

но если что случись, ты утонешь в отладке всего того гумна, которое так написано

X-CiteКаждый класс - имеет одну и только одну причину для измененийна собственном опыте могу сказать, что это очень сомнительное удовольствие
...
Рейтинг: 0 / 0
Spring4D
    #39947749
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
kealon(Ruslan)
Вот потому от этого и надо избавляться, и тем более этого не долно быть в библиотеках.

Чего-чего? Можно тезисно, по пунктам?
неожиданно...
даже в гугл посылать как-то странно

простой пример: есть ленивая функция создания объекта, соответственно в финализации подчищается инстант этого объекта
если так намудрить с подключениями, то есть очень большой шанс, что функция сработает после финализации. Особенно это актуально когда через проект проходит толпа народа.
...
Рейтинг: 0 / 0
Spring4D
    #39947759
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Я таки хочу это увидеть, и понять, наконец, о чём идёт речь.
...
Рейтинг: 0 / 0
Spring4D
    #39947773
Сергей Фролов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat

А можно по простому, для тех кто в танке?
Простейший пример кода бы объяснил больше чем страницы абстрактной теории.

DMVCFramework пытается следовать всем этим современным практикам. Причём без фанатизма, что главное. Исходники открыты.
Но да, читать придётся много. Но ты ж, думаю, и VCL когда-то по исходникам понимал (надеюсь), а не по обработчикам событий.
...
Рейтинг: 0 / 0
Spring4D
    #39947774
Сергей Фролов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
простой пример: есть ленивая функция создания объекта, соответственно в финализации подчищается инстант этого объекта
если так намудрить с подключениями, то есть очень большой шанс, что функция сработает после финализации.

Я правильно понял, есть инициализатор чего-то, который может вызываться после отработки секции finalization?!?
Да тут вообще ничего не поможет
...
Рейтинг: 0 / 0
Spring4D
    #39947776
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Фролов,

Речь, предполагаю, о циклических ссылках.
...
Рейтинг: 0 / 0
Spring4D
    #39947806
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
rgreat,

Вот пример оттуда в одном файле, если сложно воспринимать)))

Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
program SpringExample;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Spring.Container;

type
  TOrder = class
  end;

  IOrderValidator = interface
  ['{6D0F52B4-A96F-4C96-97A4-DE45324FDE1B}']
    function ValidateOrder(aOrder: TOrder): Boolean;
  end;

  IOrderEntry = interface
  ['{8D272909-3324-4849-A128-C85E249520CD}']
    function EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
  end;

  IOrderProcessor = interface
  ['{978361F2-65F0-49F7-A00C-964C05683682}']
    function ProcessOrder(aOrder: TOrder): Boolean;
  end;

  TOrderEntry = class(TInterfacedObject, IOrderEntry)
  public
    function EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
  end;

  TOrderProcessor = class(TInterfacedObject, IOrderProcessor)
  private
    FOrderValidator: IOrderValidator;
    FOrderEntry: IOrderEntry;
  public
    constructor Create(aOrderValidator: IOrderValidator; aOrderEntry: IOrderEntry);
    function ProcessOrder(aOrder: TOrder): Boolean;
  end;

  TOrderValidator = class(TInterfacedObject, IOrderValidator)
  public
    function ValidateOrder(aOrder: TOrder): Boolean;
  end;

{ TOrderEntry }

function TOrderEntry.EnterOrderIntoDatabase(aOrder: TOrder): Boolean;
begin
  Result := Assigned(aOrder);
  Writeln('Entering order into the database....');
end;

{ TOrderProcessor }

constructor TOrderProcessor.Create(aOrderValidator: IOrderValidator; aOrderEntry: IOrderEntry);
begin
  FOrderValidator := aOrderValidator;
  FOrderEntry := aOrderEntry;
end;

function TOrderProcessor.ProcessOrder(aOrder: TOrder): Boolean;
var
  OrderIsValid: Boolean;
begin
  Result := False;
  OrderIsValid := FOrderValidator.ValidateOrder(aOrder);
  if OrderIsValid then
    Result := FOrderEntry.EnterOrderIntoDatabase(aOrder);
  Writeln('Order has been processed....');
end;

{ TOrderValidator }

function TOrderValidator.ValidateOrder(aOrder: TOrder): Boolean;
begin
  Result := Assigned(aOrder);
  Writeln('Validating Order....');
end;

begin
  GlobalContainer.RegisterType<TOrderEntry>;
  GlobalContainer.RegisterType<TOrderProcessor>;
  GlobalContainer.RegisterType<TOrderValidator>;

  GlobalContainer.Build;

  var Order := TOrder.Create;
  try
    var OrderProcessor := GlobalContainer.Resolve<IOrderProcessor>;
    if OrderProcessor.ProcessOrder(Order) then
      Writeln('Order successfully processed....');
  finally
    Order.Free;
  end;
  Readln;

end.

А зачем такая простая задача решается так сложно?
Зачем нужен GlobalContainer?
Чем это лучше обычного TInterfacedObject?
В чем преимущество такого подхода?
...
Рейтинг: 0 / 0
Spring4D
    #39947807
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Сергей Фролов,

Речь, предполагаю, о циклических ссылках.
а о чём же ещё?
я вроде русским языком как для особо одарённых написал
авторuses блоков в implements нет?
сама библиотека так же раскоряжена
...
Рейтинг: 0 / 0
Spring4D
    #39947808
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
Spring4D
    #39947809
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
А зачем такая простая задача решается так сложно?
Чем это лучше обычного TInterfacedObject?
В чем преимущество такого подхода?
явисты мотивирует это тем, что так можно покрыть всё тестами и декларативно удостовериться что покрываешь бизнес-задачу
но в кулуарах они же говорят, что можно срубить с заказчика бабла за резгребание того, что получается таким методом :-)
...
Рейтинг: 0 / 0
Spring4D
    #39947811
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
А зачем такая простая задача решается так сложно?
Зачем нужен GlobalContainer?
Чем это лучше обычного TInterfacedObject?
В чем преимущество такого подхода?

https://ru.wikipedia.org/wiki/Инверсия_управления
https://ru.wikipedia.org/wiki/Внедрение_зависимости

Если вы не понимаете что это и зачем это, значит вам оно не нужно
...
Рейтинг: 0 / 0
Spring4D
    #39947812
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Т.е. примеров пользы не будет?
...
Рейтинг: 0 / 0
Spring4D
    #39947814
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
а о чём же ещё?
я вроде русским языком как для особо одарённых написал

Возможно, я недостаточно одарён, но я понял это как подключение модулей в части реализации, что есть обычная практика. На цикличность тут даже намёка нет. Хотя, возможно, цикличность ты обозначил раскоряженностью. Штош.
...
Рейтинг: 0 / 0
Spring4D
    #39947841
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
https://ru.wikipedia.org/wiki/Инверсия_управления
https://ru.wikipedia.org/wiki/Внедрение_зависимости

Если вы не понимаете что это и зачем это, значит вам оно не нужно
Это опять общие слова, объясняющие "что это", но ничего не говорящие на тему "зачем это".
...
Рейтинг: 0 / 0
Spring4D
    #39947844
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Если вы не понимаете что это и зачем это, значит вам оно не нужно
+100500))
...
Рейтинг: 0 / 0
Spring4D
    #39947872
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
kealon(Ruslan)
а о чём же ещё?
я вроде русским языком как для особо одарённых написал

Возможно, я недостаточно одарён, но я понял это как подключение модулей в части реализации, что есть обычная практика. На цикличность тут даже намёка нет. Хотя, возможно, цикличность ты обозначил раскоряженностью. Штош.
вот я тебе и говорю, что это очень ***новая практика

от себя ИМХО добавлю, что регистрация классов, тоже к этому относится
...
Рейтинг: 0 / 0
25 сообщений из 86, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Spring4D
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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