2

Ich habe diese if-else Anweisung, die was ich will. Was es macht, ist ziemlich einfach, wie Sie in der Lage sein sollten, zu erzählen.Neatest/idiomatische Art und Weise dies neu zu schreiben Wenn in C#

if (width != null && height != null) 
{ 
    if (top != null && left != null) 
    { 
     ret.type = VMLDimensionType.full; 
    } 
    else 
    { 
     ret.type = VMLDimensionType.size; 
    } 
} 
else 
{ 
    if (top != null && left != null) 
    { 
     ret.type = VMLDimensionType.positon; 
    } 
    else 
    { 
     ret.type = VMLDimensionType.unset; 
    } 
} 

Die enum bezeichnet wird, ist:

private enum VMLDimensionType 
{ 
    unset = 0, 
    full = 1, 
    size = 2, 
    position = 3 
} 

Es ist so einfach, das ich bin sicher, dass es eine viel mehr terse ist und lesbare Weise, dies auszudrücken.

NB Wenn es nicht für die lächerliche Regel "ein Klammer pro Zeile" wäre, die VS standardmäßig vorgibt, würde ich wahrscheinlich nicht so belästigt werden. ZB in VB könnte ich ungefähr 10 Zeilen von diesem Codeblock verlieren! (Alle Gedanken auf, dass als Nebenwirkung?)

+0

Wenn ich es nicht verzählt habe, würde die VB.NET Version 7 Zeilen kürzer sein, eine Version ohne Klammern 12 Zeilen. – Bobby

+0

Können Sie die 'VMLDimensionType'-Enumeration posten? Es könnte einfacher sein, wenn es ein Flags enum wäre. – Ani

+0

@Bobby Correctomundo :) –

Antwort

8

Eine Möglichkeit wäre, machen VMLDimensionType eine Flags Aufzählung:

[Flags] 
enum VMLDimensionType 
{ 
    Unset = 0, 
    Size = 1, 
    Position = 1 << 1, 
    Full = Size | Position 
} 

Und dann:

ret.Type = VMLDimensionType.Unset; 

if(width != null && height != null) 
    ret.Type |= VMLDimensionType.Size; 

if (top != null && left != null) 
    ret.Type |= VMLDimensionType.Position; 
+0

Hmm, muss ich vielleicht meine angenommene Antwort ändern :) Dies macht mehr Sinn, da die Enum die tatsächliche Logik widerspiegelt ... –

+0

Dies behandelt nicht "Full". –

+1

@cibacity Voll ist implizit, wenn Größe und Position beide festgelegt wurden. Das ist die Schönheit davon. Das logische "OR" macht dies möglich. –

5

Wie wäre es damit:

bool hasSize = width != null && height != null; 
bool hasPosition = top != null && left != null; 

if (hasSize && hasPosition) 
{ 
    ret.type = VMLDimensionType.full; 
} 
else if (hasSize && !hasPosition) 
{ 
    ret.type = VMLDimensionType.size; 
} 
else if (!hasSize && hasPosition) 
{ 
    ret.type = VMLDimensionType.positon; 
} 
else 
{ 
    ret.type = VMLDimensionType.unset; 
} 
+0

+1 Ich mag die Lesbarkeit, die diese Lösung bietet. Es ist immer noch ziemlich groß, aber das kann mich nur daran gewöhnen, dass ich mich an all diese geschweiften Klammern gewöhnt habe :) –

+0

@El Ronnoco Bei einzeiligen Anweisungen können Sie die Klammern entfernen - ich würde aber empfehlen, sie beizubehalten, da dadurch Änderungen in der Quellcodeverwaltung einfacher werden. und gibt dir eine definitive Gruppierung, die dein Auge überfahren kann. –

+0

@Will ja, als ich zuerst mit C# anfing, habe ich die Klammern für Single-Line-Codeblöcke weggelassen. Dann musste ich einige von ihnen zwei Zeile Code-Blöcke machen .... –

9
bool hasPosition = (top != null && left != null); 
bool hasSize = (width != null && height != null); 

if (hasSize) 
{ 
    ret.type = hasPosition ? VMLDimensionType.full : VMLDimensionType.size; 
} 
else 
{ 
    ret.type = hasPosition ? VMLDimensionType.positon : VMLDimensionType.unset; 
} 
+0

Codierung mit der geringsten Anzahl von Zeilen ist nicht die beste IMHO. Code mit weniger Zeilen mit einer klaren Lesbarkeit macht es zum Besten. Dieser passt die Rechnung. –

+0

+1 Ich mag es, schön und lesbar. Ein bisschen wie aus einer Tabelle zu lesen. Ähnlich wie andere, aber immer noch .. –

+0

Entschuldigung, ich habe meine angenommene Antwort zu Ani geändert, weil ich mag, wie sie das Enum die Logik dessen, was vor sich geht, reflektiert haben. –

1

Was dazu:

if(width != null && height != null) 
    ret.type = top != null && left != null ? VMLDimensionType.full : VMLDimensionType.size; 
else 
    ret.type = top != null && left != null ? VMLDimensionType.positon : VMLDimensionType.unset; 
+0

Ich habe Chibacitys Kommentar nicht gesehen, bevor ich gepostet habe :( – TJHeuvel

+0

Nun, es ist der kürzeste ... –

+0

+1 für den kürzesten! –

1

Ich möchte GetDimensionType() Methode extrahieren. Und machen Sie es nicht so klein, aber lesbarer und selbstbeschreibend.

private VMLDimensionType GetDimensionType() 
{ 
    bool hasSize = width != null && height != null; 
    bool hasPosition = top != null && left != null; 

    if (hasSize && hasPosition) 
     return VMLDimensionType.full; 

    if (hasSize) 
     return VMLDimensionType.size; 

    if (hasPosition) 
     return VMLDimensionType.positon; 

    return VMLDimensionType.unset; 
} 

Verbrauch:

ret.type = GetDimensionType(); 
+0

Woher kommen "oben, links, Breite" und "Höhe"? Oder werden sie als Mitglieder aufgerufen? –

+0

Ja, ich nehme an, das ist ein Mitglied eines Objekts. Wie auch immer, wenn sie nicht sind, können Sie sie als Parameter übergeben. –

+0

+1 für Mid-Function-Returns. Beachten Sie, wie schön sie die 'sonst wenn' aller anderen Lösungen in 'einfacher' verwandeln, wenn's. –

Verwandte Themen