gpt4 book ai didi

java - 尝试重构得更好

转载 作者:行者123 更新时间:2023-12-02 04:06:17 26 4
gpt4 key购买 nike

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

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

最佳答案

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

“干净的代码”根本不是主观的,它可以很容易地定义。遵循这些将使您的代码大放异彩 -

  • SOLID
  • 可测试性。
  • 可读性。
  • 结构化(凝聚力)。

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

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

Android 的 Activity 类(可能缺乏)设计已经完成了各种各样的、太多的事情,不幸的是我们没有任何逃逸的方法必须继承它。但这并不意味着应该为其添加更多职责并使代码更加严格。

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

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

在您的代码中 -

  1. 对您希望 Activity 类执行的操作有一个清晰的定义。很自然的事情就是 Controller 或演示者。一旦你这样做了,就拥有它只做这个,而不做其他事。力求做到非常薄。
  2. 在您的业务规则之上有一个抽象层。在执行请求之前很可能会强制执行某些规则。也许在登录方面没有那么重要,但根据经验,它使事情变得更可维护、可测试和可扩展。例如,您现在可以“模拟”登录过程来测试 UI。
  3. 对传输层进行抽象,该抽象将由业务层专门调用。它再次使事情变得更加可维护、可测试和可扩展。例如,您现在可以模拟传输层以返回预定义的响应。

关于java - 尝试重构得更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34242873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com