2013-06-13 2 views
0

을 반복 코드 :리팩터링 나는이 클래스를 가지고

#include <string> 
#include <vector> 

class QueryStatistics 
{ 
    private: 
     std::vector < std::pair <std::string,int >> queries_title; 
     std::vector < std::pair <std::string,int >> queries_author; 
     std::vector < std::pair <std::string,int >> queries_phrase; 
     std::vector < std::pair <int,int >>  queries_id; 

    public: 
     QueryStatistics(); 
     virtual ~QueryStatistics(); 

     void increase_freq_title (std::string & title); 
     void increase_freq_author (std::string & author); 
     void increase_freq_phrase (std::string & phrase); 
     void increase_freq_id  (int id_doc); 
}; 

그리고 코드 reapeats 자체가 4 번이 비트,하지만 다른 벡터마다.

void QueryStatistics::increase_freq_title (std::string & title) 
{ 
    for (unsigned int i=0; i < queries_title.size(); i++) 
    { 
     if (queries_title[i].first == title) 
     { 
      queries_title[i].second += 1; 
      return; 
     } 
    } 
} 

동일한 코드를 네 번 반복하지 않으려면 어떻게 리팩터링 할 수 있습니까?

+0

왜 하나 개의 함수를 작성하지 않고 벡터를 취 매개 변수를 추가하지 마십시오? – OGH

+0

'increase_freq (std :: vector > & v, T const & k) 템플릿''템플릿을 사용하면 샘플 코드와 같이'v'에서 동작하는 본문은'queries_title'에서 처리됩니다. 나는 그것을 자유로운 기능으로 만들 것이다. – Yakk

답변

1

자신의 템플릿을 만드는 것이 옵션이라면 이렇게 할 수있을 것이라고 생각합니다.

template<typename T, typename U> 
void QueryStatistics::increase_freq (T title, std::vector<U>& vec) 
{ 
    for (unsigned int i=0; i < vec.size(); i++) 
    { 
     if (vec[i].first == title) 
     { 
      vec[i].second += 1; 
      return; 
     } 
    } 
} 

벡터가 비공개이므로 같은 코드를 반복하는 대신 4 개의 공용 멤버 함수가 위의 함수를 호출 할 수 있습니다.

0

사실, 단순한 복잡한 템플릿 매개 변수가 필요,

#include <string> 
    #include <vector> 

    class QueryStatistics 
    { 
     private: 
      std::vector < std::pair <std::string,int > > queries_title; 
      std::vector < std::pair <std::string,int > > queries_author; 
      std::vector < std::pair <std::string,int > > queries_phrase; 
      std::vector < std::pair <int,int > >  queries_id; 

     public: 

      template<typename T, typename U> 
      void increase(T& query, U const& para) 
      { 
       for (unsigned int i=0; i < query.size(); i++) 
       { 
        if (query[i].first == para) 
        { 
         query[i].second += 1; 
         return; 
        } 
      } 


      } 

      void increase_freq_title (std::string & title) 
      { 
       increase(queries_title,title); 

      } 
      void increase_freq_author (std::string & author) 
      { 
        increase(queries_author,author); 
      } 
      void increase_freq_phrase (std::string & phrase) 
      { 
       increase(queries_phrase,phrase); 
      } 
      void increase_freq_id  (int id_doc) 
      { 
       increase(queries_id,id_doc); 
      } 
    };