试图更好地重构

时间:2015-12-12 17:31:53

标签: java android design-patterns refactoring android-volley

我已经重构了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

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

1 个答案:

答案 0 :(得分:2)

干得好,你快到了。但是你的代码可以“更清洁”

'清洁代码'根本不是主观的,可以很容易地定义。以下将使您的代码闪耀 -

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

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

我学到的一些东西是Android开发人员 -

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

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

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

在您的代码中

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