Как я могу написать метод, который не включает в себя логику метода в имени, но поддерживает различные алгоритмы (в Java)? - PullRequest
1 голос
/ 29 апреля 2019

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

Для простоты на этом устройстве есть именованные поля чтения / записи

  1. fieldAlpha
  2. fieldBeta ...
  3. fieldn

, которые я могу получить и установить на этом устройстве.

Последовательность команд создается изОбъект StringBuilder, состоящий из

  • префикс
  • необязательный полезный груз сеттера (для сеттера)
  • суффикс

Последовательность команд выглядиткак <ESC>ABC*somerandomvalueDEF<LF>.

После написания около 20 из них я подумал, что ДОЛЖЕН быть более понятный способ справиться с этим.

public String getFieldAlpha() {
    StringBuilder sb = new StringBuilder();
    sb.append((char) 0x1B).append("ABC").append("DEF").append((char) 0x0D);
    byte[] command = sb.toString().getBytes();
    String response = (sendMessage(command));
    return response;
}

public String setFieldAlpha(String alpha) {
    StringBuilder sb = new StringBuilder();
    sb.append((char) 0x1B).append("ABC*").append(alpha).append("DEF").append((char) 0x0D);
    byte[] command = sb.toString().getBytes();
    String response = (sendMessage(command));
    return response;
}

public String getFieldBeta() {
    StringBuilder sb = new StringBuilder();
    sb.append((char) 0x1B).append("OPQ").append("RST").append((char) 0x0D);
    byte[] command = sb.toString().getBytes();
    String response = (sendMessage(command));
    return response;
}

public String setFieldBeta(String beta) {
    StringBuilder sb = new StringBuilder();
    sb.append((char) 0x1B).append("OPQ*").append(beta).append("RST").append((char) 0x0D);
    byte[] command = sb.toString().getBytes();
    String response = (sendMessage(command));
    return response;
}

// ... and so forth

Я подозреваю, что лучший дизайн для API будетдва метода, которые выбирают функции на основе параметров.Я зациклен на том, что последовательность команд меняется в зависимости от поля.

  1. getField()
  2. setField(Method FieldName, String value)

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

1 Ответ

1 голос
/ 29 апреля 2019

Одним из способов реализации этого является HashMap , который отображает поле в формат сообщения. Если у вас есть разные форматы для получения поля и установки поля, вам понадобятся два HashMaps .

Ваше приложение должно будет вызывать методы для каждого поля, поэтому вы можете добавить два метода: setField (string fieldName, string fieldValue) и getField (string fieldName) .

Вы можете добавить статический класс, который будет содержать поля.

public class Fields {

  public final string Alpha = "Alpha";
  public final string Alpha = "Beta";
  // ......
}

Добавить фабрику для разделения ответственности за создание сообщения на специальный объект:

  public class MessageFactory {

    private HashMap<string, string> mFieldNameMessageFormatMap;

    public MessageFactory() {

       mFieldNameMessageFormatMap = HashMap<string, string>();

       // Initialize your formats here. These are just for example and are not 
          correct

       mFieldNameMessageFormatMap.put(Fields.Alpha, "<ESC>ABC*%sDEF<LF>");
       mFieldNameMessageFormatMap.put(Fields.Beta, "<ESC>OPQ*%sRST<LF>");
    }

    public string createGetFielMessage(string fieldName) {
       return String.format(mFieldNameMessageFormatMap.get(fieldName), "");
    }

    public void createSetFieldMessage(string fieldName, string value) {
       return String.format(mFieldNameMessageFormatMap.get(fieldName), value);
    }
  }

Тогда ваш код становится:

 public void getValue(string fieldName) {
   return sendMessage(mMessageFactory.createGetFieldValue(fieldName));
 }

 public void setValue(string fieldName, string value) {
   return sendMessage(mMessageFactory.createSetFieldValue(fieldName), value);
 }

 // usage:

 string fieldValue = getValue(Fields.Alpha);

 setValue(Fields.Alpha);

Добавление новых полей легко. Вам просто нужно добавить поле в класс Fields и добавить форматирование в Factory

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

...