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 ответов

6 просмотров

Смотри в сторону фабрики, через 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 выполнить метод

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

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

А чем вам питонисты не угодили?😂
.
79
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
11
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Ребят, кто сталкивался с тем, что Electron.js не разворачивает билд React.js-приложения? Голый body в чёрном цвете, как и должно быть, но остального - нет. Билд работает исп...
..
6
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Anyone knows how to build this widget in Flutter? I have all the assets for round stations and the road, but how can I make the my widget animate between these stations? And h...
Mohammad Zamani
9
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Карта сайта