Skip to content

task6#6

Open
RTsolispaick wants to merge 2 commits into
mainfrom
task6
Open

task6#6
RTsolispaick wants to merge 2 commits into
mainfrom
task6

Conversation

@RTsolispaick

Copy link
Copy Markdown
Owner

Изменения:

  • Работа MVC модуля, связанного с моделью, инкапсулированна в отдельный пакет. Теперь взаимодействие с модулем происходит через класс, реализующий интерфейс MVCController, который предоставляет только один метод getPainter. Метод getPainter должен возвращать графический элемент, который отвечает за отрисовку робота.
  • Добавлен класс ModuleLoader для загрузки класса, реализующего интерфейс MVCController.
  • Класс, реализующий интерфейс MVCСontroller, инициализирует запуск игры в конструкторе.
  • Если у модели есть зависимые окна, то для этого есть интерфейс MVCControllerWithWindows и тогда у класса, реализующего этот интерфейс, должен быть определён метод getWindows для возврата зависимых окон.

…ия MVC связки робота; Создан класс ModuleLoader для загрузки классов, реализующих интерфейс MVCController; Добавлен новый пункт меню для выбора модели. При взаимодействии создаётся окно ModuleLoaderDialog, в котором можно выбрать jar файл и указать пакетный путь к нужному классу;
…WithWindows; Добавлена Димина модель для теста :);

@vpyzhyanov vpyzhyanov left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть замечания. В целом задача сделана хорошо. Задача принята.

*/
public class GameVisualizer extends JPanel implements PropertyChangeListener {
private RobotModel robotModel;
public class GameVisualizer extends JComponent implements PropertyChangeListener {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Забыли обновить JavaDoc, теперь это не панель

public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("robot_update")) {
this.robotModel = (RobotModel) evt.getNewValue();
if (evt.getPropertyName().equals("model_update")) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кстати, "model_update" лучше вынести в константу. Тогда если она изменится, то это сразу поменяется во всех местах.

return (JInternalFrame[]) getWindows.invoke(object);
} catch (IllegalAccessException e) {
Logger.error("moduleLoader.illegalAccess");
throw new RuntimeException(e);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Если вы выкидываете исключение, то не надо писать ничего в логгер. В логгер будете писать только тогда, когда будете по настоящему обрабатывать исключение. А то может случится так, что ошибка заллогируется дважды, тут и на уровне выше.
  2. Человекочитамый текст ошибки должен быть именно в сообщении исключения. А вот тут вы должны прочувствовать всю странность и неуместность вашего решения запихнуть локализацию внутрь логгера (логгер не должен отвечать за локализацию и вообще не должен быть с ней связан). Кстати, почему это до сих пор не исправлено?

try {
Class<?> clazz = urlClassLoader.loadClass(className);
Object object = clazz.getConstructor().newInstance();
Method getPainter = clazz.getMethod("getPainter");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Object object = clazz.getConstructor().newInstance();
Method getPainter = clazz.getMethod("getPainter");
try {
Method getWindows = clazz.getMethod("getWindows");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

аналогично

@Override
public JComponent getPainter() {
try {
return (JComponent) getPainter.invoke(object);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот тут я вообще не понял. Какой вы метод собираетесь вызывать? Ведь случился NoSuchMethodException и нужно обрабатывать ошибку, а не рисовать неизвестно что.

Либо код написан очень запутанно и в одном методе создаётся несколько разных объектов, из-за чего я не не могу уловить его суть.

PaneMenuBar.optionMenu.browse=Browse...
PaneMenuBar.optionMenu.load=Load Jar
moduleLoaderDialog.fileChooser.title=Path to the jar file:
moduleLoaderDialog.notEmptyField=Don't leave the fields empty!\n

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

сообщения не должны начинаться и заканчиваться на пробельные и служебные символы. Эти символы должны быть в коде, а не в локализации. Ведь в коде они будут написаны один раз, а в локализации - столько, столько локалей в системе. И их можно забыть дописать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants