Как вы структурируете Java-программу? - PullRequest
1 голос
/ 06 января 2010

Довольно давно я пытался сделать простую «игру» на Java, которая на самом деле была бы просто апплетом с квадратом и сеткой. В конце концов, я хочу, чтобы пользователь щелкнул мышью, и квадрат переместится туда, где щелкнул пользователь, с округлением до ближайшего квадрата сетки.

Проблема в том, что я новичок-самоучка, и мне трудно понять, как на самом деле структурировать программу, некоторые примеры:

  • Должен ли я иметь отдельный класс прослушивания щелчков мыши?
  • Когда я получу щелчок, я должен отправить его другому объекту, представляющему ящик, и позволить ему решить, что он хочет сделать, или просто вызвать какую-то функцию, которая заставляет ящик двигаться?

Я действительно хочу научиться всему этому "когда использовать что" для себя, поэтому любые ссылки или общие советы приветствуются.

Ответы [ 8 ]

7 голосов
/ 06 января 2010

На самом деле вы спрашиваете, как разработать игру, которая заметно отличается от типичного Java-приложения. Тем не менее, я дам вам несколько идей, чтобы хотя бы указать правильное направление.

  • Воспользуйтесь преимуществом того факта, что Java является объектно-ориентированным языком. То есть каждый объект должен иметь свою собственную ответственность .
  • Разделите вашу игру на три ключевых уровня: прикладной уровень, уровень логики игры и уровень представления.

    • Уровень приложения должен содержать все ваши помощники и общие подсистемы, такие как генераторы случайных чисел, анализаторы текста, модули доступа к файлам, загрузчики мешей и т. Д.
    • Уровень логики игры должен реализовывать все правила вашей игры и отвечать за поддержание канонического состояния. В основном, когда вы нажимаете «W» на клавиатуре, чтобы двигаться вперед, уровень логики игры должен получать MOVE_FORWARD_REQUEST от пользовательского интерфейса.
    • Уровень представления должен отвечать за две вещи: получение информации и отображение вашего мира. Когда он получает ввод, например, клавишу «W», он должен сопоставить это с действием и отправить его на уровень логики игры для обработки. Затем он должен отображать мир, основываясь на том, что игровая логика говорит ему.

Разработка игр, очевидно, представляет собой целое царство, посвященное множеству книг. Game Coding Complete , один из моих любимых, который ориентирован на C / C ++, но должен дать вам хорошее представление о том, как вы должны структурировать свою игру.

Удачи!

5 голосов
/ 06 января 2010

Одним из основных принципов хорошей разработки программного обеспечения является Принцип единой ответственности . В нем говорится, что функция или класс должны иметь только одну ответственность.

Таким образом, ваши классы и объекты не должны становиться слишком большими и неуправляемыми.

1 голос
/ 06 января 2010

... пользователь щелкает, и квадрат переместится туда, где пользователь щелкнул округло, до ближайшего квадрата сетки.

Вот пример выполнения этого в масштабе.

1 голос
/ 06 января 2010

Одна из проблем здесь заключается в том, что во всех правилах есть некоторая свобода действий, когда вы должны использовать свое собственное суждение.

Например, приложение, которое вы описываете сейчас, кажется мне настолько простым, что я, вероятно, сделаю это в одном классе, возможно с парой вложенных, возможно, анонимных классов. В любом случае, я мог бы найти достойное обоснование для того, чтобы поместить все это в один исходный файл, заявив, что несколько исходных файлов на самом деле увеличат сложность всего этого.

Но если бы в вашем графическом интерфейсе было несколько разных элементов управления, возможно, каждый из которых контролировал свое поведение, пришло время разделить функциональность, чтобы вы не закончили с большой чашей спагетти-кода.

Библиотеки Java GUI пытаются естественным образом отделить (view + controller) от модели. Вам рекомендуется определять и отображать графический интерфейс в одном модуле (= файл), но иметь модель данных и, возможно, функциональность в другом. Для сложных графических интерфейсов может также быть несколько модулей реализации графического интерфейса, удерживаемых вместе кодом.

Один из способов сохранить вещи в чистоте - это работать в «слоях», где каждый слой «знает» только то, что ему нужно знать. Чтобы быть точным, уровень GUI должен знать о существовании его базовых моделей & ndash; таблицы и списки, и тому подобное, должны быть подключены к TableModel s и ListModel s и т. д. Тем не менее, не требуется знать детали этих моделей, поэтому он может просто ссылаться на эти модели по интерфейсу.

Слой модели, с другой стороны, не должен ничего знать о GUI. Чем меньше он знает, тем лучше, и это теоретически позволит вам обмениваться графическими интерфейсами без необходимости прикасаться к моделям.

Моя модель также может содержать ActionListener s для ответа на действия, предпринятые, например, нажатие кнопок в графическом интерфейсе.

Конечно, действия и изменения в модели часто приводят к изменениям в графическом интерфейсе. Как сообщить об этих изменениях в GUI, если уровень модели не знает о GUI? Вы можете использовать связанные свойства bean здесь. Вот краткое руководство: http://www.javalobby.org/java/forums/t19476.html. Таким образом, у вас такая же структура: изменения происходят в вашей модели, они сообщаются бинам с поддержкой изменения свойств в модели, и графический интерфейс может подключать слушателей к этим свойствам, чтобы узнать, что что-то изменилось.

Выполните ли вы фактические, эффективные действия (например, написание файлов, преобразование данных и т. Д.) В коде вашей модели, или же вы разделите код "обработки" на еще один модуль, зависит от вас и будет зависеть от того, насколько загромождена ваша модель уже есть. Если там крошечная горстка полей и методов, чувствующих себя одинокими, вы можете решить объединить все вместе, но в тот момент, когда он начнет выглядеть беспорядочным, вам захочется перестроить код обработки в свой собственный модуль. Обработка звучит как тот модуль, который не хочет знать и о других модулях; в итоге вы можете просто вызывать его методы на уровне модели.

Я описал мой основной стиль для разработки GUI. Конечно, есть и другие рекомендации, и вы, вероятно, разработаете свой собственный стиль на основе своего опыта. Это просто для того, чтобы дать вам идею и возможную отправную точку.

1 голос
/ 06 января 2010

Я думаю, что одна из самых важных концепций, которую нужно освоить при разработке программного обеспечения, - это концепция или Ортогональность . Это не самое простое определение, но по сути это означает, что один компонент (например, чтение щелчков мыши) не должен быть напрямую связан с не связанным компонентом (перемещение квадрата на экране).

В вашем случае код, читающий щелчки мыши, должен быть отделен от кода, который фактически перемещает поле. Реализовать ли вы это как внутренние / анонимные классы или нет - решать вам. Но если вы будете следовать принципу ортогональности, это будет легко изменить позднее, если вы передумаете.

0 голосов
/ 06 января 2010

Каждый начинающий Java-программист должен начать с Sun Tutorials. Они неплохие.

Другим хорошим источником, особенно среди бесплатных источников, является «Мышление на Java» Брюса Экеля, доступное с http://www.mindview.net/Books/TIJ/.

Но последнее несколько устарело по сравнению с первым. Вот почему я рекомендую оба.

0 голосов
/ 06 января 2010

Да, я сам начинающий программист. Да, разделение функциональности по нескольким классам - это хороший способ уменьшить сложность и повысить сплоченность отдельных классов.

Улучшение сплоченности хорошо, потому что благодаря более сложной структуре данных ваши алгоритмы становятся менее сложными, а код менее зависит друг от друга.

Например, в вашем случае было бы неплохо разделить классы в соответствии с MVC ( Model View Controler ).

  • У вас есть Модель, которая представляет способ структурирования ваших игровых данных.
  • У вас есть зритель, который представляет вашу модель в том виде, в каком вы его когда-либо представляли.
  • Наличие контроллера, который регистрирует изменения в модели (через прослушиватели), а затем обновляет средство просмотра

Теперь вы можете изменить свою модель и добавить дополнительные функциональные возможности, требующие лишь небольших изменений в работе средства просмотра.

Существует множество паттернов , но нет жестких правил, когда использовать один поверх другого. В некоторых случаях вы можете использовать несколько, а в некоторых случаях вам придется выбирать один шаблон проектирования вместо другого.

0 голосов
/ 06 января 2010

Шаг 1 - найдите демонстрационные апплеты, поставляемые Sun. http://java.sun.com/applets/jdk/

Шаг 2 - прочитайте эти демонстрационные апплеты. Как минимум три. Желательно все из них.

После того, как вы прочитали несколько апплетов, вы должны немного лучше понять, как организовать программы. Затем вы можете задавать вопросы, уделяя гораздо больше внимания конкретным примерам апплета и вашей конкретной проблеме программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...