Я работаю над небольшим моим хобби-проектом, в котором у меня есть большая структура, которая выполняет все основные задачи. Это ядро само по себе ничего не даст, ему нужна дюжина подсистем , которые действительно выполняют тяжелую работу. В настоящее время я написал только одну подсистему , поэтому все еще легко изменить.
У меня есть много мест кода, где ядро взаимодействует с подсистемами , и я не хочу менять ядро каждый раз, когда добавляю новую подсистему . Моя идея состояла в том, чтобы сделать его модульным.
Долгое время я видел нечто подобное в игровом движке, где новую консольную команду можно было определить с помощью некоторого макроса препроцессора. Это было все, что вам нужно было сделать - после компиляции он мгновенно заработал в игре.
Итак, давайте возьмем игровой движок в качестве примера для моего случая. Я разместил комментарии в приведенном ниже коде, которые должны сделать мой вопрос более очевидным.
Мой вопрос: как мне реализовать модульную систему в Objective-C, которая создается во время компиляции и не требует изменения ничего, кроме самих модулей?
А теперь какой-нибудь код
-(void)interpretCommand:(NSString*)command {
// Find the space in the command
NSRange pos = [command rangeOfString:@" "];
if (pos.length == 0) return; // No space found
NSString *theCommand = [command substringToIndex:pos.location];
// !!! Here comes the important code !!!
// Get all the available commands - this is what my question is about!
NSDictionary *allCommands = nil;
// Find the command in the dictionary
NSString *foundCommand = [allCommands objectForKey:theCommand];
// Execute the command
if (foundCommand != nil) {
[[NSClassFromString(foundCommand) new] execute];
}
}
Я хочу добавить новую команду, например:
REGISTER_COMMAND(MyClassName, "theCommand")
Помните, приведенный выше код не является моим конкретным случаем. Кроме того, я не хочу внешние модули, они должны быть скомпилированы, как если бы они были реализованы изначально . Objective-C в порядке, так же как C ++ или C.
Обновление
Пояснение: я знаю, как сделать это с помощью plist-файла, но если бы я выбрал это, я мог бы также сохранить их в моем реальном коде. Я ищу решение C / C ++ / Objective-C, которое позволяет мне просто добавить модуль с макросом препроцессора.
Обновление 2
Добавление награды - мне бы очень хотелось получить несколько хороших идей для этого.