OOP风格势在必行 - 片段

时间:2015-07-07 20:43:52

标签: java oop object styles

使这个代码段更加面向对象的最佳方法是什么?

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;
        }
    }
}

2 个答案:

答案 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,因为它要求“意见”。考虑将其发布在代码审核上以获得更好的答案。

尽管如此:我会建议这些改变。

  1. 请勿使用返回类型来删除权限,但请使用例外处理它们。这将使您的代码更短,更专注于功能,而不是权限等技术方面。
  2. 使用超类Object作为参数。这将使您的API更加便捷 - 无需额外费用,因为String.format无论如何都会将对象作为参数执行。
  3. 最后和最少:使用有意义的名称Service并没有告诉所有人,这个课程的目的是什么。考虑将其重构为PermissionChecker,或者甚至更具体。这将有助于其他人理解您的代码并找到相关的代码段落。
  4. 生成的代码可能如下所示:

    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);
        }
    }