Java OOP风格的命令-代码段

Java OOP风格的命令-代码段,java,oop,object,styles,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

使此代码段更面向对象的最佳方法是什么

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

如果您的代码不需要更复杂,那么您不应该更改任何内容

但是如果你写一个原则的例子,我认为这是一个很好的例子,可以使用一些“工厂/委托”模式。原则是为所有案例创建一个带有子类的类。然后您注册每个案例,并使用一个方法来选择要在响应中使用的好类。使用这种方法,您不必使用对纯粹主义者来说“不太面向对象”的开关/案例

您的代码可能具有以下原则(请注意,它只是一个用于说明该原则的代码):

抽象类作业{
作业的公共抽象字符串(输入字符串);
}
类FailJob扩展了作业{
作业的公共字符串(输入字符串){
返回“错误”;
}
}
类OKJob扩展了Job{
作业的公共字符串(输入字符串){
返回String.format(“%s%s”,输入,输入);
}
}
类NullJob扩展了作业{
作业的公共字符串(输入字符串){
返回null;
}
}
类格式化程序{
私人服务;
私人地图工作;
公共格式化程序(服务){
服务=服务;
//开始工作
jobs=newhashmap();
jobs.put(“FAIL”,new FailJob());
jobs.put(“OK”,new-OKJob());
}
作业的公共字符串(输入字符串){
字符串响应=service.askForPermission();
Job Job=获取作业(响应);
返回job.doTheJob(输入);
}
私有作业获取作业(字符串响应){
Job=jobs.get(响应);
如果(作业==null){
job=新的NullJob();
}
返回工作;
}
}

但是,再一次,如果你的代码是你所要做的全部,坚持使用它,那就简单多了。

你的问题不是典型的StackOverflow答案,因为它需要一个“意见”。考虑在<强>代码审查< /强>上发布更好的答案。

尽管如此,我还是建议进行这些更改

  • 对于缺少的权限,不要使用返回类型,而是使用异常处理它们。这将使您的代码更短,更关注功能,而不是权限等技术方面
  • 使用超类
    Object
    作为参数。
    这将使您的API更加方便-无需额外成本,因为
    String.format
    execpts对象作为参数
  • 最后也是最不重要的:使用有意义的名称<代码>服务并没有告诉每个人这个课程的目的。考虑将其重构为
    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);
        }
    }
    

    面向对象是一种技术,而不是goal@reaanb这完全可能是一个目标。“如何将面向对象应用于此代码”不是一个奇怪的问题。然而,这个问题对于StackOverflow来说太广泛了。为什么需要更改代码?它看起来很简单,当然不需要“更面向对象”。@VinceEmigh如果它的目的未知,它不应该成为一个目标。看看实际的代码,这个问题对我来说没有多大意义。它相当原子化。我看不出面向对象建模的主题是如何与这么短、简单的一段代码联系在一起的。更不清楚的是为什么。@Vince与“使此代码更程序化的最佳方法是什么?”相比,为什么会有人想这样做?太多人相信OOP就是一切好东西。现在,如果有必要,例如在不同的格式化程序上进行抽象,我很乐意应用OOP技术。