Conversion de nombreux énoncés «if else» en une approche plus propre

Mon code détecte ici si le mimeType est égal à un type MIME , si c’est le cas, il effectuera une certaine conversion

 public void convertToMp3(File src, File target,Ssortingng 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 } 

J’ai raccourci mon code, car il a beaucoup d’ autres choses si des instructions, Quel modèle de conception est approprié pour en supprimer beaucoup si et d’ autres, ou si des instructions si ?

Vous pourriez avoir une interface de Converter . Ensuite, vous pouvez créer une classe pour chaque type Mimet comme:

 public interface Converter { public void convertToMp3(); public void convertToOgg(); } public class MpegConverter implements Converter { public void convertToMp3() { //Code here } public void convertToOgg() { //Code here } } 

Vous auriez besoin d’une classe comme celle-ci pour chaque convertisseur. Ensuite, vous pouvez configurer une carte comme celle-ci:

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

Alors votre méthode convertToMp3 devient comme ceci:

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

En utilisant cette approche, vous pourrez facilement append différents convertisseurs à l’avenir.

Tous non testés, probablement pas comstackr, mais vous avez l’idée

Si vous utilisez pre-JDK7, vous pouvez append une énumération pour tous les types 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; } } 

Et jetez un coup d’œil à la question Stack Overflow Java – Convert Ssortingng enum sur la façon de convertir des chaînes en enum.

Envisagez d’utiliser le modèle de conception de la stratégie et une Map pour envoyer la stratégie appropriée. Particulièrement utile si vous avez besoin de fonctionnalités supplémentaires, en plus d’une conversion pour un mimeType particulier, ou si les convertisseurs sont des codes volumineux et compliqués et que vous souhaitez placer chaque convertisseur dans son propre fichier .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, Ssortingng mimeType){ final Convertor convertor = convertors.get(mimeType); if (convertor == null ) { ... } else { convertor.convert(src, target); } } 

Si vous exécutez les mêmes méthodes pour chaque cas, vous devez vérifier le modèle d’état

Si vous utilisez JDK 7 , vous pouvez utiliser la construction switch-case :

Voir: Pourquoi ne puis-je pas allumer une chaîne?

Pour les versions antérieures, if-else est le seul choix.

C’est définitivement un modèle de conception de stratégie. Mais vous avez un gros problème dans votre conception générale. Ce n’est pas une bonne habitude de programmation d’utiliser Ssortingng pour identifier un type. Simplement parce que c’est facilement éditable et que vous pouvez faire une erreur de grammaire et passer tout l’après-midi à chercher une erreur de programmation. Vous pouvez éviter d’utiliser la carte <>.

Je suggère ce qui suit:

  1. Étendre le fichier de classe. La nouvelle classe ajoute un nouvel atsortingbut FileType et une nouvelle méthode convertTo (FileType) à la classe File. Cet atsortingbut contient son type: “audio”, “wav” … et encore ne pas utiliser Ssortingng, Use Enum. Dans ce cas, je l’ai appelé FileType. Étendre le fichier autant que vous le souhaitez: WavFile, AudioFile …
  2. Utilisez un dp de stratégie pour créer vos convertisseurs.
  3. Utilisez un dp Factory pour initialiser les convertisseurs.
  4. Comme chaque fichier connaît son propre type et le type de cible (utilisez la méthode convertTo () pour spécifier le type de cible), il appellera l’usine pour obtenir automatiquement le bon convertisseur !!!

Cette conception est évolutive et vous pouvez en append autant que vous avez besoin de FileType et de convertisseurs. La réponse pour laquelle vous votez est trompeuse !!!! Il y a une grande différence entre le codage et le piratage.

Si vous n’utilisez pas Java 7, vous pouvez créer un enum et utiliser cette valeur avec un cas de switch . Il vous suffit alors de passer la valeur enum (plutôt qu’un fichier, je ne sais pas pourquoi vous le faites). Ça aurait l’air plus propre aussi.

Ceux-ci devraient aider avec ce que vous voulez faire:

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