Абстрагирование от API

2

Я писал фреймворк для себя в С#, а мой фреймворк работает поверх рамок Xna. В коде приложения, который использует эту структуру, мне часто приходится включать ссылки на мои рамки и инфраструктуру Xna. В большинстве случаев эти ссылки Xna включают только такие структурные классы, как Vector2 и Rectangle. Из-за этого я стараюсь, чтобы имя моих классов не противоречило названиям классов Xna. Это может стать утомительным и даже запутать меня, когда у меня есть классы, где я придумал подобное имя, но не то же самое, что и Xna. (т.е. GamePadDevice и GamePad)

У меня была идея в последнее время, но я не знаю, стоит ли это. Я использую только несколько, 5 или 6 структур во всей структуре. Стоит ли абстрагировать эти структуры, чтобы мой код приложения должен был иметь дело только с моей картой? Я мог бы сделать это, написав собственные версии структур или наследовав их, или кто-то может предложить лучший способ. Накладные расходы упрощают мой код приложения?

Теги:
xna

2 ответа

3
Лучший ответ

Я не знаю, как глубоко ваша инфраструктура продолжает заменять слой XNA, но если пользователь больше не имеет контакта с XNA и "просто" использует вашу фреймворк, тогда было бы лучше, если ваша фреймворк раскрывает только свои собственные структуры для клиента. В конце концов, вы можете отказаться от XNA в один прекрасный день и поддерживать XNB или XNC?

Если вы пишете mapper в своей структуре, который переводится, вы будете иметь возможность сделать это позже

  • 0
    Можете ли вы подробнее рассказать о Mapper? Вы имеете в виду классы конвертеров?
  • 0
    Mapper - это, по сути, нечто, что преобразует типы X в типы Y. Так что в вашем сценарии это будет преобразование, например, между вашим собственным Vector2 и XNAs Vector2.
Показать ещё 1 комментарий
0

Хорошим способом абстрагироваться от сторонних библиотек является внедрение интерфейсов с помощью необходимых методов и создание объекта путем 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.

Надеюсь, что поможет: -)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню