Я писал фреймворк для себя в С#, а мой фреймворк работает поверх рамок Xna. В коде приложения, который использует эту структуру, мне часто приходится включать ссылки на мои рамки и инфраструктуру Xna. В большинстве случаев эти ссылки Xna включают только такие структурные классы, как Vector2 и Rectangle. Из-за этого я стараюсь, чтобы имя моих классов не противоречило названиям классов Xna. Это может стать утомительным и даже запутать меня, когда у меня есть классы, где я придумал подобное имя, но не то же самое, что и Xna. (т.е. GamePadDevice и GamePad)
У меня была идея в последнее время, но я не знаю, стоит ли это. Я использую только несколько, 5 или 6 структур во всей структуре. Стоит ли абстрагировать эти структуры, чтобы мой код приложения должен был иметь дело только с моей картой? Я мог бы сделать это, написав собственные версии структур или наследовав их, или кто-то может предложить лучший способ. Накладные расходы упрощают мой код приложения?
Я не знаю, как глубоко ваша инфраструктура продолжает заменять слой XNA, но если пользователь больше не имеет контакта с XNA и "просто" использует вашу фреймворк, тогда было бы лучше, если ваша фреймворк раскрывает только свои собственные структуры для клиента. В конце концов, вы можете отказаться от XNA в один прекрасный день и поддерживать XNB или XNC?
Если вы пишете mapper в своей структуре, который переводится, вы будете иметь возможность сделать это позже
Хорошим способом абстрагироваться от сторонних библиотек является внедрение интерфейсов с помощью необходимых методов и создание объекта путем Factory. Особенно в вашем случае, когда вы просто используете кучу классов, это, на мой взгляд, лучший выбор.
Предположим, что нам нужно дезинфицировать html-код и найти библиотеку kickass, которая может сделать это для нас, но мы не хотим придерживаться этой библиотеки - может быть, кто-то будет использовать супер-ударный lib когда-нибудь мы хотели бы использовать.
Это может быть реализовано следующим образом (код в java)
Сначала определение интерфейса:
public interface HtmlSanitizer {
String sanitizeHtml(String html);
}
Затем мы создаем конкретную реализацию для нашего интерфейса, основанного на нашем дезинфицирующем банассе
public class MyKickassHtmlSanitizer implements HtmlSanitizer {
private com.foolib.kickass.html.Sanitizer delegate;
public MyKickassHtmlSanitizer() {
this.delegate= new com.foolib.kickass.html.Sanitizer();
}
public String sanitizeHtml(String html) {
return delegate.kickassSanitizeHtml(html);
}
}
Теперь Factory, который создает наш дезинфицирующее средство
public class HtmlSanitizerFactory {
private static final HtmlSanitizerFactory instance = new HtmlSanitizerFactory();
private HtmlSanitizerFactory() {}
public static HtmlSanitizerFactory get() { return instance;}
public HtmlSanitizer getSanitizer() {
return new MyKickassHtmlSanitizer();
}
}
Чтобы получить экземпляр, просто используйте:
HtmlSanitizerFactory.get().getSanitizer();
В то время как Factory может предоставлять статические методы или нет, может быть однотонный или нет. Вопрос вкуса и использования.
Теперь ваша зависимость от дезинфицирующего средства libs kickass сводится к одной точке, и для изменения реализации просто введите SuperKickassHtmlSanitizer и верните Factory.
Надеюсь, что поможет: -)