【问题标题】:Passing a Object with all information vs passing specific information传递包含所有信息的对象与传递特定信息
【发布时间】:2014-06-08 18:21:59
【问题描述】:

我们将重点关注 5 个重要的类:Person、Car、House、Job 和 ISP。这是一个类的例子,这样我们你就可以对我想说的有一个直观的了解。语法会有点不对。

public class Person() {
    private Car car;
    private House house;
    private Job job;
    private ISP isp;

    public Person(Car car, House house, Job job, ISP isp) {
    this.car = car;
    this.house = house;
    ...
    }

    public Car getCar() {
        ...
    }
}

public class Car() {
    private Make make;
    private Model model;
    private Color color;
    ...
}

public class House() {
    ...
}

我决定创建一个静态类;此类将仅包含将接受参数并执行某种操作的静态方法。这里有 3 个例子,我想知道哪种方式是最好的方式。我非常想弄清楚什么时候应该通过包含所有必需信息的课程,什么时候应该只通过细节,并找出它们之间的优缺点。

public static boolean hasStableLife(Person person) { //This is a made up method and the logic may not make sense at all
    Car car = person.getCar();
    House house = house.getHouse();
    Job job = job.getJob();
    if(car.getValue() > 40000 && (house.getValue() > 300000 && house.hasNoLoans()) && job.isFullTime()) {
        return true;
    }
    return false;
}

public static boolean hasStableLife(Car car, House house, Job job) { //This is a made up method and the logic may not make sense at all
    if(car.getValue() > 40000 && (house.getValue() > 300000 && house.hasNoLoans()) && job.isFullTime()) {
        return true;
    }
    return false;
}

public static boolean hasStableLife(long carValue, long houseValue, boolean hasNoLoans, boolean isFullTime) { //This is a made up method and the logic may not make sense at all
    if(carValue > 40000 && (houseValue > 300000 && hasNoLoans) && isFullTime) {
        return true;
    }
    return false;
}

【问题讨论】:

    标签: java methods parameters


    【解决方案1】:

    我建议使用相关数据层次结构中最近的共同祖先。在hasStableLife 的情况下,我们试图标记,因此我们应该可以访问该人生活的所有方面。如果我们想知道hasNiceCar,那么我希望可以访问完整的Car 对象。另一方面,如果我们想评估一个特定的属性,那么只传递所需的数据点是有意义的,例如,isPastRetirement(int age)

    【讨论】:

      【解决方案2】:

      三个注意事项:

      1- 总是喜欢更少的参数(零参数甚至更大)。这将帮助您在将来维护您的代码。

      2- java 中的方法将发送原语的副本(例如 int、long、char、.. 等),但如果是对象,它将发送引用的副本。考虑到注释 1 和 2,我认为最好使用第一种方法。

      3- 您当然可以重用您的代码。例如,第一个方法可以通过传递自己的数据来调用第二个方法,如下所示: p

      public static boolean hasStableLife(Person person) {
          return this.hasStableLife(person.getCar(), person.getHouse(), person.getJob());
      }
      

      这可能非常有用,但这取决于您的要求。

      【讨论】:

      • 传递 Person 对象而不是最低要求是否会对性能或其他任何我应该担心的事情产生影响?
      • 不,不用担心。传递对象只会复制引用而不是整个对象。因此不会对内存和性能产生影响。它也会让你的生活更轻松。
      【解决方案3】:

      如果你只在你有一个人对象(拥有汽车和房子)时才调用这个方法,那么你应该使用第一个方法,除了你应该使它成为一个人类的非静态方法。

      如果您打算在没有人的情况下使用它(第一种方法不可能),那么我可能会将名称更改为更准确地描述该方法的功能,例如 isSufficientForStableLife(...)

      在后两者之间进行选择与前面的选择类似,您是否希望能够在没有汽车、房屋和工作对象的情况下调用该方法?

      请记住,您不需要只有其中一种方法,如果您需要最低级别的方法,它不偶尔拿物体但又想检查一个人是否有稳定的生活,您可以同时实现并互相调用,例如:

      public boolean hasStableLife() { 
         return isSufficientForStableLife(getCar(), getHouse(), getJob());
      }
      
      public static boolean isSufficientForStableLife(Car car, House house, Job job) {
          return isSufficientForStableLife(car.getValue(), house.getValue(), house.hasNoLoans(), job.isFullTime());
      }
      public static boolean isSufficientForStableLife(long carValue, long houseValue, boolean hasNoLoans, boolean isFullTime) { 
          return (carValue > 40000 && (houseValue > 300000 && hasNoLoans) && isFullTime);
      }
      

      【讨论】:

      • 这个方法被设计为只有当你有一个 Person 对象时才被调用,但我一直在想是否有必要传递整个对象而不是只传递所需的数据。
      • 我第二次亚历克斯使方法非静态,因为这些方法只会被实例化的对象调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多