Разделение кода пользовательского интерфейса от логики игры


IIUC я должен отделить логику UI от модели и контроллер в моем проекте. Мне не удалось и пришлось прибегнуть к TextView и т. д. В моей игровой логики:

package dev.game.adventure;

import android.graphics.drawable.Drawable;
import android.widget.TextView;


public class Adventure {

    private Player player;

    public Player getPlayer() {
        return player;
    }

    public Adventure(TextView t, AdventureActivity target, PlaceView placeView) {
        World world = new AdventureWorld(this, t, target, placeView);
        Person me = new Person(world, "You", 0, target);
        placeView.mainCharacter = me;
        player = new Player(world, me, t);
    }


    public Drawable loadPicture(int imageName, AdventureActivity target) {
        Drawable im = target.getResources().getDrawable(imageName);
        return im;
    }
}

У меня аналогичные приведенным выше в несколько классов, прохождение на Андроид деятельность и/или виджет TextView в модели и объекты управления. Будет ли проблема и можно ли решить?



164
0
задан 1 февраля 2018 в 08:02 Источник Поделиться
Комментарии
2 ответа

ООП не означает "разделить" код в случайных классов.

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

Делаем ООП означает, что вы будете следовать определенным принципам, которые (среди прочих):


  • сокрытие информации / заключения

  • единая ответственность

  • разделение

  • Поцелуй (сохранить его простым (и) глупо.)

  • Dry (не повторяй себя.)

  • "Скажи! Не спрашивай".

  • Закон Деметры ("не разговаривай с незнакомцами!")

  • заменить ветвления с полиморфизмом

Вы пример испытывает многократные нарушения этого принципа ООП.

е.г:

Единая ответственность / разделение.

(Только) метод в класс ничего не делает, но делегирует вызов к одному из параметров, то при прохождении других параметров. Это обратная версия объекта зависти. Этот метод не имеет никаких оснований существовать здесь.

А так как это единственный метод в этот класс (вы показали) весь класс не имеет никаких оснований на существование.

интерфейс сегрегации

Ваш конструктор имеет 3 параметра, но есть только один член переменная инициализирована.

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

2
ответ дан 1 февраля 2018 в 11:02 Источник Поделиться

Экстракт интерфейс

Задайте себе вопрос: "почему я должен пройти это поле TextView?"

Я взглянул на ваш код к adventureworld класс, и там вы не используете его на всех. Так почему же ты справляешься?

Я также взглянул на свой код для плеер класса, и вы не используете его там тоже нет!

Итак, допустим, что вы бы использовать его, скажем, что ваш код должен добавить какой-либо текст этого текстового представления. Мы можем сделать это, передав что-то другое, чем элемент TextView. Перейдем к некоторым обратного. Как я не знаю, что вы планируете использовать его для, Я позвоню MessageCallback

public interface MessageCallback {
void message(String text);
}

Теперь вы можете пройти MessageCallback вместо TextView, что делает конструктор что-то вроде:

public Adventure(MessageCallback t, AdventureActivity target, PlaceView placeView) {

И создавая его:

MessageCallback callback = new MessageCallback() {
@Override public void message(String text) {
// here you have access to the TextView from the activity, so use it.
}
};
... = new Adventure(callback, activity, placeView);

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

Общие советы

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

Используя этот подход, всем своим видом занятия, вы должны быть в состоянии построить чисто игровое приложение консоль в качестве "посмотреть", а также приложения для Android.

2
ответ дан 3 февраля 2018 в 11:02 Источник Поделиться