在业余时间,我正在构建一个数独求解器,试图在PHP中获得OOP的支持。对于那些不知道的人来说,数独谜题最常见的形式是从1到9的9x9数字矩阵,其中3x3正方形以类似于tic-tac-toe的模式描绘。有些数字是提前填写的。拼图的目标是填写剩余的数字,这样任何行,列或3x3正方形都不会包含多次相同的数字。
为此,我做了很多课程。 Cell
可以是Constraint
的元素,即行,列和3x3正方形。 Sudoku
是Constraint
和Cell
的集合。我有一个SudokuSolver
类,它动态地包含带有SolverHelper
子类类声明的源文件,并实例化每个子类中的一个。帮助器具有Solve()
函数,该函数将Sudoku
作为参数。它检查Constraint
并询问其单元格,根据它找到的内容消除价值可能性。程序本身只是循环帮助程序,直到他们都没有报告他们能够消除任何可能性。
但是,行或列中的所有单元格对齐的事实具有在某些解决方案技术中利用的某些推论。所以我需要区分行/列和其他Constraint
。我可以将行和列放在不同的数组中,这不是一个糟糕的解决方案。这具有允许良好优化机会的优点:例如,没有列与另一列相交。我还可以添加一个布尔属性IsLinear
。
或者,现在我们回答我的问题:我可以将Constraint
类子类化为LinearConstraint
。但那个班级是空的。它不需要覆盖Constraint
类中的任何内容。它将是一对花括号,就是这样; LinearConstraint
对象由于是其类的实例而特殊。如果我想要或需要有与线性约束相关的特殊代码,我总是可以添加它。我的问题是:我正在考虑宣布并使用一个空课,这表明我做错了什么?我对这个过于抽象和理论吗?
答案 0 :(得分:9)
空课并不坏。人们在各种其他场景中使用它;特别是在异常专业化方面。
我不相信它会比在Constraint
类中添加一个标志更糟糕,以区分这两种类型。我更喜欢扩展类,至少为了代码可读性。