Рефакторинг предложений? - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно несколько советов о том, как изменить код ниже. У меня есть несколько классов конфигураций, все они разные, но, как вы можете видеть в приведенном ниже примере кода, происходит повторяющийся паттерн.

Мне было интересно, как лучше всего упростить код View?

    class IConfiguration1
   {
      public:

       virtual bool Save(const std::string& Output) = 0;        
       virtual bool OutText(const std::string& BaseFileName) = 0;    
       virtual bool Open() = 0;
   }

    class IConfiguration2
   {
       public:

        virtual bool Save(const std::string& Output) = 0;       
        virtual bool OutText(const std::string& BaseFileName) = 0;    
        virtual bool Update() = 0;
    }

    class MockConfiguration
    {
       MOCK_METHOD1(Save,bool(const std::string& Output));
       MOCK_METHOD1(OutText, bool(const std::string& BaseFileName));
    }   

    void View::SaveConfiguration1(std::string path)
    {
        m_Configuration1->Save(path);
        m_Configuration1->OutText(wxFileName::StripExtension(path).ToStdString())
        //Enable Reset Menu 
        wxMenuItem* item2 = GetMenuBar()->FindItem(wxID_RESET);
        if (item2 != NULL) item2->Enable(true);
    }

    void View::SaveConfiguration2(std::string path)
    {       
        m_Configuration2->Save(path);                                             
        m_Configuration2->OutText(wxFileName::StripExtension(path).ToStdString());

        //Enable Reset Menu 
        wxMenuItem* item2 = GetMenuBar()->FindItem(wxID_RESET);
        if (item2 != NULL) item2->Enable(true);
    }

    void View::SaveConfiguration3(std::string path)
    {
        m_Configuration3->Save(path);
        m_Configuration3->OutText(wxFileName::StripExtension(path).ToStdString());

        //Enable Reset Menu 
        wxMenuItem* item2 = GetMenuBar()->FindItem(wxID_RESET);
        if (item2 != NULL) item2->Enable(true);
    }

Это функция, которая вызывает Сохранить

void Controller::SaveCurrentSettings()
{
    switch (m_View->GetSelectedConfiguration())
    {
        case Options::Configuration1:
        {
            SaveConfiguration1();
        }
        break;

        case Options::Configuration2:
        {
            SaveConfiguration2();
        }
        break;

        case Options::Configuration3:
        {
            SaveConfiguration3();
        }
        break;
    }
}

1 Ответ

0 голосов
/ 26 июня 2018

Создайте (абстрактный) интерфейс, общий для всех конфигураций. Для показанного кода это будет включать Save и OutText, но не Open или Update.

Вывести конфигурации из этого интерфейса

Замените SaveConfiguration1, SaveConfiguration2 на единственную функцию SaveConfiguration, у которой есть дополнительный параметр, позволяющий выбрать правильную конфигурацию для сохранения. Как комментирует Jarod42, этим параметром может быть сама конфигурация (переданная как ссылка на новый общий интерфейс, о котором я упоминал). В противном случае параметром может быть перечисление, которое используется для выбора конфигурации в методе SaveConfiguration.

В любом случае, когда вы достигнете повторяющихся строк Save и OutText, вы будете вызывать их, используя через новый интерфейс и полагаясь на возможности виртуальных функций, чтобы справиться с тем фактом, что различные конфигурации не идентичны, вызывая конкретные версии Save and OutText для вас.

... Редактировать после комментария "У меня уже есть перечисление на 1 уровень выше"

Так что вместо: -

   case Options::Configuration1:
    {
        // your example call doesn't pass a view, but your SaveConfiguration requires one
        SaveConfiguration1(/* view? */);
    }

Вы могли бы иметь

   case Options::Configuration1:
    {
        // your example call doesn't pass a view, but your SaveConfiguration requires one
        SaveConfiguration(/* view? */ , m_Configuration1);
    }

Где SaveConfiguration принимает IConfiguration &

void View::SaveConfiguration(std::string path, IConfiguration& config)           
{
    config.Save(path);
    config.OutText(wxFileName::StripExtension(path).ToStdString())
    //Enable Reset Menu 
    wxMenuItem* item2 = GetMenuBar()->FindItem(wxID_RESET);
    if (item2 != NULL) item2->Enable(true);
}



 class IConfiguration
 {
     public:

      virtual bool Save(const std::string& Output) = 0;        
      virtual bool OutText(const std::string& BaseFileName) = 0;    
      // no output or update
 }

Вам также необходимо выбрать между перемещением коммутатора в представление, которому принадлежат конфигурации, или предоставлением конфигураций контроллеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...