169 похожих чатов

Добрый день. Подскажите как лучше реализовать без множества ifов есть

порядка 10 служб доставки, для каждой службы доставки есть клас TDeliveryServices_A_ApiClient = class
TDeliveryServices_B_ApiClient = class TDeliveryServices_C_ApiClient = class
в каждом классе есть месть метод get_tracking_number_status(Atracking_number:string):string;
который возвращает статус отправления по трек номеру. Есть таблица DELIVERY_SERVICES в базе c службами доставки.
ID|NAME|API_KEY|........
как елегантно зеализовать.
if DELIVERY_SERVICES.ID=2 then delivery_service:=TDeliveryServices_A_ApiClient .Create();
.......
.......
if DELIVERY_SERVICES.ID=10 then delivery_service:=TDeliveryServices_C_ApiClient .Create();
.......
.......
без кучи if ?

6 ответов

18 просмотров

Смотри в сторону фабрики, через case

Завести словарь классов. Ключ это ID, value - class. Все классы зарегистрировать в этом словаре при запуске программы. Сами классы могут быть реализованы в разных модулях. Будут доступны только методы базового класса и виртуальные методы. Пример есть в модуле Graphics.

1) Как Дмитрий Логинов подсказал. 2) Каждый класс имеет классовое поле/метод со своим ID, регистрировать классы в *любом* контейнере и искать по нему, Вариант 1 когда нет словаря. 3) RTTI, в DELIVERY_SERVICES в поле Name писать имя класса. Получать класс по имени и создавать экземпляр. 4) APISHIP и подобное, и вообще не париться со множеством служб. https://softfinder.ru/services/treking-zakazov

Sasha-Sch Автор вопроса
Sasha Sch
А value такого класса какого типа будут?

TBaseDeliveryServices TDeliveryServices_A_ApiClient (TBaseDeliveryServices) TDeliveryServices_B_ApiClient (TBaseDeliveryServices) dict := TDictionary<Integer, TBaseDeliveryServices>.Create; dict.TryAdd(1, TDeliveryServices_A_ApiClient); dict.TryAdd(2, TDeliveryServices_B_ApiClient);

Sasha-Sch Автор вопроса
Alexey Gavrilov
TBaseDeliveryServices TDeliveryServices_A_ApiClien...

Подскажите пожалуйста как потом с дикта по key выполнить метод

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта