在业余时间,我正在构建一个数独求解器,以尝试掌握 PHP 中 OOP 的窍门。对于那些不知道的人来说,数独谜题的最常见形式是一个 9x9 矩阵,其中包含从 1 到 9 的数字,其中 3x3 正方形以类似井字游戏的模式划定。有些数字是预先填写的。拼图的目的是填满剩余的数字,这样任何行、列或 3x3 方 block 都不会多次包含相同的数字。
为此,我制作了一些类(class)。 Cell
可以是 Constraint
的元素,即行、列和 3x3 正方形。 Sudoku
是 Constraint
和 Cell
的集合。我有一个 SudokuSolver
类,它动态包含带有 SolverHelper
子类类声明的源文件,并实例化每个子类之一。一个助手有一个 Solve()
函数,它接受一个 Sudoku
作为参数。它检查 Constraint
并要求其单元格根据发现的内容消除值可能性。程序本身只是循环遍历助手,直到没有人报告他们能够再消除任何可能性。
但是,一行或一列中的所有单元格都排成一行这一事实具有某些推论,这些推论在某些解决方案技术中得到了利用。所以我需要区分行/列和其他 Constraint
。我可以将行和列放在不同的数组中,这不是一个糟糕的解决方案。这具有提供良好优化机会的优势:例如,任何列都不会与另一列相交。我还可以添加一个 bool 属性 IsLinear
。
或者,现在我们来回答我的问题:我可以将 Constraint
类子类化为一个 LinearConstraint
。但是那个类(class)是空的。它不需要覆盖 Constraint
类中的任何内容。这将是一对花括号,仅此而已; LinearConstraint
对象是特殊的,因为它是其类的实例。如果我想要或需要有与线性约束有关的特殊代码,我总是可以添加它。我的问题是:我正在考虑声明和使用一个空类的事实是否表明我做错了什么?我对此是否过于抽象和理论化?
最佳答案
一个空类一点也不坏。人们在其他各种场景中使用它;特别是在异常特化方面。
我认为这不会比在 Constraint
类中添加一个标志来区分这两种类型更糟糕。我宁愿选择扩展类,至少为了代码的可读性。
关于php - 声明一个空类不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8551462/