Swift DSL - Как создать плоский словарь из известных постоянных данных? - PullRequest
0 голосов
/ 15 апреля 2019

Нам нужно отправить аналитические данные на сервер.Это концептуально иерархический.Это может быть вопрос Swift DSL (Domain Specific Language).

Пример вызова метода, который мы хотим поддержать:

trackEvent(name: UCL.tapSaveCar, groupData: UCL.SRP.Results.VehicleModule)

groupData - этофокус этого вопроса.

Как часть его обработки, trackEvent создаст плоский словарь из этого UCL.SRP.Results.VehicleModule, который выглядит следующим образом:

["Group": "UCL", "SubGroup" : "SRP", "Page" : "UCL SRP Results", "Location" : "UCL SRP Results : Vehicle Module", "Value" : ""]

Примечание : Ключ / значение словаря "Location" : "UCL SRP Results : Vehicle Module" не является опечаткой.

Дублирование удушения в значениях словаря связано с потребностями бизнеса и инструментом, который они используют.

Другие возможные groupData, которые будут преобразованы, будут:

  • UCL.VDP.Enhanced.ActionRow
  • UCL.DealerMicrosite.Enhanced.ActionRow
  • UCL.DealerMicrosite.UCLDealerMicrosite.DealerProfile.Waze Waze ставит "Value" : "Waze" в словарь.

Как вы можете сказать, существует концептуальная иерархия Group.SubGroup.Page.Location.Value

Вопрос: Как создать такую ​​вещь, которая превращает известные статические / постоянные иерархические данные в плоские словари?

Обновление :

  • Вариации вокруг UCL.SRP.Results.VehicleModule с круглыми скобками, по-разному или в любом другом порядке.
  • Должна поддерживаться проверка времени компиляции.
  • Для Google Analytics SDK требуется словарь типа.

1 Ответ

0 голосов
/ 15 апреля 2019

Как вы можете сказать, существует концептуальная иерархия Group.SubGroup.Page.Location.Value

Это похоже на Tuple для меня. У вас всегда один и тот же список элементов, верно? Словари хороши, когда у вас есть несколько произвольных пар ключ-значение, но если ключи всегда одинаковы (например, группа, подгруппа, страница и т. Д.), То вам следует рассмотреть кортеж. И поскольку значения, по-видимому, все также известны, может иметь смысл использовать перечисления. Вот пример (с некоторыми дополнительными значениями):

enum Group {
    case UCL, LCL, LCP, DDO
}

enum Subgroup {
    case SRP, VDP, DealerMicrosite
}

enum Location {
    case DealerProfile, ActionRow, VehicleModule
}

typealias GroupData = (group: Group, 
                       subgroup: Subgroup,
                       page: String,
                       location: Location,
                       value = String)

Я использовал String здесь для компонентов страницы и значения, потому что не ясно, что они так же хорошо определены. Страница, кажется, состоит из группы, подгруппы и третьей части; если эта третья часть перечислима, то вы можете использовать перечисление для этого. То же самое по стоимости, конечно.

После того, как вы это определили, писать о функциях, конвертирующих формат Group.SubGroup.Page.Location.Value в GroupData.

, не составит труда.

Если кортежи не имеют смысла для вашего случая, например если вам нужен метод доступа, который возвращает Page вместо использования отдельной функции, то напишите класс, содержащий те же значения. В любом случае, использование перечислений для известных частей позволит компилятору проверить, что вы всегда используете допустимые имена.

...