Преобразование многих утверждений "если еще" в более чистый подход
Мой код здесь определяет, равен ли 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]