宣布一个空课是不好的?

too*_*n81 7 php oop

在业余时间,我正在构建一个数独求解器,试图在PHP中获得OOP的支持.对于那些不知道的人来说,数独谜题最常见的形式是从1到9的9x9数字矩阵,其中3x3正方形以类似于tic-tac-toe的模式描绘.有些数字是提前填写的.拼图的目标是填写剩余的数字,这样任何行,列或3x3方块都不会包含多次相同的数字.

为此,我做了很多课程.A Cell可以是a的元素Constraint,即行,列和3x3正方形.A SudokuConstraints和Cells 的集合.我有一个SudokuSolver类,它动态地包含具有SolverHelper子类类声明的源文件,并实例化每个子类中的一个.一个助手的Solve()功能,需要一个Sudoku作为参数.它检查Constraints并询问其细胞,根据它发现的东西消除价值可能性.程序本身只是循环帮助程序,直到他们都没有报告他们能够消除任何可能性.

但是,行或列中的所有单元排列的事实具有在某些解决方案技术中利用的某些推论.所以我需要区分行/列和其他Constraints.我可以将行和列放在不同的数组中,这不是一个糟糕的解决方案.这具有允许良好优化机会的优点:例如,没有列与另一列相交.我还可以添加一个布尔属性IsLinear.

或者,现在我们回答我的问题:我可以将类子类化为Constraint一个LinearConstraint.但那个班级是空的.它不需要覆盖Constraint类中的任何内容.它将是一对花括号,就是这样; 一个LinearConstraint对象是一个特殊的,因为它是一个类的实例.如果我想要或需要有与线性约束相关的特殊代码,我总是可以添加它.我的问题是:我正在考虑宣布和使用一个空课,这是我做错了什么的迹象?我对这个过于抽象和理论吗?

Ϲοδ*_*διϲ 9

空课并不坏.人们在各种其他场景中使用它; 特别是在Exception专业化中.

我不相信它会比在Constraint类中添加一个标志更糟糕,以区分这两种类型.我更喜欢扩展类,至少为了代码可读性.


小智 5

我可能误解了这个问题,如果我是这样,请耐心等待!根据我的理解,你希望有不同类型的Constriant类,以便Solve()函数根据网格的类型采取不同的行动?(出于优化原因,大概是).

Constraint以这种方式扩展课程肯定是区分类型的一种方式,我认为这不是特别糟糕的做法.

然而,您可能希望将来有更多不同类型的Constraint(我不知道,说你疯了,决定做3D数独或其他什么).在这种情况下,最好将原始Constraint类转换为抽象类并扩展它.您可以设置您希望的许多子约束,并且它们都具有相同的功能(以及该约束特有的任何附加功能).

这样你就可以设置你的空子LinearConstraint类,而不必担心当你决定拥有更多的Constraint子类时再次改变一切.