2009-09-17 7 views
2

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

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

ответ

3

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

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

+0

Можете ли вы подробнее рассказать о Mapper? Вы имеете в виду классы конвертеров? – smack0007

+0

Mapper - это в основном то, что преобразует типы X в типы Y. Таким образом, в вашем сценарии, который будет преобразовывать между вашим собственным Vector2 и XNAs Vector2. –

+0

Да ... Что-то, что отображает XNA Data в вашу структуру и обратно. –

0

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

Предположим, что нам нужно дезинфицировать html-код и найти библиотеку kickass, которая может сделать это для нас, но мы не хотим придерживаться этой библиотеки - возможно, кто-то расскажет о супер-kickass lib когда-нибудь мы хотели бы использовать.

Это может быть реализовано следующим образом (код в Java)

Первое определение интерфейса:

public interface HtmlSanitizer { 
     String sanitizeHtml(String html); 
} 

Затем мы создаем конкретную реализацию для нашего интерфейса, основанного на нашей KickAss дезинфицирующее

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); 
    } 
} 

Теперь фабрика, которая создает наш дезинфицирующее средство

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(); 

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

Теперь ваша зависимость от дезинфицирующего средства от libs kickass сводится к одной точке, и для изменения реализации просто введите SuperKickassHtmlSanitizer и позвольте фабрике вернуть его.

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