【问题标题】:Need suggestion on coding practices on the concept "Do Not Repeat Yourself"需要关于“不要重复自己”概念的编码实践建议
【发布时间】:2019-05-13 10:47:22
【问题描述】:

我想更好地了解干净的编码和 OOP。我为此实例创建了一个国际象棋游戏。

现在,基本原则之一是:“不要重复自己”。现在我不知道如何创建一个包含 ChessFigures 列表的 Player 对象,而无需在 createFigures() 方法中重复自己。

在我的逻辑中,Player 类在每场比赛开始时都有 16 个数字。在这里,我重复自己 6 次。在这种情况下,建议的算法是什么?

public class Player {

    private ArrayList<Figure> figures = new ArrayList<Figure>(16);
    private ColorEnum playerColor;

    Player(ColorEnum color){
        this.playerColor = color; 
        createFigures();
    }

    private void createFigures(){
        addFigure(8, PAWN);
        addFigure(2, KNIGHT);
        addFigure(2, BISHOP);
        addFigure(2, ROOK);
        addFigure(1, QUEEN);
        addFigure(1, KING);
    }

    private void addFigure(int amount, FigureTypeEnum type){
        for(int i = 0; i < amount; i++) {
            this.figures.add(new Figure(type, this.playerColor));
        }
    }

    public ArrayList<Figure> getFigures() {
        return figures;
    }
}

【问题讨论】:

    标签: java oop coding-style


    【解决方案1】:

    如果你真的想摆脱重复,你可以将计数添加到枚举中并遍历所有枚举值。

    但我不会认为您的代码违反了 DRY 原则,因为您只有一种方法,而且调用都有不同的参数。代码的可读性非常好。

    如果您在其他地方也有相同的调用,则会违反 DRY 原则。

    【讨论】:

      【解决方案2】:

      在很大程度上,这是一个见仁见智的问题,我认为您当前的方法没有太大问题。但是,我认为片段的类型和数量是配置而不是程序的一部分。您可以创建一个配置文件来定义每个玩家可用的部分。如果由于某种原因国际象棋规则更改为包含另一个棋子,您只需要更改配置即可,无需弄清楚它在源代码中的定义位置。

      在国际象棋的实际情况中,这可能有点矫枉过正,但在更一般的意义上,这似乎是一个干净的解决方案。

      或者,您可以使用static final Map&lt;FigureTypeEnum, Integer&gt; 来保存配置,并将其填充到静态初始化程序块中。但是,静态初始化程序块并不常见(至少在我的经验中),并且可能会使初级开发人员感到困惑。

      其他一些提示:

      • 不要在 ArrayList 的初始化中使用类型见证。这应该足够了:private ArrayList&lt;Figure&gt; figures = new ArrayList&lt;&gt;();
      • 我不确定数组列表的初始大小。它适用于这种情况,因为您知道有 16 件。但是您在 createFigures 和初始化之间创建了一个隐式依赖关系。此外,这似乎是过早的优化。
      • 考虑将图形定义为 List 而不是 ArrayList。选择哪个 List 实现似乎与您的代码无关。

      编辑: 另一个考虑因素:如果在 getFigures() 方法中返回实际列表,则允许其他人从该列表中添加或删除项目。这可能是不可取的。您可以使用一些不可变列表(例如:https://www.baeldung.com/java-immutable-list)或返回列表的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多