2012-05-18 4 views
2

Я работаю над веб-приложением, основанным на весеннем MVC. У нас есть различные экраны для добавления разных компонентов домена (например, данные учетной записи, сведения о сотрудниках и т. Д.). Мне нужно реализовать функцию загрузки для каждого из этих компонентов домена, то есть загружать учетную запись, загружать сведения о сотрудниках и т. Д., Которые будут представлены в файле csv (открыть файл, проанализировать его содержимое, проверить и затем сохранить).Лучший дизайн для реализации функции загрузки

Мой вопрос заключается в том, какой шаблон проектирования должен я рассмотреть, чтобы реализовать такое требование, чтобы загрузка (открыть файл, проанализировать его содержимое, проверить и затем сохранить) становится универсальной. Я думал об использовании шаблона шаблона. Template Pattern

Любые предложения, указатели, ссылки будут высоко оценены.

+0

Когда вы говорите, «загрузить» вы имеете в виду открытие файла CSV, анализ содержимого и сохраняющиеся результирующие записи? – Brady

+0

Да, вы правы @Brady – shashikanthb

+0

Как вы думаете об использовании шаблона шаблона? Кроме того, всегда будет csv? И будет ли несколько типов сопротивления: DB, NW и т. Д.? – Brady

ответ

0

A strategy pattern my быть полезным здесь для пользователя. Класс Uploader будет своего рода классом container/manager, который просто будет содержать атрибут синтаксического анализа и атрибут persistance. Оба эти атрибута будут определены как абстрактный базовый класс и будут иметь множество реализаций. Несмотря на то, что вы говорите, что это всегда будет csv и oracle, этот подход будет надежным для будущего, а также будет разделять синтаксический анализ/проверку из кода сохранения.

Вот пример:

class Uploader 
{ 
private: 
    Parser parser_; 
    Persistence persistence_; 

    void upload() { 
     parser_.read(); 
     parser_.parse(); 
     parser_.validate(); 
     persistence_.persist(parser_.getData()); 
    } 

public: 
    void setParser(Parser parser) {parser_ = parser;} 
    void setPersister(Persistence persistence) {persistence_ = persistence;} 
}; 

Class Parser 
{ 
    abstract void read(); 
    abstract void parse(); 
    abstract void validate(); 
    abstract String getData(); 
}; 

class Persistence 
{ 
    abstract persist(String data); 
}; 

class CsvParser : public Parser 
{ 
    // implement everything here 
}; 

// more Parser implementations as needed 

class DbPersistence : public Persistence 
{ 
    // implement everything here 
}; 

class NwPersistence : public Persistence 
{ 
    // implement everything here 
}; 

// more Persistence implementations as needed 
+0

Спасибо за пример .. – shashikanthb

4

Я не собираюсь отвечать на ваш вопрос. Тем не менее, позвольте мне ответить на ваш вопрос! ;-)

Я думаю, что шаблоны проектирования не должны вызывать беспокойства на этом этапе развития. Несмотря на их величие (и я использую их все время), они не должны быть вашей главной заботой.

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

Иногда я считаю, что люди склонны перестраиваться и над планом. Я в хорошей компании: http://www.joelonsoftware.com/items/2009/09/23.html. Очевидно, я не защищаю никакое программное обеспечение для проектирования, которое никогда не работает хорошо. Тем не менее, ища сходства после того, как некоторые вещи были реализованы, и рефакторинг их может достичь лучших результатов (вы уже читали http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?ie=UTF8&qid=1337348138&sr=8-1? Он старый, но отличный!).

+0

, спасибо, я пройду через ссылки @rlinden – shashikanthb

0

Вы можете использовать шаблон абстрактной фабрики.

Есть интерфейс загрузки, а затем реализовать его для каждого из объектов предметной области и построить его на заводе на основе класса проходил в.

Э.Г.

Uploader uploader = UploadFactory.getInstance (Employee.class);

Смежные вопросы