Nel mio tempo libero, sto costruendo un risolutore di Sudoku per cercare di ottenere il blocco di OOP in PHP. Un puzzle di Sudoku, per quelli di voi che non lo conoscono, è nella sua forma più comune una matrice 9x9 di numeri da 1 a 9, con 3x3 quadrati delineati in un modello simile a un tic-tac-toe. Alcuni numeri sono compilati in anticipo. L'obiettivo del puzzle è compilare i numeri rimanenti, in modo che nessuna riga, colonna o quadrato 3x3 contenga lo stesso numero più di una volta.È brutto dichiarare una classe vuota?
Per fare ciò, ho creato un certo numero di classi. Un Cell
può essere un elemento di un Constraint
, che sono le righe, le colonne e i quadrati 3x3. A Sudoku
è una raccolta di Constraint
se Cell
s. Ho una classe SudokuSolver
che include in modo dinamico file di origine con dichiarazioni di classe sottoclasse SolverHelper
e crea un'istanza di ciascuna sottoclasse. Un helper ha una funzione Solve()
che accetta un argomento come Sudoku
. Esamina i Constraint
e chiede alle sue celle di eliminare le possibilità di valore in base a ciò che trova. Il programma stesso scorre sugli helper fino a quando nessuno di loro ha dichiarato di essere in grado di eliminare più possibilità.
Ma il fatto che tutte le celle di una riga o di una colonna si allineano, presenta alcuni corollari che vengono sfruttati in alcune tecniche di soluzione. Quindi ho bisogno di distinguere tra righe/colonne e altri Constraint
s. Potrei avere le righe e le colonne in diversi array, che non è una cattiva soluzione. Questo ha il vantaggio di consentire una buona opportunità di ottimizzazione: nessuna colonna interseca mai un altro, ad esempio. Potrei anche aggiungere una proprietà booleana IsLinear
.
Oppure, e ora arriviamo alla mia domanda: potrei sottoclasse la classe Constraint
per avere un LinearConstraint
. Ma quella classe sarebbe vuota. Non avrebbe bisogno di sovrascrivere nulla nella classe Constraint
. Sarebbe un paio di parentesi graffe, e basta; un oggetto LinearConstraint
è speciale in quanto è un'istanza della sua classe. Se volevo o dovevo avere un codice speciale che riguardasse i vincoli lineari, potrei sempre aggiungerlo. La mia domanda è: è il fatto che sto considerando di dichiarare e usare una classe vuota, un segno che sto facendo qualcosa di sbagliato? Sono troppo astratto e teorico su questo?
Sarebbe sufficiente 'nuovo stdClass()'? O '(oggetto) ''' '? –
@JaredFarrish, chiede di estendere una classe esistente senza apportare modifiche (classe figlio vuota) –
Un membro della classe ipotetica avrebbe funzionalità che deriva dalla sua classe base. Quello che voglio dire è che la classe non * aggiungere * nulla alla funzionalità della sua classe base. Non sto affatto pensando di creare un oggetto che non fa nulla. – toon81