使这个代码段更加面向对象的最佳方法是什么?
public class Formatter {
private Service service;
public Formatter(Service service) {
this.service = service;
}
public String doTheJob(String theInput) {
String response = service.askForPermission();
switch (response) {
case "FAIL":
return "error";
case "OK":
return String.format("%s%s", theInput, theInput);
default:
return null;
}
}
}
答案 0 :(得分:0)
如果您的代码不需要更复杂,那么您就不应该做任何改变。
但如果你写一个原则的例子,我认为这是一个很好的例子,在哪里使用一些"工厂/代表团"图案。原则是为所有案例创建一个包含子类的类。然后,您注册每个案例并使用一种方法来选择与您的响应一起使用的好类。使用这种方法,你不必使用一个开关/盒子,它不是非常面向对象的。纯粹主义者。
您的代码可能具有以下原则(请注意它只是一个代码来说明原理):
abstract class Job {
public abstract String doTheJob(String theInput);
}
class FailJob extends Job {
public String doTheJob(String theInput) {
return "error";
}
}
class OKJob extends Job {
public String doTheJob(String theInput) {
return String.format("%s%s", theInput, theInput);
}
}
class NullJob extends Job {
public String doTheJob(String theInput) {
return null;
}
}
class Formatter {
private Service service;
private Map<String, Job> jobs;
public Formatter(Service service) {
this.service = service;
// init the jobs
jobs = new HashMap<String, Job>();
jobs.put("FAIL", new FailJob());
jobs.put("OK", new OKJob());
}
public String doTheJob(String theInput) {
String response = service.askForPermission();
Job job = getTheJob(response);
return job.doTheJob(theInput);
}
private Job getTheJob(String response) {
Job job = jobs.get(response);
if(job == null) {
job = new NullJob();
}
return job;
}
}
但是,再一次,如果您的代码是您必须做的全部,坚持下去,它会更简单。
答案 1 :(得分:0)
您的问题不是典型的StackOverflow-Answer,因为它要求“意见”。考虑将其发布在代码审核上以获得更好的答案。
尽管如此:我会建议这些改变。
Object
作为参数。这将使您的API更加便捷 - 无需额外费用,因为String.format
无论如何都会将对象作为参数执行。Service
并没有告诉所有人,这个课程的目的是什么。考虑将其重构为PermissionChecker
,或者甚至更具体。这将有助于其他人理解您的代码并找到相关的代码段落。生成的代码可能如下所示:
public class Formatter {
private PermissionChecker permissionChecker;
public Formatter(PermissionChecker permissionChecker) {
this.permissionChecker = permissionChecker;
}
public String doTheJob(Object theInput) {
// check permission, fail with exception, if something goes wrong
permissionChecker.assertFormattingPermission();
return String.format("%s%s", theInput, theInput);
}
}