2011-12-18 34 views
7

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?

+0

'stdClass() mới có đủ không? Hoặc '(đối tượng) '''? –

+0

@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) –

+0

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

Trả lời

9

Lớp trống không hề tệ. Mọi người sử dụng nó trong các tình huống khác nhau; đặc biệt là trong chuyên môn ngoại lệ.

Tôi không tin rằng sẽ tồi tệ hơn việc thêm cờ vào lớp Constraint, để phân biệt hai loại. Tôi sẽ thích nhiều hơn là mở rộng lớp học, ít nhất là vì lợi ích của khả năng đọc mã.

+0

Tôi thích quan điểm của bạn về trường hợp ngoại lệ – toon81

+0

Tôi có quan điểm tương tự. –

5

Tôi có thể hiểu nhầm câu hỏi, vì vậy hãy chịu theo tôi nếu tôi có! Theo hiểu biết của tôi, bạn muốn có các loại khác nhau của Constriant lớp học sao cho chức năng Solve() sẽ hoạt động khác nhau tùy thuộc vào loại lưới? (Vì lý do tối ưu, có lẽ).

Mở rộng lớp Constraint theo cách này chắc chắn sẽ là một cách để phân biệt các loại và tôi không nghĩ đó là thực tế đặc biệt xấu.

Tuy nhiên, bạn có thể muốn trong tương lai thậm chí có nhiều loại khác nhau của Constraint (Tôi không biết, bạn đã đi hạt và quyết định làm sudoku 3D hoặc một cái gì đó). Trong trường hợp này, có thể tốt hơn là bật lớp gốc Constraint thành một số abstract class và mở rộng điều đó. Bạn có thể thiết lập bao nhiêu subconstraints bạn muốn, và tất cả họ sẽ có chức năng tương tự (cộng với bất kỳ chức năng bổ sung duy nhất để hạn chế đó).

Bằng cách này bạn có thể thiết lập lớp con trống LinearConstraint và không phải lo lắng về việc xáo trộn mọi thứ xung quanh lần nữa khi bạn quyết định có nhiều lớp con hơn Constraint.

+0

Tôi nghĩ rằng bạn có ý chính của những gì tôi muốn hỏi rất rõ, những gì tôi định làm là kết thúc chương trình và sau đó cố gắng thực hiện giải pháp Killer Sudoku. Sudoku, ngoại trừ nó không đi kèm với bất kỳ số nào điền vào. Thay vào đó, có những khu vực với các đường chấm xung quanh chúng và một số, và các con số bên trong những khu vực đó phải cộng thêm số đó. Ví dụ, nếu bạn có một khu vực 2x1 có thể lên đến 3, nó phải là một 2 và 1. Điều đó, tất nhiên, sẽ là một cách tuyệt vời để kiểm tra kỹ năng OOP của tôi và nó chắc chắn sẽ cho phép lớp con 'Constraint' thú vị. – toon81

Các vấn đề liên quan