title: What is the best way to refactor switch statements that use variables
body: <p>Heyy</p>
  <p>I have a code that definitely should be refactored. It was written for login  with username and password purpose but then added other login methods as a classic development story.</p>
  <p>It is obvious that I should use interface. However login methods do different things and all uses variables and functions from controller class in MVC architecture. That's why if I separate them, it will be really hard for me to make it work again.</p>
  <p>It is a basic scheme that looks like my problem</p>
  <pre><code>public class LoginController
  {
      public string username { get; set; }
      public Certificate serverCertificate { get; set; }
      public Version serverVersion { get; set; }
      public bool serverCertValid { get; set; }
  
      public LoginTypes loginType;
  
      void Login()
      {
          checkX();
          checkY();
          checkZ();
      }
  
      private void checkX()
      {
          switch (loginType)
          {
              case LoginTypes.DEFAULT:
                  username = Console.ReadLine();
                  break;
              case LoginTypes.CARD:
                  username = readFromCard();
                  serverCertificate = checkDeviceCertificate();
                  break;
              case LoginTypes.API:
                  username = getUsernameRequest();
                  serverVersion = readServerVersionFromX();
                  break;
              default:
                  break;
          }
      }
  
      private void checkY()
      {
          switch (loginType)
          {
              case LoginTypes.DEFAULT:
                  //
                  break;
              case LoginTypes.CARD:
                  serverCertValid = checkIfValidate(serverCertificate);
                  break;
              case LoginTypes.API:
                  //
                  break;
              default:
                  break;
          }
      }
  }
  
  public enum LoginTypes
  {
      DEFAULT,
      CARD,
      API
  }
  </code></pre>
  <p>So basically,</p>
  <p>I have code that is not written suitable for OOP systems. And functions are too complicated.
  I have different login types that uses functions and variables in controller class.
  So even if I want to make a class that implements interface for each login type. I have to pass lots of variables with them.</p>