많은 '그렇지 않은 경우' 문장을 보다 깔끔한 접근법으로 변환
서의 제 는, 「」가 「」인지 합니다.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 문장이 많아서 코드를 줄였습니다. if 문장과 if 문장의 많은 부분을 제거하는 데 적합한 디자인 패턴은 무엇입니까?
하면 될 것 같아요.Converter
인터페이스입니다.그런 다음 다음과 같이 각 MIMtype에 대한 클래스를 만들 수 있습니다.
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();
이 방법을 사용하면 나중에 다른 변환기를 쉽게 추가할 수 있습니다.
모두 검증되지 않았고 컴파일되지 않았을지도 모르지만
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;
}
}
Stack Overflow 질문 Java - 문자열을 Enum으로 변환하는 방법에 대해 설명합니다.
과 「」의 한다.Map
이치노, 의 변환에 기능이 합니다.mimeType
에 각 인 코드에 이 좋습니다..java
filename을 클릭합니다.
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);
}
}
각 케이스에 대해 동일한 방법을 실행하는 경우 상태 패턴을 확인해야 합니다.
「 」를 사용하고 JDK 7
, 을 사용하면 .switch-case
★★★★
버전의 " " "if-else
유일한 선택입니다.
이것은 확실히 전략적인 디자인 패턴입니다.하지만 일반적인 디자인에 큰 문제가 있습니다.String을 사용하여 유형을 식별하는 것은 좋은 프로그래밍 습관이 아닙니다.단순히 편집이 쉽고 문법을 틀릴 수 있기 때문에 오후 내내 프로그래밍 오류를 찾아다닐 수 있습니다.맵 <>을 사용하지 않아도 됩니다.
다음을 권장합니다.
- 클래스 파일을 확장합니다.새 클래스는 새 속성 FileType과 새 메서드 convertTo(FileType)를 클래스 파일에 추가합니다.이 속성은 "audio" 및 "wav" 유형을 유지합니다.String을 사용하지 말고 Enum을 사용합니다.이 경우 FileType이라고 부릅니다.원하는 만큼 파일 확장:WavFile, AudioFile...
- Strategy dp를 사용하여 변환기를 만듭니다.
- 공장 출하 시 dp를 사용하여 컨버터를 초기화합니다.
- 모든 파일은 자신의 유형과 타깃유형을 알고 있기 때문에 (타깃유형을 지정하기 위해 convertTo() 메서드를 사용합니다) 공장에 호출하여 올바른 Converter를 자동으로 가져옵니다!!!
이 설계는 확장 가능하며 FileType과 변환기를 필요한 만큼 추가할 수 있습니다.당신이 투표한 답은 오해의 소지가 있습니다!!!코딩과 해킹 사이에는 큰 차이가 있다.
Java 7을 사용하지 않는 경우,enum
그 값을 사용하여switch
예를 들어 열거값만 전달하면 됩니다(파일이 아니라 왜 그러는지 모르겠습니다).더 깔끔해 보일 거예요.
이것들은, 고객이 하고 싶은 일에 도움이 됩니다.
[Java Enum Examples][1] -
[Java Switch Case examples][2]
언급URL : https://stackoverflow.com/questions/14136721/converting-many-if-else-statements-to-a-cleaner-approach
'programing' 카테고리의 다른 글
Vue CLI 유닛 테스트(단일 테스트 실행 방법) (0) | 2022.10.28 |
---|---|
jpa를 사용하여 동일한 테이블의 mariadb를 선택하십시오. (0) | 2022.10.28 |
리스트 내 객체의 특정 필드의 합계 값 (0) | 2022.10.18 |
날짜를 타임스탬프로 변환하는 방법 (0) | 2022.10.18 |
데이터베이스 mysql에서 mongoDb로 변환 (0) | 2022.10.18 |