programing

많은 '그렇지 않은 경우' 문장을 보다 깔끔한 접근법으로 변환

sourcetip 2022. 10. 28. 22:59
반응형

많은 '그렇지 않은 경우' 문장을 보다 깔끔한 접근법으로 변환

서의 제 는, 「」가 「」인지 합니다.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에 각 인 코드에 이 좋습니다..javafilename을 클릭합니다.

 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을 사용하여 유형을 식별하는 것은 좋은 프로그래밍 습관이 아닙니다.단순히 편집이 쉽고 문법을 틀릴 수 있기 때문에 오후 내내 프로그래밍 오류를 찾아다닐 수 있습니다.맵 <>을 사용하지 않아도 됩니다.

다음을 권장합니다.

  1. 클래스 파일을 확장합니다.새 클래스는 새 속성 FileType과 새 메서드 convertTo(FileType)를 클래스 파일에 추가합니다.이 속성은 "audio" 및 "wav" 유형을 유지합니다.String을 사용하지 말고 Enum을 사용합니다.이 경우 FileType이라고 부릅니다.원하는 만큼 파일 확장:WavFile, AudioFile...
  2. Strategy dp를 사용하여 변환기를 만듭니다.
  3. 공장 출하 시 dp를 사용하여 컨버터를 초기화합니다.
  4. 모든 파일은 자신의 유형과 타깃유형을 알고 있기 때문에 (타깃유형을 지정하기 위해 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

반응형