Java 尝试更好地重构

Java 尝试更好地重构,java,android,design-patterns,refactoring,android-volley,Java,Android,Design Patterns,Refactoring,Android Volley,我已经重构了LoginActivity类中的checkLogin(),但我仍然认为它可以重构得更好 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 ..."); showD

我已经重构了
LoginActivity
类中的
checkLogin()
,但我仍然认为它可以重构得更好

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);
}
我的问题很简单,我怎样才能更好地重构它?还是我已经把它重构得足够好了

这里还有我的链接,向您展示代码在重构前后的外观。如果您想查看,请访问以下链接:


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

干得好,你就快到了。但您的代码可以“更干净”

“干净的代码”完全不是主观的,它可以很容易地定义。遵循这些将使您的代码闪闪发光-

  • 可测试性
  • 可读性
  • 结构(衔接)
可读性非常重要,但也是一个非常广泛的主题,因此我将不讨论它,而是鼓励您阅读它。这样做可以使代码更易于理解和维护。我推荐鲍勃叔叔的书

作为一名Android开发者,我学到了一些东西-

Android的Activity class by(可能缺乏)设计已经做了各种各样的事情,而且已经做了太多的事情,不幸的是,我们无法从中逃脱。但这并不意味着我们应该增加更多的责任,使代码更加严格

不要被Android的开发网站和许多博客和网站所愚弄。当他们制定解决方案时,他们不会因为关注点的分离而烦恼。当然,他们只是想暴露技术细节,而不是一个“干净”的解决方案(这在某种程度上是可以理解的)

拥有编写可测试代码的心态,而不一定要编写测试,这将使您的设计变得更好。就我个人而言,我认为测试是必须的,但我能理解为什么许多Android开发人员不编写测试。由于缺乏一个好的、快速的测试框架(一个长边的Android框架),因此使用最佳实践非常不便。但这不应该阻止任何人编写可测试代码!可测试代码是一种更好的代码

在您的代码中-

  • 明确定义您希望活动类做什么。 一个自然的东西将是一个控制器或演示者。一旦你这样做了,就要 它就是这样做的,别的什么都没有。努力使它非常薄
  • 在业务规则上有一个抽象层。在执行请求之前,很可能会强制执行某些规则。也许在登录中并没有这么多,但作为经验法则,它使事情更加可维护、可测试和可扩展。例如,您现在可以“模拟”登录过程来测试UI
  • 在传输层上有一个抽象,它将由业务层专门调用。同样,它使事物更易于维护、测试和扩展。例如,现在可以模拟传输层以返回预定义的响应

  • “更好”是什么意思?这似乎是一个相当主观的问题。我们将
    ReqSuccessListener()
    ReqErrorListener()
    的实现放在
    LoginRequest
    或其他地方。
    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();
                }
            }
        };
    }