2011-12-18 13 views
7

私は暇なときに、PHPでOOPのハングアップを試みるためにSudokuソルバを構築しています。数独パズルは、知らない人のために、最も一般的な形で1から9までの数字の9×9行列です.3×3の正方形は、タックタックのようなパターンで描かれています。いくつかの数字は事前に記入されています。パズルの目的は、残りの数字を入力することで、行、列、または3×3の正方形に同じ番号が複数回含まれないようにすることです。空のクラスを宣言するのは悪いですか?

これを行うには、いくつかのクラスを作成しました。 Cellは、行、列、および3x3の正方形であるConstraintの要素にすることができます。 Sudokuは、ConstraintsとCellsのコレクションです。私はSolverHelperサブクラスクラスの宣言でソースファイルを動的に含むSudokuSolverクラスを持ち、各サブクラスの1つをインスタンス化します。ヘルパーは、を引数として持つSolve()関数を持っています。それはConstraintを調べ、見つかったものに基づいて価値の可能性を排除するように細胞に要求します。プログラム自体は、もはや何らかの可能性を排除することができないと報告するまで、ヘルパーをループするだけです。

しかし、行または列のすべてのセルが並んでいるという事実は、特定のソリューション技術の利点を生かした特定の理由があります。だから私は行/列と他のConstraintを区別する必要があります。私は行と列を別々の配列にできますが、これは悪い解決策ではありません。これには、最適化の機会を与えるという利点があります。たとえば、列が他の列と交差することはありません。ブール値のプロパティーIsLinearを追加することもできます。

または今私は私の質問に答えます:Constraintクラスをサブクラス化してLinearConstraintにすることができました。しかし、そのクラスは空です。 Constraintクラスのものを上書きする必要はありません。それは中括弧のペアであり、それはそれです。 LinearConstraintオブジェクトはそのクラスのインスタンスであるために特別です。線形制約に関係する特別なコードを必要としたり、必要としたりしたければ、いつでも追加することができます。私の質問は、私が空のクラスを宣言して使用することを検討しているということです。何か間違っているという印がありますか?これについて私はあまりにも抽象的で理論的なのですか?

+0

'新しいstdClass()で十分でしょうか?または '(オブジェクト) ''? –

+0

@ JaredFarrish、彼は何も変更せずに既存のクラスを拡張するように頼んでいます(空の子クラス) –

+0

仮説クラスのメンバーは、その基本クラスから来る機能を持っています。つまり、そのクラスは基本クラスの機能に何も追加しません。私は何もしないオブジェクトを作成することは一切考えていません。 – toon81

答えて

9

空のクラスはまったく悪くありません。人々はさまざまなシナリオでそれを使用します。特にException specializationでは例外的です。

Constraintクラスにフラグを追加するよりも、2つのタイプを区別するのが悪いとは思えません。少なくとも、コードの読みやすさのために、拡張クラスをもっと好むでしょう。

+0

私は例外に関してあなたの意見が好きです! – toon81

+0

私は同じ視点を持っています。コードを読みやすくする –

5

私はこの質問を誤解している可能性があります。私の理解から、Solve()の機能がグリッドの種類によって異なって動作するように、さまざまなタイプのConstriantクラスを使用したいと考えていますか? (最適化の理由から、おそらく)。

このようにしてConstraintクラスを拡張することは、確かにタイプを区別する1つの方法であり、特に悪い練習ではないと思います。

しかし、今後さらに多くの種類のConstraintを持っていてもいいかもしれません(私はうんざりしていて、3Dスドクや何かをすることに決めました)。この場合、元のConstraintクラスをabstract classに変換して拡張する方が良いかもしれません。どのように多くの下位制約が設定されているかを設定することができ、それらはすべて同じ機能(およびその制約に固有の追加機能)を持ちます。

この方法では、空のLinearConstraintサブクラスを設定して、さらに多くのサブクラスがあると決定したときに、すべてをシャッフルすることを心配する必要はありません。

+0

あなたは私がよく尋ねたいと思っていたことの要点を持っていると思います。私がやっていることは、プログラムを終了して、Killer Sudokuの解決を試みることです。数独ではなく、数字が入力されていないことを除き、代わりに点線で囲まれた領域と数字があり、その中の数字はその数値に加算されなければならない。 3を加算する2x1の領域は2と1でなければなりません。もちろん、私のOOPスキルをテストする優れた方法であり、興味深い 'Constraint'サブクラス化を可能にします。 – toon81

関連する問題