Рефакторинг взаимоисключающих логических значений в Java - PullRequest
0 голосов
/ 03 октября 2018

Допустим, у «нас» есть некоторые логические флаги, которые определяют, как приложение ведет себя в любой момент времени ... что угодно, от того, как обрабатываются касания, до того, что происходит в onPause ().

boolean touchMode_BlockAllExceptCreateNew = false;
boolean touchMode_UserIsEditting = false;
boolean touchMode_Animation4IsTakingPlace = false;

Там может быть потенциально бесконечным числом этих маленьких парней.:)

Эти "состояния" являются взаимоисключающими - только одно может или должно происходить на законных основаниях за один раз.

Так что ... не существует ли какого-либо умного способа обеспечить соблюдение этого взаимногоисключительность путем объединения их в одну переменную?

Является ли использование Enum практически единственным способом сделать это?Вот так:

private enum TouchMode {
    flibbidyInProgress,
    deletePending,
    userIsEditting,
    jumpingJacks,
    recyclerViewIsOpen,
    normal // none
}

TouchMode currentTouchMode = TouchMode.normal;

private void changeTouchMode(TouchMode desiredTouchMode) {

    boolean undesirableCondition1 = (desiredTouchMode == currentTouchMode);
    boolean undesirableCondition2 = (desiredTouchMode != TouchMode.normal 
            && currentTouchMode != TouchMode.normal);

    if (undesirableCondition1 | undesirableCondition2) {
        Log.e("XXX", ">> ILLEGAL TOUCHMODE REQUEST! <<");
        Log.e("XXX", "requested: " + desiredTouchMode
                + ", current: " + currentTouchMode);
    } else {
        currentTouchMode = desiredTouchMode;
    }

}

Мне показалось, что я нашел какой-то умный способ превратить currentTouchMode в int и присвоить ему шестнадцатеричные константы.

1 Ответ

0 голосов
/ 03 октября 2018

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

вики

рефакторинг Гуру

Если в ближайшее время - вы должны создать иерархию классов с общим интерфейсоми специфичные для класса реализации для каждого TouchMode (например, AnimationTouch, EditionTouch и т. д.).Тогда вы должны использовать их через ваш общий интерфейс.

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