11
votes

Comment supprimer la duplication de mon code

J'ai deux méthodes similaires. L'un d'eux imprime quelque chose et l'un d'entre eux économisait quelque chose. Comme vous pouvez le constater, il y a beaucoup de code dupliqué. Comment dois-je le refroidir et supprimer cette duplication?

public static void printSomething(List<String> list) {
    for (String item : list) {
        if (item.contains("aaa")) {
            System.out.println("aaa" + item);
        }
        if (item.contains("bbb")) {
            System.out.println("bbb" + item);
        } else {
            System.out.println(item);
        }
    }
}

public static Map<String, String> getSomething(List<String> list) {
    Map<String, String> map = new HashMap<String, String>();
    for (String item : list) {
        if (item.contains("aaa")) {
            map.put("aaa", item);
        }
        if (item.contains("bbb")) {
            map.put("bbb", item);
        } else {
            //do nothing
        }
    }
    return map;
}


7 commentaires

Cela dépend ... Pourquoi avez-vous ces 2 méthodes ... Pouvez-vous partager les méthodes d'appel


Vous pouvez probablement utiliser la valeur de retour de getomething () pour effectuer les impressions dans impressionnant () ; Je vais aller de cette façon afin d'éviter les méthodes qui ne rendent rien (qui ne sont pas des configurateurs OFC).


@Highperformancemark désolé pour une erreur. Je veux dire duplication


Cette édition a radicalement changé le problème, vous ne pouvez maintenant utiliser la deuxième méthode pour mettre en œuvre le premier plus.


@Keppil Je pense que le problème est toujours même = supprimer la duplication. Il s'agit probablement de changer de solution.


@hudl: Le problème est que vous invalendez des réponses à votre question précédente en effectuant ce changement. Vous feriez mieux de poser une nouvelle question alors.


ÊTES-VOUS SÛR GAMESIATHIX QUE NE DOIT PAS RETOURNER Carte > ou quelque chose comme ça? En ce moment, la carte renvoyée ne contient que le last item in Liste qui contenait "AAA" et et "BBB" , qui semble très différent, alors comment impressionnant se comporte (montrant tous les éléments contenant "AAA" , "BBB" ou non).


3 Réponses :


2
votes

Dans un langage de programmation avec des fonctions de première classe, vous passeriez une fonction comme paramètre indiquant ce que vous souhaitez faire à l'intérieur de la boucle (pour un exemple, voir la mise à jour ci-dessous). Java va avoir des lambdas dans la version 8, mais ils ne sont pas tout à fait au travail.

Dans l'état actuel de Java, vous devrez vous installer avec quelque chose de plus laids - par exemple, en passant un paramètre supplémentaire à la méthode; Ou vous pouvez transmettre des classes intérieures anonymes qui mettent en œuvre une interface, mais IMHO qui est même plus laidienne que ce que je suis sur le point de suggérer: xxx

si Imprimer est true puis imprimez à l'intérieur de la boucle, sinon ajouter à la carte . Bien sûr, vous devrez ajouter quelques si s à l'intérieur de la boucle pour vérifier cette condition et au début, un supplémentaire si pour déterminer si le Carte doit être initialisé. De toute façon, la méthode renvoie une carte , mais la carte peut être null pour le boîtier d'impression. C'est ce que je veux dire: xxx

update

par exemple, dans Python - qui permet de transmettre des fonctions en tant que paramètres, ce est la façon dont vous résoudriez le problème de manière élégante: xxx

voir comment ça marche: xxx


10 commentaires

C'est un exemple très laid. Prénom de cette méthode imprimer ou obtenir ?? Deuxièmement, vous avez toujours nul alors vous ne retournez rien


Le nom pourrait être quelque chose de générique. Et la méthode doit rendre une carte toujours, même si c'est null


Bon conseil. Et vous pouvez toujours passer à une implémentation d'une interface - le modèle de délégué.


votre exemple fonctionnera certainement mais vous devez admettre que ce n'est pas un très bon exemple


@hudi en effet, c'est laid. Mais Java n'est plus un bon langage de programmation, il vous oblige à écrire beaucoup de code de la chaudron laid comme celui-ci, voire pire, un kilométrage de motifs et de classes intérieures anonymes. Il manque l'élégance et la puissance expressive des langues fonctionnelles.


et comment résoudre ce problème avec la langue qui appuie la fermeture (Groovy)


@hudi Voir ma réponse mise à jour. En outre, j'ai reformulé le premier paragraphe: il ne suffit pas d'avoir lambdas , vous avez besoin de fonctions de première classe - en ce sens, Java 8's Lambdas ne suffira pas pour résoudre ce problème


Fonction HM comme paramètre :) Très bien.


@hudi oui, plus agréable et moins verbeux que d'utiliser C # ou Java. C'est une honte que tu n'acceptions pas cette réponse: p


Oui désolé mais je demande comment résoudre ceci en Java. Votre exemple fonctionne aussi mais j'accepte un nettoyant



7
votes

Assumer l'ordre de laquelle le println de "AAA" et "BBB" n'apparaît pas, vous pouvez remplacer la mise en œuvre de impressionnant avec xxx


3 commentaires

+1. Cela suppose que l'ordre des impressions n'a pas d'importance.


HM THX Cela fonctionnera si la méthode sera la même, mais si l'impression contient: ... ele {system.out.println ("BBB" + article); } et obtenir ... ele {// donothing}


Cette solution manque le cas où élément ne contient pas "AAA" ou "BBB"; PrintSomettion gère ce boîtier, mais grossiste le dépose (peut-être a-t-il changé lorsque la question a été modifiée).



3
votes

Une action d'interface générique qui a une méthode action (t t) peut réduire le code. XXX PRE>

Exemple: P>

public static Map<String, String> getSomething2(List<String> list) {
    final Map<String, String> map = new HashMap<String, String>();
    forEach(list, new ListToMapAction(map));
    return map;
}


public class ListToMapAction implements Action<String> {

    Map<String, String> map;

    public ListToMapAction(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public void action(String e) {
        if (e.contains("aaa")) {
            map.put("aaa", e);
        }
        if (e.contains("bbb")) {
            map.put("bbb", e);
        } else {
            // do nothing
        }
    }

}


3 commentaires

désolé mais je ne comprends pas votre exemple. Votre méthode ne renvoie rien alors comment devrais-je obtenir ma carte?


Quand vous venez d'imprimer quelque chose? Je pense qu'il y aura encore quelques duplications dans l'action de la méthode


Oui, il sera répété: \ Sont les éléments "AAA" et "BBB" dans une liste? Si oui, vous pouvez comparer les deux listes et le code sera plus court.