Các đơn vị Delphi không bị "cơ bản bị hỏng". Cách họ làm việc tạo điều kiện cho tốc độ hiện tượng của trình biên dịch và thúc đẩy thiết kế lớp học sạch sẽ.
Có thể truyền bá các lớp trên các đơn vị theo cách mà Prims/.NET cho phép là cách tiếp cận được cho là cơ bản bị phá vỡ vì nó khuyến khích tổ chức hỗn loạn của các lớp bằng cách cho phép nhà phát triển bỏ qua nhu cầu thiết kế đúng khuôn khổ của họ việc áp dụng các quy tắc cấu trúc mã tùy ý như "một lớp cho mỗi đơn vị", không có thành tích kỹ thuật hoặc tổ chức như là một nguyên tắc phổ quát.
Trong trường hợp này, tôi ngay lập tức nhận thấy một đặc tính riêng trong thiết kế lớp học phát sinh từ tình trạng khó xử tham khảo vòng tròn này.
Tức là, tại sao một mảnh bao giờ có cần tham chiếu đến bảng không?
Nếu một phần được lấy từ bảng, tham chiếu như vậy sẽ không có ý nghĩa hoặc có thể "Mục tiêu di chuyển" hợp lệ cho một phần đã bị xóa chỉ là phần hợp lệ cho phần đó làm "vị trí bắt đầu" trong trò chơi mới? Nhưng tôi không nghĩ rằng điều này có ý nghĩa như bất cứ điều gì khác hơn là một biện minh tùy ý cho một trường hợp yêu cầu GetMoveTargets hỗ trợ lời gọi với một tham chiếu bảng NIL.
Các vị trí cụ thể của một mảnh cá nhân tại bất kỳ thời điểm nào là một tài sản của một trò chơi cá nhân của cờ vua, và không kém các HỢP LỆ di chuyển mà bạn có thể CÓ THỂ cho bất kỳ mảnh nhất định được phụ thuộc vào vị trí của Các phần khác trong trò chơi.
TChessPiece.GetMoveTargets không cần kiến thức về trạng thái trò chơi hiện tại. Đây là trách nhiệm của TChessGame. Và TChessPiece không cần tham chiếu đến trò chơi hoặc bảng để xác định mục tiêu di chuyển hợp lệ từ một vị trí hiện tại nhất định. Các ràng buộc của bảng (8 cấp bậc và tệp) là các hằng số miền, không phải là các thuộc tính của một cá thể bảng đã cho.
Vì vậy, một TChessGame là yêu cầu mà gói gọn kiến thức kết hợp nhận thức của một hội đồng quản trị, các mảnh và - điều quan trọng - các quy tắc, nhưng hội đồng quản trị và các mảnh không cần kiến thức về nhau OR của trò chơi. Có thể có vẻ hấp dẫn khi đặt các quy tắc liên quan đến các phần khác nhau trong lớp đối với loại bản thân, nhưng đây là một lỗi sai, vì nhiều quy tắc dựa trên tương tác với các phần khác và trong một số trường hợp cụ thể loại mảnh. Hành vi "hình ảnh lớn" như vậy đòi hỏi một mức độ over-sight (đọc: tổng quan) của tổng số trạng thái trò chơi đó là không thích hợp trong một lớp mảnh cụ thể.
ví dụ: một TChessPawn có thể xác định rằng một mục tiêu di chuyển hợp lệ là một hoặc hai ô vuông về phía trước hoặc một hình vuông theo đường chéo về phía trước nếu một trong hai ô vuông chéo đó bị chiếm đóng. Tuy nhiên, nếu sự di chuyển của cầm đồ cho thấy nhà vua đến một tình huống KIỂM TRA, thì cầm đồ không di chuyển được chút nào.
Tôi sẽ tiếp cận điều này bằng cách đơn giản cho phép lớp cầm đồ chỉ ra tất cả các mục tiêu di chuyển có thể di chuyển - 1 hoặc 2 ô vuông về phía trước và cả hai hình vuông về phía trước theo đường chéo. TChessGame sau đó xác định cái nào trong số này hợp lệ bằng cách tham chiếu đến khả năng chiếm dụng của các mục tiêu di chuyển và trạng thái trò chơi đó.2 ô vuông về phía trước chỉ có thể nếu cầm đồ ở cấp nhà, hình vuông phía trước bị chiếm đóng BLOCK a di chuyển = mục tiêu không hợp lệ, ô vuông đường chéo UNACupITE di chuyển, và nếu bất kỳ di chuyển hợp lệ nào khác cho thấy King thì di chuyển đó cũng không hợp lệ.
Một lần nữa, sự cám dỗ có thể là đặt các quy tắc áp dụng chung trong lớp cơ sở TChessPiece (ví dụ như một động thái đã cho thấy vua?), Nhưng áp dụng quy tắc đó yêu cầu nhận thức về trạng thái trò chơi tổng thể - phần khác - vì vậy nó đúng hơn thuộc như một hành vi tổng quát của lớp TChessGame, IMHO
Bên cạnh đó để di chuyển mục tiêu, miếng cũng cần phải chỉ ra CaptureTargets, mà trong trường hợp của hầu hết các mảnh là như nhau, nhưng trong một số trường hợp khá khác nhau - cầm đồ là một ví dụ điển hình. Nhưng một lần nữa, trong đó - nếu có - tất cả các hình ảnh tiềm năng có hiệu lực đối với bất kỳ động thái nào là - imho - một đánh giá về các quy tắc của trò chơi, không phải là hành vi của một mảnh hoặc một phần của các mảnh. Như trường hợp trong 99% tình huống như vậy (ime - ymmv), tiến thoái lưỡng nan có lẽ được giải quyết tốt hơn bằng cách thay đổi thiết kế lớp để thể hiện tốt hơn vấn đề đang được mô hình hóa, không tìm cách để thiết kế lớp học thành một tùy ý tổ chức tệp.
Chấp nhận điều này, vì nó ngắn và cung cấp giải pháp cho câu hỏi của tôi. Tôi đã bình chọn tất cả các câu trả lời hay khác. – jpfollenius
Tôi nhận được lỗi "E2086 Type 'tBaseChessBoard' chưa được xác định hoàn toàn". – Ampere
@Alaun, đây không phải là một đoạn trích hoàn toàn làm việc, vừa đủ để thể hiện đường dẫn đến một giải pháp. TBaseChessBoard nên có các phương thức cần thiết bởi GetMoveTargets nhưng được triển khai như trừu tượng hoặc ảo. – skamradt