|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.06.2010, 18:07 | #1 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
объектно-ориентированное программирование
Помогите, плиз, разобраться с сабжем. Для начала хотелось бы уточнить один вопрос и разобраться: как решить с помощью сабжа интересную мне задачу. Вопрос следующий: что представляет собой объектно-ориентированная программа? Как я понимаю, есть следующие варианты ответа:
1) Программа представляет собой множество классов, и ее выполнение полностью состоит из взаимодействия этих классов между собой и операционной системой; 2) Программа как и раньше представляет собой в основном набор процедур и функций. Классы при этом используются для реализации новых типов данных, используемых в обычных процедурах и функциях. То есть объектно-ориентированное и процедурное программирование используются совместно, дополняя друг друга. 3) Что-то другое. Задача следующая: найти все варианты пути шахматного коня на доске из указанной позиции, причем в каждом пути конь должен побывать на всех клетках доски и только по одному разу на каждой клетке. С помощью процедурно-ориентированного программирования я такую программу уже писал. Пытаюсь сейчас понять как написать ее объектно-ориентированной, но что-то торможу. Как я понимаю, в классы тут можно выделить доску, коня и стек, в котором будут запоминаться сделанные ходы. Но вот какая должна быть композиция этих классов и взаимодействие между ними представляю себе с трудом. Кроме того, не ясно, стоит ли делать класс Game, который будет агрегировать в себе указанные выше классы, а также стоит ли клетки доски делать отдельным классом и включить двухмерный массив объектов этого класса в состав класса доски. В общем, у меня сейчас в голове путаница, и я буду благодарен, если кто-то поможет разобраться с ней. На данный момент меня интересует именно проектирование программы, а не ее реализация; готового кода я не прошу и своего пока не написал. З.Ы: Учусь программировать на C++. Последний раз редактировалось Oleg_SK; 11.06.2010 в 18:12. |
11.06.2010, 18:28 | #2 |
Форумчанин
Регистрация: 26.04.2010
Сообщений: 328
|
Есть задачи, которые лучше решать процедурно, а есть, которые лучше решать с помощью ООП, эта не из них.
|
11.06.2010, 18:53 | #3 | |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
Начнем разбирать задачу снизу. То есть, с самых мелких частей.
Клетка Цитата:
Если она хранит в себе только координаты - делать класс не нужно. Но если она хранит еще и метку, был здесь конь или не был - лучше сделать отдельный класс. Потому что без класса, вам прийдется хранить в объекте доски еще один массив/стек - посещенных вершин. А так можно узнать посещалась ли эта вершина прямо у вершины. Game Стоит делать отдельным классом, потому что лучше собрать управление программой в одном месте. Отношения между классами Класс Game Хранит в себе указатель на доску (агрегация) Хранит в себе указатель на объект-коня (агрегация) Хранит в себе указатель на стек сделанных ходов, если он нужен (агрегация) Класс Доска Хранит в себе массив объектов-клеток (агрегация) Использует указатель на родителя-Game, для отправки сообщения о добавлении вершины в стек пройденных (ассоциация) Класс-Конь Использует указатель на объект-доску, чтобы посылать ему сообщения о сделанном ходе (ассоциация) Это предварительный вариант. Посмотрите и определитесь, что вас устраивает по задаче, а что нет. Вдруг я что-то не так понял. |
|
11.06.2010, 20:51 | #4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
ООП - это такая свободная штука, которую нельзя использовать правильно на 100%. У ООП куча подходов к проектированию. Смотря от чего отталкиваться и к чему идти.
С досками, конями,.. - это проектирование предметной области получается, т.е. в классах выражаем реальный мир. Только вот нужно ли это всё при решении данной задачи? Класс - это структура данных, которая имеет состояние и может его изменять через выполнение соответствующих методов. Теперь рассмотрим классы: Игра - какое у неё состояние? Доска? Но доска будет разная для каждого хода конём. Допустим, мы добавили состояния: новая игра и законченная игра. Что они нам дадут? А ничего, т.к. новая игра нам не нужна, а когда игра будет закончена и так известно (после вызова метода "найти все ходы конем"). Ну добавим мы в состояние еще и доску. Она будет либо пустой в начале игры, либо заполненной по её завершению. Смысл? Я его не вижу. Класс доски в принципе можно еще выделить, чтобы упростить доступ к ячейкам и организовать проверку на возможность хода в эту ячейку. Но над этим я бы тоже подумал, т.к. это вряд ли задача доски, скорее это к игре относится, но т.к. у игры нет состояния, то это выливается в функцию типа: Код:
Теперь класс конь: я вижу только возможным состоянием позицию коня на доске. Из методов только генерацию нового хода. Из-за одного метода создавать класс? Считаю, что за этим все же к функциям опять, а не к ООП. В общем, считаю задачу неудачной для изучения ООП, равно как не вижу веских оснований для использования данной штукенции. Можно выстроить иерархию классов как написал MaTBeu и это даже будет с одной стороны правильным, но я бы этого не делал. ООП - это как философия, можно доказать правильность любой иерархии классов и это будет так, но и кучу "ошибок" всегда можно найти. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Объектно-ориентированное программирование. Списки | Vegas | Общие вопросы C/C++ | 8 | 27.04.2010 19:21 |
Объектно-ориентированное программирование | 4ika | Помощь студентам | 2 | 04.04.2010 20:27 |
Объектно -ориентированное программирование | Asira | Помощь студентам | 3 | 05.03.2010 17:52 |
Объектно-ориентированное программирование | dzhI | Помощь студентам | 8 | 19.03.2009 13:38 |
Объектно-ориентированное программирование (Паскаль) | Ake | Помощь студентам | 1 | 22.02.2009 20:14 |