Я намагаюся зрозуміти, як проектувати та мислити об’єктно-орієнтовано, і хочу отримати відгук від спільноти на цю тему. Далі наведено приклад гри в шахи, яку я хочу оформити в ОО. Це дуже широкий дизайн, і на цьому етапі я зосереджуюся лише на тому, щоб визначити, хто відповідає за які повідомлення та як об’єкти взаємодіють між собою, щоб імітувати гру. Будь ласка, вкажіть, чи є елементи поганої конструкції (висока муфта, погана згуртованість тощо) та способи їх покращення.
Гра в шахи має наступні класи
- Дошка
- Гравець
- Шматок
- Площа
- ChessGame
Дошка складається з квадратів, і тому Дошка може бути покладена на відповідальність за створення та управління об’єктами квадрата. Кожен фрагмент також знаходиться на квадраті, тому кожен фрагмент також має посилання на квадрат, на якому він знаходиться. (Це має сенс?). Потім кожен фрагмент відповідає за переміщення себе з одного квадрата на інший. Клас гравця містить посилання на всі його володіння, а також відповідає за їх створення (Чи повинен гравець створювати штуки?). Гравець має метод takeTurn, який, у свою чергу, викликає метод movePiece, який належить класу фігури, який змінює розташування фігури з поточного місця в інше. Зараз мене бентежить, за що саме повинен відповідати клас Board. Я припустив, що це потрібно, щоб визначити поточний стан гри та знати, коли гра закінчиться. Але коли шматок його змінює s розташування, як слід оновити дошку? чи повинен він підтримувати окремий масив квадратів, на яких існують фрагменти, і які отримують оновлення під час переміщення фрагментів?
Крім того, ChessGame фактично створює об'єкти дошки та гравця, які, у свою чергу, створюють квадрати і фігури відповідно і запускають моделювання. Коротко кажучи, це може бути так, як може виглядати код у ChessGame
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
Мені незрозуміло, як буде оновлюватися стан ради. Чи повинен шматок мати посилання на дошку? Де повинна лежати відповідальність? Хто має які посилання? Будь ласка, допоможіть мені з вашими введеннями та вкажіть на проблеми у цій конструкції. Я навмисно не зосереджуюся на будь-яких алгоритмах чи подальших подробицях гри, оскільки мене цікавить лише аспект дизайну. Сподіваюсь, ця спільнота може надати цінну інформацію.
takeTurn()
якщо хід p1 закінчує гру. Менш нікчемний коментар: Я вважаю більш природним зателефонувати гравцямwhite
іblack
.