Trong thời gian rảnh rỗi của tôi, tôi đang xây dựng một người giải Sudoku để cố gắng để có được hang của OOP trong PHP. Một câu đố Sudoku, đối với những người bạn không biết, là hình thức phổ biến nhất của nó là ma trận 9x9 của các số từ 1 đến 9, với hình vuông 3x3 được mô tả theo kiểu tic-tac-toe. Một số số được điền trước. Mục tiêu của câu đố là điền vào các số còn lại, do đó không có hàng, cột hoặc hình vuông 3x3 chứa cùng một số nhiều hơn một lần.Có tệ không khi khai báo một lớp học trống?
Để thực hiện việc này, tôi đã thực hiện một số lớp. Một Cell
có thể là một phần tử của một Constraint
, là các hàng, cột và hình vuông 3x3. A Sudoku
là bộ sưu tập của Constraint
s và Cell
s. Tôi có một lớp SudokuSolver
tự động bao gồm các tệp nguồn với các khai báo lớp con là SolverHelper
và khởi tạo một trong mỗi lớp con. Người trợ giúp có hàm Solve()
lấy một đối số Sudoku
. Nó kiểm tra các Constraint
s và yêu cầu các tế bào của nó để loại bỏ khả năng giá trị dựa trên những gì nó tìm thấy. Chương trình chính nó chỉ vòng qua những người giúp đỡ cho đến khi không ai trong số họ báo cáo rằng họ đã có thể loại bỏ bất kỳ khả năng nữa.
Nhưng thực tế là tất cả các ô trong hàng hoặc cột xếp hàng, có một số hệ quả được tận dụng trong kỹ thuật giải pháp nhất định. Vì vậy, tôi cần phân biệt giữa các hàng/cột và Constraint
s khác. Tôi có thể có các hàng và cột trong các mảng khác nhau, mà không phải là một giải pháp tồi. Điều này có lợi thế là cho phép một cơ hội tối ưu hóa tốt: chẳng hạn không có cột nào cắt nhau. Tôi cũng có thể thêm thuộc tính boolean IsLinear
.
Hoặc, và bây giờ chúng tôi nhận được câu hỏi của mình: Tôi có thể phân lớp lớp học Constraint
để có số LinearConstraint
. Nhưng lớp học đó sẽ trống rỗng. Nó sẽ không cần phải ghi đè lên bất cứ điều gì trong lớp Constraint
. Nó sẽ là một cặp dấu ngoặc nhọn, và đó là nó; một đối tượng LinearConstraint
là đặc biệt bởi đức hạnh là một thể hiện của lớp của nó. Nếu tôi muốn hoặc cần có mã đặc biệt liên quan đến ràng buộc tuyến tính, tôi luôn có thể thêm nó. Câu hỏi của tôi là: là một thực tế rằng tôi đang xem xét tuyên bố và sử dụng một lớp học trống, một dấu hiệu cho thấy tôi đang làm điều gì sai? Tôi có quá trừu tượng và lý thuyết về điều này không?
'stdClass() mới có đủ không? Hoặc '(đối tượng) '''? –
@JaredFarrish, anh ta hỏi về việc mở rộng một lớp hiện tại mà không thực hiện bất kỳ thay đổi nào (lớp con trống) –
Một thành viên của lớp giả định sẽ có chức năng đến từ lớp cơ sở của nó. Ý tôi là, lớp đó sẽ không thêm * bất cứ thứ gì vào chức năng của lớp cơ sở. Tôi không hề nghĩ đến việc tạo ra một vật thể không làm gì cả. – toon81