Преобразование многих утверждений "если еще" в более чистый подход

Мой код здесь определяет, равен ли mimeType некоторому MIME, если он есть, он сделает определенное преобразование

public void convertToMp3(File src, File target,String mimeType){
    if(mimeType.equals("audio/mpeg")){
        ...
    }else if(mimeType.equals("audio/wav")){
        mp3ToWav();
    }else if(mimeType.equals("audio/ogg")){
        ...
    }else if(...){
    ... //More if and else here
}

Я сократил свой код, потому что в нем много других утверждений, какой шаблон дизайна подходит для удаления многих операторов if и else или if if?

Ответ 1

У вас может быть интерфейс Converter. Затем вы можете создать класс для каждого типа Mimetype, например:

public interface Converter {

    public void convertToMp3();
    public void convertToOgg();

}

public class MpegConverter implements Converter {

    public void convertToMp3() {
        //Code here
    }

    public void convertToOgg() {
        //Code here
    }

}

Для каждого конвертера вам понадобится такой класс. Затем вы можете создать такую ​​карту:

Map<String, Converter> mimeTypeMap = new HashMap<String, Converter>();

mimeTypeMap.put("audio/mpeg", new MpegConverter());

Затем ваш метод convertToMp3 будет выглядеть следующим образом:

Converter converter = mimeTypeMap.get(mimeType);
converter.convertToMp3();

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

Все непроверенные, вероятно, не компилируются, но вы получаете идею

Ответ 2

Если вы используете pre-JDK7, вы можете добавить перечисление для всех MIME типов:

  public static enum MimeTypes {
      MP3, WAV, OGG
  }

  public class Stuff {
      ...
      switch (MimeTypes.valueOf(mimeType)) {
          case MP3: handleMP3(); break;
          case WAV: handleWAV(); break;
          case OGG: handleOGG(); break;
      }
  }

И посмотрим на вопрос о переполнении стека Java - Преобразование String в перечисление о том, как преобразовать строки в перечисления.

Ответ 3

Рассмотрите возможность использования шаблона проектирования Стратегии и Map для отправки в соответствующую стратегию. Особенно полезно, если вам понадобятся дополнительные функции, в дополнение к преобразованию для конкретного mimeType, или конвертеры представляют собой большой и сложный код, и вы захотите разместить каждый конвертер в своем собственном файле .java.

 interface Convertor {
    void convert(File src, File target);
 }

 private static void convertWav(File src, File target) {
    ...
 }

 ...

 private static final Map< String, Convertor > convertors = new ...;
 static {
    convertors.put("audio/wav", new Convertor {
       void convert(File src, File target) {
          convertWav(src, target);
       }
    });
    convertors.put("audio/ogg", new Convertor {
       void convert(File src, File target) {
          convertOgg(src, target);
       }
    });
    ...
 }

 public void convertToMp3(File src, File target, String mimeType){
     final Convertor convertor = convertors.get(mimeType);
     if (convertor == null ) {
        ...
     } else {
        convertor.convert(src, target);
     }
 }

Ответ 4

Если вы запускаете те же методы для каждого случая, вы должны проверить шаблон состояния

Ответ 5

Если вы используете JDK 7, вы можете использовать конструкцию switch-case:

Смотрите: Почему я не могу включить строку?

Для предыдущих версий if-else - единственный выбор.

Ответ 6

Это определенно шаблон дизайна стратегии. Но у вас большая проблема в вашем общем дизайне. Это не хорошая привычка программирования использовать String для идентификации типа. Просто потому, что он легко редактируется, и вы можете совершить ошибку грамматики и провести весь день в поисках ошибки программирования. Вы можете избежать использования map < > .

Я предлагаю следующее:

  • Расширить файл класса. Новый класс добавляет новый атрибут FileType и новый метод convertTo (FileType) в класс File. Этот атрибут имеет свой тип: "audio", "wav"... и снова не использует String, Use Enum. В этом случае я назвал его FileType. Расширьте файл столько, сколько хотите: WavFile, AudioFile...
  • Используйте стратегию dp для создания ваших конвертеров.
  • Для инициализации преобразователей используйте Factory dp.
  • Так как каждый файл знает свой тип и целевой тип (используйте метод convertTo() для указания целевого типа), он вызовет Factory, чтобы автоматически получить правильный конвертер.

Этот проект является масштабируемым, и вы можете добавить столько, сколько вам потребуется FileType и конвертеры. Ответ, за который вы проголосовали, вводит в заблуждение!!!! Существует большая разница между кодированием и взломом.

Ответ 7

Если вы не используете Java 7, вы можете создать enum и использовать это значение в случае switch. Затем вам нужно передать значение enum (а не файл, я не понимаю, почему вы это делаете). Он также выглядел бы аккуратно.

Они должны помочь с тем, что вы хотите сделать:

 [Java Enum Examples][1] - 
 [Java Switch Case examples][2]