2015-12-12 105 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. 對您的傳輸層進行抽象,這將被業務層獨佔調用。它再次使事情更易於維護,可測試和可擴展。例如,您現在可以模擬傳輸層以返回預定義的響應。