2015-12-12 38 views
0

我重构了checkLogin(),它生活在LoginActivity类中,但我仍然认为它可以被重构得更好。试图更好地重构

private void checkLogin(final String email, final String password) { 
    // Tag used to cancel the request 
    String tag_string_req = "req_login"; 

    pDialog.setMessage("Logging in ..."); 
    showDialog(); 

    LoginRequest loginRequest = new LoginRequest(Request.Method.POST, AppConfig.getUrlLogin(), ReqSuccessListener(), ReqErrorListener()) { 

     protected Map<String, String> getParams() { 
      // Posting parameters to login url 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("email", email); 
      params.put("password", password); 
      return params; 
     } 
    }; 
    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(loginRequest, tag_string_req); 
} 

ReqSuccessListener()ReqErrorListener()的实施也住在LoginActivity类。看起来像这样:

private Response.Listener<String> ReqSuccessListener() { 
    return new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d(TAG, "Login Response: " + response.toString()); 
      hideDialog(); 
      try { 
       session.setLogin(true); 
       JSONObject jObj = new JSONObject(response); 
       JSONObject user = jObj.getJSONObject("user"); 
       String uid = user.getString("id"); 
       String name = user.getString("name"); 
       String email = user.getString("email"); 

       // Inserting row in users table 
       db.addUser(name, email, uid); 

       // Launch main activity 
       Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
       startActivity(intent); 
       finish(); 
      } catch (JSONException e) { 
       // JSON error 
       Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
} 

private Response.ErrorListener ReqErrorListener() { 
    return new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      int statusCode = error.networkResponse.statusCode; 
      NetworkResponse response = error.networkResponse; 
      Log.d("testerror", "" + statusCode + " " + new String(response.data)); 
      if (statusCode != 200) { 
       Toast.makeText(getApplicationContext(), new String(response.data), Toast.LENGTH_LONG).show(); 
       hideDialog(); 
      } 
     } 
    }; 
} 

我的问题很简单,我该如何重构这更好?或者我已经重构了足够好的?

另外这里是我的链接,向您展示代码在重构前后的外观。这里是链接,如果你想看到它:https://github.com/superzaky/Kenzup/compare/3b30426bc02873607806525d62d2744921481cd5...command-loginrequest

因此,左侧是重构前的代码,右侧是重构后的代码。

+0

“更好”是什么意思?这似乎是一个相当主观的问题。 – Brucelet

+0

好了,在'LoginRequest'或其他地方放置'ReqSuccessListener()'和'ReqErrorListener()'的实现。 – superkytoz

回答

2

伟大的工作,你几乎在那里。但是你的代码可以是'更清洁的'

'干净的代码'并不是主观的,它可以很容易地定义。以下这些都会使你的代码服务 -

  • SOLID
  • Testablity。
  • 可读性。
  • 构造(凝聚力)。

可读性非常重要,但也是一个非常广泛的主题,因此我不会讨论它,而是鼓励你阅读它。诸如fluent API之类的东西使得代码更易于理解和维护。我推荐鲍勃叔叔的书Clean code

有几件事情我学到了作为一个Android开发者 -

由(可能是缺少的)设计做各种各样与已经有太多的事情Android的Activity类,遗憾的是没有逃避,我们必须从它继承。但这并不意味着应该增加更多的责任,并使代码更加严格。

不要被Android的开发网站和许多博客和网站愚弄。当他们提出解决方案时,他们不会为了分离问题而烦恼。当然,他们只是想要揭示技术问题,而不是一个“干净的”解决方案(这有点可以理解)。

有了编写可测试代码的心态,不一定写测试会让你的设计更好。我个人认为测试是必须的,但我能理解为什么很多Android开发人员不写它们。缺乏一个好的和快速的测试框架是一个长期的Android框架,使得最好的实践非常不便。但是这不应该阻止任何人编写可测试的代码!可测试的代码是一个更好的代码

在你的代码 -

  1. 有你希望你的Activity类做一个明确的定义。 一个自然的事物将是一个控制器或演示者。一旦你这样做,有 它这样做,没有别的。努力使其非常薄。
  2. 在业务规则上有抽象层。在执行请求之前很可能会执行一些规则。也许在登录时没有那么多,但作为一个经验法则,它使事情更易于维护,可测试和可扩展。例如,您现在可以“模拟”登录过程以测试UI。
  3. 对您的传输层进行抽象,这将被业务层独占调用。它再次使事情更易于维护,可测试和可扩展。例如,您现在可以模拟传输层以返回预定义的响应。