2009-05-07 5 views
4

Ich kam vor kurzem auf einigen Code eingereicht mit dem folgendenBeispiele für nutzlos/Junk-Code und einfache Korrekturen

} catch (FooException e) { 
//do something 
} catch (BarException e) { 
//do something 
} catch (Exception e) { 
    throw e; 
} 

die als

leicht neu geschrieben wird
} catch (FooException e) { 
//do something 
} catch (BarException e) { 
//do something 
} 

und

if (!(flag == false)) 

, die leicht umgeschrieben wird als

if (flag) 

Was sind einige der häufigsten Junk-Code-Beispiele und der einfachere/klarere/weniger ausführliche Ersatzcode.

+0

Machen Sie dies zu einem Wiki und Sie haben mein upvote. Wenn nicht, hast du meine Schlussabstimmung. – Seb

+2

Ich programmiere seit mehr als einem Jahrzehnt in verschiedenen Sprachen und hasse immer wenn (flag). Persönliche Präferenz, aber ich finde if (flag == true) oder if (flag! = True) unendlich lesbarer und weniger anfällig für Tippfehler. Außerdem ist es repräsentativer für das, was die Linie eigentlich bedeutet. Schätze, das ist nur eine dieser Macken, die du aufnimmst, da ich andere Programmierer kenne, die möglichst wenige Charaktere sehen wollen. – Serapth

+0

@seb kein Problem – sal

Antwort

14
if (x == 1) 
    return true; 
else 
    return false; 

Rewrite:

return (x == 1); 
+11

Rewrite: Rückgabe x == 1; –

+0

Dies ist die häufigste Sache, kann nicht glauben, dass ich zu der Zeit nicht daran gedacht habe. Traurigerweise sehe ich das als "Return x == 1? True: false" umgeschrieben. die ganze Zeit – sal

4

Ihre Beispiele verschiedene Dinge tun.

Verwirft die ursprüngliche Ausnahme, erstellt eine neue Ausnahme im Kontext der aktuell ausgeführten Methode und löst diese aus. Die ursprüngliche Ausnahme wird verloren gehen. Das ist selten das, was Sie tun möchten, Ihr neu geschriebenes Beispiel ist besser.

+1

In welcher Sprache? Ich sehe keine neue Ausnahme, die hier erstellt wird. – Ken

+2

In C#. Es erzeugt nicht wirklich eine neue Ausnahme, aber es bläst den Kontext der ursprünglichen Ausnahme weg, insb. die Stapelverfolgung. –

+0

+1 - die ursprüngliche Ausnahmebehandlung war ein WTF und das Neuschreiben ändert was geworfen wird. Im richtigen Kontext kann das Original jedoch sinnvoll sein. –

2

Werfen Sie einen Blick auf alle Regeln, die statische Code-Analyse-Tools wie PMD und Findbugs verwenden.

+0

Das Problem damit ist, dass es so viele in der Findbugs-Bibliothek gibt, dass es wie das Durchsuchen des Telefonbuchs ist. – sal

0

ternärer Operator

dim str 
if(predicate) 
    str = "a" 
else 
    str = "b" 
end 

Rewrite

String str = iff(predicate, "a", "b") 
+2

Ich würde das als String str = "a" schreiben, persönlich. : b –

+2

Ihr "ternärer Operator" ist ein Funktionsaufruf. Wenn das z.B. C# oder Java oder jede andere Sprache, die eine eifrige Auswertung von Funktionsparametern verwendet, kann sich das Verhalten von if/else unterscheiden. –

+0

das ist ein VB ternary Operator, Freund – Daniel

1

Initialisierung mit dem Wert, wenn im Fall eines Null-Standard stattdessen verwendet wird.

Foo x = null;  
if(something != null) { 
    x = something; 
} else { 
    x = default; 
} 

=>

Foo x = something != null ? something : default; 

In Sprachen, in denen wenn ein experssion:

Foo x = if(something != null) something else default; 
+2

Ich würde viel lieber das Original sehen. Ihre neu geschriebene Version ist ziemlich schwer zu entschlüsseln. –

+1

Wenn dies C# ist, wäre eine präzisere Version, den Koaleszenzoperator Null zu verwenden: Foo x = etwas ?? Standard. –

+1

Warum nicht: Foo x = etwas; if (x == null) x = Standard; –

0
(bColour)?bColour=false:bColour=true; //could have done (i%2!=0)?bColour=true:bColour=false; 

statt:

bColour = !bColour; //could have done bColour=(i%2!=0); 

Ja, der Kommentar zum ursprünglichen Chaos war tatsächlich im Code, also korrigierte ich es auch.

+0

Ich mag keine Zuordnungen nach dem '?' in ternären Ausdrücken entweder –

3

C-String Manipulation im alten Stil scheint für viele Leute ein Bugaboo zu sein.

Ich habe zwei hier in meinem Emacs-Puffer.Beispiel 1:

strcpy(label, "\0"); 
strcpy(comm1, "\0"); //!!!20060818 Added protective code for missing nulls 
strcpy(comm2, "\0"); 
strcpy(dir, "\0"); 

Dies ist im Grunde eine Routine mit allen dazugehörigen Kopf ruft genau das zu tun:

label[0] = '\0'; 

Hier ist eine noch Phantasie Variante später im Code:

strncpy(inq.szComment, "\0", 1); 

Auch dies ist nur eine sehr aufwendige und langsame Art, dem ersten Element von inq.szComment das Nullzeichen '\ 0' zuzuweisen.

Beispiel 2:

// This is always good for string operations, but may not be necessary. 
strcat(RpRecPrefix, "\0"); 
strcat(RpCircPrefix, "\0"); 
strcat(RpEventPrefix, "\0"); 
strcat(RpFdk, "\0"); 
strcat(RpAic, "\0"); 
strcat(RpDcl, "\0"); 
strcat(RpVis, "\0"); 
strcat(RpSnd, "\0"); 
strcat(RpL3Fsi, "\0"); 
strcat(RpStartState, "\0"); 
strcat(RpContRun, "\0"); 

Diese finden die Nullen am Ende der ersten String-Parameter, und tun dann nichts. Ich kann nicht sagen, ob der Autor dachte, er würde sich davor schützen, keine abschließende Nul zu haben, oder wenn er dachte, dass das am Ende eine extra Null würde. Wie auch immer, er hat sich geirrt.

OK. Hier ist mein persönlicher Favorit.

if (*pnFrequency == 1) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 1 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 2) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 2 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 4) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 4 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 10) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 10 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 20) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 20 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 40) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 40 Hz", 
       *pliWriteRate); 
    } 
    else if (*pnFrequency == 60) { 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at 60 Hz", 
       *pliWriteRate); 
    } 
    else { // above frequencies used for analysis 
     sprintf(szLogMsg, "Write to disk speed = %d bytes/sec", *pliWriteRate); 
    } 

beachte, dass der Wert von * pnFrequency wir in jedem Zweig überprüfen, ist identisch mit dem Wert hart codiert in seine sprintf, und das ist der einzige Unterschied in jedem und jeden Zweig. Das Ganze hätte sein müssen:

sprintf(szLogMsg, "Write to disk speed = %d bytes/sec at %d Hz", *pliWriteRate, 
     *pnFrequency); 

ich einfach nur nicht vorstellen, wie diese Datei 12.000 Zeilen lang ...

+1

Hängen Sie an diese Datei, Sie haben einige echte Gewinner dort. –

+0

Nur zu erwähnen ... 'strcpy (label," \ 0 ")' könnte zumindest zu 'strcpy (label," ") vereinfacht werden. – JoelFan

1
List<String> list = new ArrayList<String>(); 
list.add("Foo"); 
list.add("Bar"); 

=>

List<String> list = Arrays.asList("Foo", "Bar"); 

sein bekam In welche Fallliste wäre unveränderlich. Wenn Sie das gleiche mit einem wandelbaren Liste erreichen wollen, erstellen Sie eine util Klasse:

public CollectionUtils { 
    public static List<T> createMutableList(T ... elements) { 
    List<T> list = new ArrayList<T>(); 

    for(T elem : elements) list.add(elem); 

    return list; 
    } 
} 

Und dann können Sie es verwenden:

import static CollectionUtils.createMutableList;  
List<String> list = createMutableList("Foo", "Bar"); 
+0

Nicht genau dasselbe. Sie können Elemente aus der Arrays.asList-Version nicht hinzufügen oder entfernen (was natürlich eine Verbesserung ist, aber immer noch ...). –

+0

Das ist ein guter Punkt, aber die Leute benutzen den ersten Weg, auch wenn sie nicht gebraucht werden. – egaga

3

Vor Linq:

for each listItem1 in list1 
    for each listItem2 in list2 
    if listItem1.value1 = listItem2.value2 
    listSimilarItems.add(listItem1) 
    end 
end 

Nach Linq :

listSimilarItems = (from items in list1 where list1.value1 = list2.value2).tolist 
8

Auf der Web-Seite von p rogramming, etwas, das ich oft sehen, ist die Verwendung von CSS-Regeln wie folgt aus:

<div class="red">Error message!</div> 

Mit dem red Stil definiert als:

red { color: #f00; } 

Nun, das ist dumm.Und dann, wenn sie entscheiden, dass die Fehlermeldung auch einen gelben Hintergrund Sie das sehen soll:

<div class="red yellowback">Error message 2.0!</div> 

Oder noch schlimmer:

<div class="yellowback"> 
    <h1 class="red">Error message 3.0!</h1> 
</div> 

Der richtige Weg, CSS zu verwenden, ist Ihren HTML in einem konstruieren semantisch korrekten Weg zuerst, und identifizieren Sie dann jedes Teil mit entweder 'id' oder 'class' Namen, so dass Sie jeden Abschnitt ausrichten und die entsprechenden Regeln anwenden können. Zum Beispiel:

<div id="errormessages">Error message!</div> 

Statt ein <div> Sie es einen Absatz machen könnten, so dass es die auffallen, auch ohne Stile (zB bei Verwendung eines Text-Browser):

<p id="errormessages">Error message!</p> 

Und die CSS-Regel :

#errormessages { 
    color: #f00; 
    background-color: #ff0; 
} 
Verwandte Themen