# if/else verkürzen



## StevenPeter (19. Dez 2008)

Hallo,

wie kann ich diesen einfachen Vergleich von 3 Werten etwas verkürzen?


```
if(this.form == a.form)				
			if(this.form == b.form)		
				formpruef = true;
			else
				formpruef = false;
		else
			if(this.form != b.form)
				if(a.form != b.form)
					formpruef = true;
				else
					formpruef = false;
			else
				formpruef = false;
```

Nur da ich diesen vorgang mit 4 Eingenschaften nutzen muss würde ich gerne ein paar Zeilen sparen!

Danke für die Hilfe.
Gruß Steven


----------



## Ebenius (19. Dez 2008)

Ad hoc (ohne Gewähr und mit Wein):
	
	
	
	





```
formpruef = this.form == a.form && this.form == b.form || this.form != b.form && a.form != b.form;
```


----------



## stev.glasow (19. Dez 2008)

du kannst das auf 2 "eingenschaften " kürzen:

```
if(this.form == a.form)            
	formpruef = this.form == b.form
else
	formpruef = this.form != b.form && a.form != b.form
```

und wenn dir nicht zu unübersichtlich is alles in eine zeile schreiben:

```
formpruef = (this.form == a.form && this.form == b.form) || (this.form != b.form && a.form != b.form)
```
[edit]
ach man, selbst um 2 uhr kloppen wie uns noch um die einfachen antworten


----------



## Ebenius (19. Dez 2008)

Stevg, Ausklammern geht mit Wein nicht. Du gewinnen! 

BTW: Du hast Post!

// EDIT: Man beachte bei stevg's und meinem (ersten) Post:

*The main rules of optimization*

Rule 1: Don't do it.

Rule 2: _(For experts only)_ Don't do it yet.


----------



## stev.glasow (19. Dez 2008)

meins war falsch hatte das this.form == b.form irgendwo unterwegs liegen gelassen
[edit]
hehe


----------



## Ebenius (19. Dez 2008)

stevg hat gesagt.:
			
		

> meins war falsch hatte das this.form == b.form irgendwo unterwegs liegen lassen



Stevg, die Klammern kannste Dir eigentlich sparen. Wird auch nicht hübscher. :-D


----------



## stev.glasow (19. Dez 2008)

find schon - gibt nen übersichtlichekeits bonuspunkt


----------



## Ebenius (19. Dez 2008)

Hmm. Also für mich, rein optisch leimen die '&&' die Terme zusammen und die '||' trennen; damit denke ich da nie falsch. Aber da eselsbrückt jeder anders, Geschmackssache halt.

Wein alle, gute Nacht!


----------



## stev.glasow (19. Dez 2008)

ich mach teilweise sogar son quatsch:
(a == b && a != c ) && (h == 98 && k == -1)
mal etwas überspitzt gemacht - aber halt son bisschen gruppieren was zusammen gehört

nacht


----------



## Ebenius (19. Dez 2008)

*@OP*
Hilft Dir nicht das Auslagern in Methodne, um die if-Abfrage einfacher zu machen? Irgendwie sowas:
	
	
	
	





```
private static boolean equals(Object a, Object b) {
  return a == null && b == null || a != null && a.equals(b);
}

private static boolean needsCheck(Object myValue, Object valueA, Object valueB) {
  return equals(myValue, valueA) && equals(myValue, valueB)
        || !equals(myValue,  valueB) && !equals(valueA, valueB);
}

  // ... Dein Code
  formpruef = needsCheck(this.form, a.form, b.form);
```
Wenn ich mehrfach die gleiche Prüfung machen würde, würde ich's wahrscheinlich so machen. Dann wird der Code wesentlich besser lesbar.

(Code im Browser getippt. Tippfehler bitte selber beheben!)

Jetzt aber wirklich: schlafen. Gute Nacht! Ebenius


----------



## stev.glasow (19. Dez 2008)

unsere einzeilenlösung ist auch falsch:
folgendes beispiel
this.form ist gleich a.form und this.form ist ungleich b.form
das ergibt bei ihm false und bei unserer einzeilenlösung true

bei meiner 4zeilenlösung passt es aber.


----------



## Landei (19. Dez 2008)

Warum einfach, wenns auch kompliziert geht?

```
formpruef = (this.form == a.form) ? (this.form == b.form) 
  : (this.form != b.form) ? (a.form != b.form) : false;
```


----------



## maki (19. Dez 2008)

```
if(this.form == a.form)             
      if(this.form == b.form)       
          formpruef = true; 
      else if(this.form != b.form && a.form != b.form) 
               formpruef = true; 
else 
   formpruef = false;
```


----------



## Landei (19. Dez 2008)

@maki: Wenn dein Code richtig ist (zu faul zum Überlegen), kannst du das innere if noch zusammenfassen:

```
...
      if(this.form == b.form || (this.form != b.form && a.form != b.form))
               formpruef = true; 
...
```


----------



## Marco13 (19. Dez 2008)

Ihr wißt schon, dass man das auch einfach in ein Karnough-Veitch-Diagramm eintragen, die Primimplikanten suchen, und daraus dann die Disjunktive Normalform bilden kann?  :meld: (    )

```
/**
 * This methode returns ... [whether this complicated criterion is met ]
 * 
 * @return Whether this complicated criterion is met
 */
private boolean doThisWierdCheck()
{
    // 8 Zeilen leicht nachvollziehbarer Code
    ...
    // Oder optional: 1 Zeile schwer nachvollziehbarer code
}
```


----------



## Landei (19. Dez 2008)

```
...
   //oder optional: 1 Zeile leicht nachvollziehbarer Code
   ...
```


----------



## maki (19. Dez 2008)

> zu faul zum Überlegen


Geht mir genauso, KV Diagramme und Quine/Mccluskey sind lange her..


----------



## HoaX (19. Dez 2008)

Marco13 hat gesagt.:
			
		

> Ihr wißt schon, dass man das auch einfach in ein Karnough-Veitch-Diagramm eintragen, die Primimplikanten suchen, und daraus dann die Disjunktive Normalform bilden kann?  :meld: (    )



Las mich raten, du hattest gestern Weihnachtsfeier und das sind die Nachwirkungen des Restalkohols?


----------



## Marco13 (19. Dez 2008)

Nee, Weihnachtfeier ist heute - hab aber schonmal vogeglüht *hicks*  :autsch:  :wink:


----------



## Leroy42 (19. Dez 2008)

Marco13 hat gesagt.:
			
		

> Ihr wißt schon, dass man das auch einfach in ein Karnough-Veitch-Diagramm eintragen, die Primimplikanten suchen, und daraus dann die Disjunktive Normalform bilden kann?  :meld: (    )



LOL!


----------



## StevenPeter (19. Dez 2008)

Ach du lieber gott, ihr seit ja noch vollkommen eskaliert gestern nacht! Und ich dachte schon ich bin noch spät am programmieren! 

Danke erstmal, ich versuch aus eurem 



			
				stevg hat gesagt.:
			
		

> meins war falsch hatte das this.form == b.form irgendwo unterwegs liegen lassen



und 



			
				stevg hat gesagt.:
			
		

> unsere einzeilenlösung ist auch falsch:



jetzt mal was raus zu suchen das ich verstehe und das richtig ist 

Danke, danke!

lg SP


----------



## stev.glasow (19. Dez 2008)

find das am besten


			
				stevg hat gesagt.:
			
		

> ```
> if(this.form == a.form)
> formpruef = this.form == b.form
> else
> ...


bzw

```
formpruef = this.form == a.form? this.form == b.form: this.form != b.form && a.form != b.form
```
is das gleiche nur in unübersichtlich

was nen Karnough-Veitch-Diagramm is weiß ich nicht, denke die jungs ham schon wieder zu viel geraucht ^^


----------



## StevenPeter (19. Dez 2008)

Gudn,


```
formpruef = (this.form == a.form) ? (this.form == b.form) : (this.form != b.form) ? (a.form != b.form) : false;
```

funktionniert super! Vielen dank Landei, und natrürlich auch allen anderen!

Habe zwar paar Minuten zum verstehen gebraucht aber ist ja eingentlich ganz simpel.

Falls jemand die selbe Frage hat:



> Der Bedingungsoperator ist der einzige dreistellige Operator. Der erste Operand erwartet einen logischen Ausdruck, in dessen Abhängigkeit entweder der zweite oder dritte Operand zurückgeliefert wird. Im Falle des True - Wertes wird daher der erste Operand verwendet, ansonsten der zweite.
> 
> Das folgende Beispiel wird den zweiten Operanden ausgeben, da die Bedingung des ersten Operanden True ergibt.:
> 
> ...



lg SP


----------



## Marco13 (19. Dez 2008)

stevg hat gesagt.:
			
		

> was nen Karnough-Veitch-Diagramm is weiß ich nicht, denke die jungs ham schon wieder zu viel geraucht ^^



Eher zu wenig   Bin so un-entspannt   

Aber zum KV-Diagramm: Was ich da gesagt hatte, war ... richtig, und nicht komplett als Witz gemeint: Ein KV-Diagramm ist eine praktische Methode, um boolsche Ausdrück zu minimieren (Siehe http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm - einer der Längsten Wiki-Artikel, die ich bisher gesehen habe... ). Die verwendet man, um Erstsemestlern auf schmerzhafte Art beizubringen, wie man von Hand Schaltungen minimieren kann (in der Praxis nimmt man wohl eher andere Methoden - KV-Diagramme werden bei >4 Variablen unübersichtlich). 

Die gleiche Methode kann man auch verwenden, um boolsche Ausfrücke bei if-Abfragen zu vereinfachen. Paradoxerweise bringt das aber nicht so viel: Entweder man hat nur <= 4 Variablen - dann schreibt man's einfach übersichtlich hin, weils auf die paar Zeilen Code nicht ankommt, wenn man sie in eine Methode auslagert, oder man hat >4 Variablen, dann .... sollte man seinen Programmierstil überdenken :wink:


----------



## GermanPsycho (19. Dez 2008)

Entweder ich (Thread Opener) habe die Funktion übersehen oder ich konnte keinen Haken setzte da ich das Thread als Gast erstellt habe!

Wenn irgend ein Mod vorbeischaut wäre es nett den Haken zu setzen da hier die Frage ja mit verschiedenen Möglichkeiten nett beantwortet wurde!   :applaus: 

lg GP


----------



## maki (19. Dez 2008)

Marco13 hat gesagt.:
			
		

> Die gleiche Methode kann man auch verwenden, um boolsche Ausfrücke bei if-Abfragen zu vereinfachen. Paradoxerweise bringt das aber nicht so viel: Entweder man hat nur <= 4 Variablen - dann schreibt man's einfach übersichtlich hin, weils auf die paar Zeilen Code nicht ankommt, wenn man sie in eine Methode auslagert, oder man hat >4 Variablen, dann .... sollte man seinen Programmierstil überdenken


Bei mehr als 4 Variablen greift man zu Quine/McCluskey:
http://de.wikipedia.org/wiki/Verfahren_nach_Quine_und_McCluskey

Man bekommt zwar nicht immer die kürzestete Form, aber dafür lässt sich dieer Algo schön (rekursiv) als Programm abbilden.


----------



## Marco13 (19. Dez 2008)

Für Schaltungsminimierung ja :wink: (Oder die "Espresso"-Methode). Aber wenn man mitten im Porgrammierfluss auf einmal einen if-Ausdruck mit Quine-McCluskey vereinfachen will, macht man IMHO was falsch .... :wink:


----------



## maki (20. Dez 2008)

Marco13 hat gesagt.:
			
		

> Für Schaltungsminimierung ja :wink: (Oder die "Espresso"-Methode).



Lang lang ist's her...



> Aber wenn man mitten im Porgrammierfluss auf einmal einen if-Ausdruck mit Quine-McCluskey vereinfachen will, macht man IMHO was falsch .... :wink:


Hehe..


----------

