编码风格和组织

时间:2016-07-22 11:16:17

标签: java class design-patterns methods code-organization

因此,我正在为夏季项目制作飞机预订系统以保持Java的新鲜感。对于任何预订系统,它需要很多类和方法。目前我正在努力进口船队。

我的主要方法就像我的程序的时间顺序指南。

public static void main(String[] args){
    //start here 
    //accept passenger credentials 
    //place passenger in seat on plane
}

我的问题是格式化问题。当我想开始为我的舰队“制造”我的飞机时。它有点像这样。

//...
Airplane Boeing737 = new Airplane(seats[], nameOfAircraft);

这将放置构建我的飞机所需的所有值,显然飞机构造函数有更多变量。

我的想法是在Airplane课程中为我做一个方法。但为了做到这一点,我需要为另一个类(使用我的main方法的那个)调用一个空白构造函数来查看它。由于某种原因,我觉得这是一种可怕的形式。有一个更好的方法吗?

我发布的另一个想法是修改构造函数,使其不接受任何参数,并在那里做所有事情。我觉得这就是我应该做的事情,但我不是百分百肯定这将是正确的选择。我想我的整体问题是在这种情况下最佳做法是什么。

2 个答案:

答案 0 :(得分:4)

使用构建器模式,这将允许您:

  • 建立活动的动态方式
  • 可维护代码(您可以在需要时添加更多参数)
  • 在创建时保留对象的完整性

Joshua Bloch在Effective Java第1章第2项中指出:

  

幸运的是,第三种替代方案结合了伸缩式的安全性   具有JavaBeans模式可读性的构造函数模式。它是一种形式   生成器模式。而不是直接制作所需的对象,   客户端使用所有必需参数调用构造函数(或静态工厂)并获取构建器对象。

修改他的例子:

//Builder Pattern
public class Airplane  {
    private final int[] seats;
    private final String name;
    private final int maxSpeed;
    private final int maxPassengers;

    public static class Builder {
        // Required parameters
        private final int[] seats;
        private final String name;

        // Optional parameters - initialized to default values
        private int maxSpeed = 1000;
        private int maxPassengers = 150;

        public Builder(int[] seats, String name) {
            this.seats = seats;
            this.name = name;
        }

        public Builder maxSpeed(int val) {
            maxSpeed = val;
            return this;
        }

        public Builder maxPassengers(int val) {
            maxPassengers = val;
            return this;
        }

        public Airplane build() {
            return new Airplane(this);
        }
    }

    private Airplane(Builder builder) {
        seats = builder.seats;
        name = builder.name;
        maxSpeed = builder.maxSpeed;
        maxPassengers = builder.maxPassengers;
    }
}

然后你可以创建几种不同的飞机

public static void main(String[] args) {
    // only mandatory params
    Airplane boeing747  = new Airplane.Builder(new int[] {1,0,1}, "boeing747").build();
    // just one param
    Airplane boeing646  = new Airplane.Builder(new int[] {1,1,1}, "boeing646").maxPassengers(250).build();
    // all params
    Airplane fighter    = new Airplane.Builder(new int[] {1,0,0}, "fighter_1").maxPassengers(3).maxSpeed(1600).build();
}

答案 1 :(得分:2)

暂时忘掉主要方法,你不知道它是否是一个命令行程序,带有UI,web服务的桌面应用程序或者是什么。您不知道它是独立的还是托管在某个框架或应用程序服务器中。

我建议从单元测试开始,用TDD驱动域模型/业务逻辑的设计。

你不想看到像Boeing737这样硬编码的东西。它将从其他来源获得其输入,例如输入,xml文件,现有数据库,其他一些系统。

然后,您将动态创建Airplane实例。您将从UI或DB或XML解析器传递类似DTO的东西到构造函数。还有其他方法,例如查找工厂模式,但他们往往会过度使用恕我直言。

你似乎是以一种与现实世界中任何人都无法匹敌的方式开始的。很难给出更好的建议。