6
votes

Alternative à la déclaration en Java

Je suis curieux de voir toute alternative (s) à la règle (S) si des déclarations telles que xxx

de sorte que vous constatez tout si les déclarations sont séparées et sans condition d'autre. Veuillez noter que X y Z sont totalement séparées des conditions, alors le commutateur ne conviendrait pas.


6 commentaires

Alors que la curiosité pourrait être humoristique ... Pourquoi voudrais-je vouloir une alternative si, surtout quand une condition est que le commutateur ne convient pas? Comme si Java n'était pas assez gonflé déjà ...


Soit ce que vous essayez de faire est stupide (si c'est génial!), ou vous devez donner plus d'informations. Je peux imaginer une situation dans laquelle le code comme celui-ci pourrait être traité avec un modèle de messagerie ou autre chose qui est intéressant (à condition que votre situation ne soit pas aussi simple que celle que vous l'avez expliquée).


Qu'attendez-vous que cette alternative prévoit que le code présenté ne peut pas? (moins de caractères, plus de lisibilité?)


Eh bien, je suis juste en exploration, je sais que "si" la déclaration est élégante et facile à lire, mais une connaissance supplémentaire ne fait jamais mal :)


@Hellnar: Il y a des connaissances supplémentaires qui ont de la valeur et il y a une indigne de golf de code obscur.


en quantité suffisante, si les déclarations sont toxiques


11 Réponses :


3
votes

C'est la solution la plus simple, solution lisible et efficace forte>. Je serais surpris de voir des alternatives efficaces ici.

Modifier P>

Vous pouvez essayer d'appliquer Méthode d'extrait forte> plusieurs fois: P>

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}


2 commentaires

Je fais cela dans le micrologiciel pour un appareil pouvant avoir de nombreuses options différentes activées ou désactivées. Je préférerais avoir mon principal () appelez des choses comme DofooNifEnabled () que de l'encombrer avec beaucoup d'ifs et de #Ifdefs.


Comme n'importe quel motif, il y a des moments où il devrait être utilisé, et fois quand cela ne devrait pas.



0
votes

Cela dépend vraiment de ce que X, Y, Z et A, B, C. Parfois, si des déclarations sont plus appropriées. Parfois, le polymorphisme est plus approprié.


0 commentaires

5
votes

Les alternatives à si-ele en Java sont l'instruction de commutation et le ternaire conditionnel ( ?: ) opérateur, qui n'est pas exactement ce que vous demandez (gérer juste un si si sans sinon ). Le code que vous avez posté est le meilleur moyen de le faire, à mon avis.


1 commentaires

Conditions multiples en ternaire:

Utiliser le polymorphisme.

interface SomethingDoer {
    public void doSomething();
}

class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }

public class Main {
     public static void main (String[] args) {
          SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
          doer.doSomething();
     }
}


5 commentaires

Des commentaires sur la raison pour laquelle vous avez bowvote? N'est-ce pas une alternative? Ou n'est-ce pas assez bon d'être mentionné?


Je considérerais seulement une solution polymorphe si mon conditionnel était déjà basé sur type . Je ne créerais pas une hiérarchie de classe entière juste pour remplacer si (x) faire un;


Si beaucoup de cas cela a du sens. Voir YouTube.com/watch?v=4f72vulwfvc - Discussions de Google Tech. (The Netty Code Talks - Héritage, Polymorphisme et test) Je considère que le bowvote ne va pas.


Direct des diapositives de Misko: "Parfois un si est juste un si ". Sauf si vous réutilisez ces déclarations dans de nombreux endroits, cela va faire des choses complexes inutiles. Aussi: votre solution est incomplète. Et si les deux conditions X et Y sont-elles tenues? Vous avez manqué Aandbédoer, Aandcédalier, Bandcédalier, Aandbandcédalier; Celles-ci sont bien couvertes par le code d'origine.


Évidemment, cela dépend de ce que cela signifie "faire un". Le polymorphisme pourrait bien être une excellente solution, mais l'exemple est simplement trop générique pour avoir une solution unique pour tous les cas. Aurbédalier, etc. sont généralement résolus à l'aide de motifs de décorateur / composition pour une solution de type polymorphisme.



30
votes

Une réponse "vraiment orientée objet" serait de définir une interface pour "règle" (avec des méthodes de condition () et d'action ()), créer 3 implémentations, les garnir dans une collection, puis les iTerez-les génériquement comme dans:

rules.parallelStream().filter(Rule::condition).forEach(Rule::action);


2 commentaires

Vous pouvez utiliser une carte pour O (1) heure, plutôt que O (n).


Une carte ne fonctionnera pas ici, car la condition est unique à chaque mise en œuvre de la règle. La carte nécessite une clé réelle et non un code enterré dans une méthode appelable.



8
votes

La réponse courte est oui.

Il y a quelques temps, vous pouvez éviter d'utiliser si pour l'évitement conditionnel et la ramification ensemble. Et ils ont des moments de pertinence. p>

  1. polymorphisme, lorsque le comportement dépend des valeurs initiales li>
  2. attribution référencée, lorsque vous connaissez les valeurs initiales possibles et que 1 à 1 corrélation avec les valeurs de retour. Les listes sont meilleures que des tableaux pour cela, mais ...
    p>

    if (thisCondition == true) {  
      b = true;  
    } else {  
      b = false;  
    }
    
  3. Branchement référencé, lorsque vous connaissez les valeurs initiales possibles et que 1 à 1 corrélation avec la fonction / la branche à utiliser. (Exemple pas Java) P>

    // Example:
    if (a==1) { doSomething1();  }  
    if (a==2) { doSomething2(); }  
    
    // Becomes
    function * fx(2);  // our array or better still, list of functions  
    fx[0] = &doSomething1;   
    fx[1] = &doSomething2;  
    `fx[ a - 1 ](); `
    
  4. mission booléenne directe. p>

    Nous détestons: p>

    // Example:  
    if (a==1) { b=2;  }  
    if (a==2) { b=17; }  
    
    // Becomes  
    int fx(2);  // our array of answers  
    fx[0] = 2;   
    fx[1] = 17;  
    b = fx[ a - 1 ];
    


0 commentaires

0
votes

Vous devrez avoir ces déclarations quelque part.

Ils peuvent être refacturés dans d'autres méthodes pour conserver la méthode actuelle propre, car d'autres ont suggéré. Si vous avez besoin de réutiliser cette même SET de si des instructions dans un certain nombre d'endroits, il est utile peut utiliser le motif de décorateur .


0 commentaires

0
votes

Cela ressemble à un cas parfait pour utiliser fermeture . Mais pour cela, vous avez besoin groovy ou quelque chose de similaire.


0 commentaires

0
votes

Du ... myanimator (chose, pos, vitesse | costumeeseed ());

si vitesse === indéfini il sera alors calculé. Je pense.


0 commentaires

0
votes

Cela dépend vraiment du contexte ... mais oui si-d'autre n'est que l'une des instruction de contrôle en Java: https://docs.oracle.com/javase/tatutorial/java/ Nutsandbolts / Flow.html


0 commentaires

1
votes

Faites quelque chose comme ça, implémentez Enum basé sur la méthode de l'état et de l'appel d'appel. xxx


0 commentaires