Я пишу метод createMessage(), который будет принимать два параметра - тип сообщения и само сообщение.

Пока я достиг этого, имея оба параметра типа String. Тип сообщения может быть одним из трех; инструкция, ошибка или успех. Метод содержит оператор switch, который определенным образом редактирует сообщение в зависимости от его типа.

Метод будет выглядеть примерно так:

public void createMessage(String messageType, String message) {
    String output = "";
    switch(messageType) {
    case "instruction":
        output = "INSTRUCTION: " + message + "\n";
        //edits required for an instruction
        break;  
    case "error":
        output = "ERROR: " + message + "\n";
        //edits required for an error
        break;    
    case "success":
        output = "SUCCESS: " + message + "\n";
        //edits required for a success
        break;    
    default:
        throw new IllegalArgumentException("Invalid message type: " + messageType);
}   

Этот метод будет называться createMessage("instruction", "Enter your name:");, в то время как я бы предпочел не использовать кавычки для указания типа сообщения - createMessage(instruction, "Enter your name:");.

Вопрос : как лучше всего этого добиться?

2
KOB 25 Фев 2016 в 01:14

4 ответа

Лучший ответ

В соответствии с комментарием вы можете использовать перечисление следующим образом:

public enum MessageType {
    INSTRUCTION, ERROR, SUCCESS;    
}

И ваш метод должен быть реорганизован следующим образом:

public void createMessage(MessageType messageType, String message) {
    String output = "";
    switch(messageType) {
    case INSTRUCTION:
        output = "INSTRUCTION: " + message + "\n";
        //edits required for an instruction
        break;  
    case ERROR:
        output = "ERROR: " + message + "\n";
        //edits required for an error
        break;    
    case SUCCESS:
        output = "SUCCESS: " + message + "\n";
        //edits required for a success
        break;    
    default:
        throw new IllegalArgumentException("Invalid message type: " + messageType);
    }
}  

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

public class Message {
    private MessageType type;
    private String text;

    public Message(MessageType type, String text) {
        this.type = type;
        this.text = text;
    }

    public String buildOutput() {
        return type + text;
    }

    // other behaviors here
}

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

Это обеспечит соблюдение принципа единой ответственности (SRP), и вы получите лучшую (и более простую) возможность тестирования.

3
A_Di-Matteo 24 Фев 2016 в 22:23

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

public enum MessageType{
    INSTRUCTION, ERROR, SUCCESS
}

Кроме того, вы можете включить перечисления в чистом виде:

public void createMessage(MessageType messageType, String message) {
    String output = "";
    switch(messageType) {
    case INSTRUCTION://code break;
    case ERROR://code break;
    case SUCCESS://code break;
}
2
Youssef Lahoud 24 Фев 2016 в 22:25

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

public enum MessageType {
   ERROR, INSTRUCTION, SUCCESS;    
}

Затем вы можете использовать метод name() для типа сообщения, чтобы получить имя члена перечисления, а затем преобразовать его в верхний регистр. Вероятно, было бы лучше реализовать это в перечислении MessageType, но для соответствия вашему дизайну я сделал его отдельным.

public String createMessage(MessageType type, String message) {
   return String.format("%s: %s%n", type.name().toUpperCase(), message);
}
1
SamTebbs33 24 Фев 2016 в 23:24

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

Поэтому вам также следует рассмотреть возможность использования трех отдельных функций.

Другой вариант - использовать Message в качестве базового класса и унаследовать от него ErrorMessage и т. Д. Каждый подкласс будет знать, как обрабатывать вывод.

0
Frank Puffer 24 Фев 2016 в 22:30