OOP设计问题

时间:2015-03-27 03:13:17

标签: java oop

我认为这是一个小问题,甚至可能是主观的,但它真的让我感到烦恼。每当我创建一些由大量网格组成的东西(主要是游戏)。我倾向于为细胞和网格提供相同的吸气剂。为了清楚地解释,这里是代码示例:

class Cell{
    private int value1;
    private boolean value2;

    public Cell(int value1, boolean value2){
        this.value1 = value1;
        this.value2 = value2;
    }

    public int getValue1(){
        return value1;
    }

    public boolean getValue2{
        return value2;
    }
}

这是我的网格课程:

class Grid{
    private Cell[][] cells;

    public Grid(int rows, int cols){
        cells = new Cell[rows][cols];
        // initialize
    }

    public int getCellValue1(int row, int col){
        return cells[row][col].getValue1();
    }

    public boolean getCellValue2(int row, int col){
        return cells[row][col].getValue2();
    }

    // setters, same idea
}

我不知道。我可能过度思考问题,这可能是一个愚蠢的问题,但是,有没有更好的方法呢?也许它只是我,但我觉得它有点笨重,还有很多额外的代码。这个设计好吗?

3 个答案:

答案 0 :(得分:5)

我会将Edwin的Grid类更改为这样的界面:

public interface Grid {
    public void setValue(String value, int row, int column);
    public String getValue(int row, int column);
}

CellGrid类使用Grid s的二维数组实现Cell

class CellGrid implements Grid {
    private Cell[][] cells;

    public CellGrid(int rows, int cols){
        cells = new Cell[rows][cols];
        // initialize
    }

    // get a value using the implementation we chose
    public String getValue(int row, int col) {
        return cells[row][col].getValue();
    }
}

您的Cell课程基本保持不变,只是我将value1的类型从int更改为String

class Cell {
    private String value;
    // other fields can go here

    public Cell(String value, ...){
        this.value = value;
        // ...
    }

    public String getValue(){
        return value;
    }
}

您可以使用以下代码访问单元格的特定属性:

grid.getValue(2, 2)

当您拨打此电话时,您不需要了解Grid的实施情况。正如我在原始答案中提到的,CellGrid类对其Cell的内部工作没有任何依赖。

答案 1 :(得分:2)

您拥有的是类构造中的数据结构。

如果没有某些行为,你就不能拥有“OO”类。

网格示例至少具有少量行为,因为您可以将元素的查找与其存储位置分离。例如,在Tim的Grid示例中,我可以更改要使用HashMap实现的存储布局,其中行和列值是哈希函数的输入,并且使用相同的哈希函数来检索相同的元素

在这种情况下,网格将具有存储和检索单元格的“行为”;然而,这仍然是太多的数据结构。在我的网格中,我会接受并回馈数据

public class Grid {
  public void setValue(String value, int row, int column) {
    ...
  }

  public String getValue(int row, int column) {
    ...
  }
}

关键是在我的“改进”示例中,更多的实现细节隐藏在类的“用户”(程序员)中。适当的数据隐藏对良好的面向对象编程至关重要;因为,它允许使用该类的人开始将其视为“黑匣子”,其中需要知道如何实施它对于理解如何使用它并不重要。

如果您可以使用某些东西而无需确切知道它是如何工作的,那么您就拥有了一个高度可用的组件。那是好的(低级别)设计。

好的设计让生活更轻松。例如,您的烤面包机可能有一个“开始”按钮,一个“褐变调节”旋钮和一个电源指示灯。它真的不需要更多,如果你必须知道这些组件是如何在内部连接的,交换烤面包机将是一项更加困难的任务,因为你不得不重新学习你的“新烤面包机”的构建方式。

答案 2 :(得分:0)

我认为这是好的设计。对于基础类喜欢项目中的单元格,您必须定义基本属性(变量)并实现这些功能。我不会打扰构造函数,getter和setter,因为像eclipse这样的IDE可以帮助自动生成这些。右键单击 - >来源 - >生成getter和setter。 (想想为什么IDE提供这些)

虽然在网格类中,我的习惯是我通常不会编写getter和setter,因为键入函数名称和所需的参数可能无法节省您的时间与直接使用数组[] []获取值,除了你想在简单的getter和setter中添加更多操作。

无论如何,它都是一个很好的OOP设计。单调但清晰,高度可读。