Laden...

Optimierung einer verschachtelten If-Anweisung

Erstellt von patrick.schultz vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.699 Views
P
patrick.schultz Themenstarter:in
2 Beiträge seit 2018
vor 6 Jahren
Optimierung einer verschachtelten If-Anweisung

Guten Tag zusammen,

ich habe immer wieder das Gefühl, das mein Code an "Unsauberkeit" kaum zu übertreffen ist.
Was natürlich nicht gerade für Übersicht sorgt. Daher die Frage, kann man den nachfolgenden Code nicht übersichtlicher bzw. kürzer gestalten?


            string programDataPath = @"C:\ProgramData\folder\";
            string programDataTempPath = @"C:\ProgramData\folder\Temp";
            string programDataTemplatePath = @"C:\ProgramData\folder\Template";

            if (!Directory.Exists(programDataPath))
            {
                Directory.CreateDirectory(programDataTempPath);
                Directory.CreateDirectory(programDataTemplatePath);
            } else if (!Directory.Exists(programDataTempPath) || !Directory.Exists(programDataTemplatePath))
            {
                if (!Directory.Exists(programDataTempPath))
                {
                    Directory.CreateDirectory(programDataTempPath);
                } else
                {
                    Directory.CreateDirectory(programDataTemplatePath);
                }
            } 

Beste Grüße,

Patrick

H
523 Beiträge seit 2008
vor 6 Jahren

Die if-Abfragen kannst Du komplett weglassen und einfach immer Directory.CreateDirectory aufrufen.

            string programDataTempPath = @"C:\ProgramData\folder\Temp";
            string programDataTemplatePath = @"C:\ProgramData\folder\Template";

            Directory.CreateDirectory(programDataTempPath);
            Directory.CreateDirectory(programDataTemplatePath);

Siehe auch MSDN

Any and all directories specified in path are created, unless they already exist or unless some part of path is invalid. If the directory already exists, this method does not create a new directory, but it returns a T:System.IO.DirectoryInfo object for the existing directory.

286 Beiträge seit 2011
vor 6 Jahren

Noch eine Ergänzung:
Wenn du nach if oder else nur eine Anweisung hast, kannst du dir die Klammern auch sparen. Das ändert zwar an der "systematischen Sauberkeit" des Codes wenig, macht ihn aber übersichtlicher/lesbarer:


                if (!Directory.Exists(programDataTempPath))
                    Directory.CreateDirectory(programDataTempPath);
                else
                    Directory.CreateDirectory(programDataTemplatePath);

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 6 Jahren

macht ihn aber übersichtlicher/lesbarer:

Ich behaupte das Gegenteil. Und jetzt?
Macht also - wie immer - wenig Sinn eigene Styles als Empfehlung für Generelles zu nennen.

Bei den meisten Open Source Projekten sind (bis auf throws am Methodenkopf) Klammern genau deswegen vorgeschrieben (Microsoft intern in den meisten Teams übrigens auch, siehe auch Microsoft GitHub Repos).
Zumindest ich/wir orientieren uns genau an solche sehr weit verbreiteten, wenn auch an ungeschriebene Gesetze.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo patrick.schultz,

wieso machst du dir nicht eine Methode, die das einfach prüft?

Du willst ja wohl einfach sicherstellen, dass die Ordner erstellt sind, oder?

Irgendwie sowas wie


public void EnsureDirectoryCreated(string directory)
{
	if (!Directory.Exists(directory))
	{
		Directory.CreateDirectory(directory);
	}
}

einfach mal runtergetippt hier im Editor. Die rufst du einfach auf und dann werden die Ordner erstellt.

Ist das eine Option? Finde ich lesbarer und die Klammern tun keinem weh 😉

Gruss

Coffeebean

16.842 Beiträge seit 2008
vor 6 Jahren

Macht ja kein Sinn, weil das Exists ja intern von CreateDirectory schon aufgerufen bzw. implizit durchgeführt wird.
Dadurch doppelst Du ja die Exists-Prüfung.

Und vom Naming her wäre es EnsureDirectoryExists :-)

P
patrick.schultz Themenstarter:in
2 Beiträge seit 2018
vor 6 Jahren

Hallo zusammen,

erstmal vielen Dank für die Antworten, ich bin überwältigt.

Was das Weglassen der Klammern betrifft, empfinde ich es ähnlich wie Abt.
Aber das ist ein subjektives Empfinden.

Jedoch hat mich der Vorschlag von Emmu dazu gebracht, darüber nachzudenken, ob es mit einem ? Operator nicht noch übersichtlicher wird. Das scheint so aber nicht zu funktionieren?


Directory.Exists(programDataTempPath) ? Directory.CreateDirectory(programDataTempPath) : Directory.CreateDirectory(programDataTemplatePath);

F
10.010 Beiträge seit 2004
vor 6 Jahren

Der ternäre operator macht nie etwas übersichtlicher.

Aber schau doch nochmal was du da programmiert hast ( ternäre op aufgedröselt ).


if( Directory.Exists(programDataTempPath) )
    Directory.CreateDirectory(programDataTempPath) : 
else
    Directory.CreateDirectory(programDataTemplatePath);

Macht doch keinen Sinn, oder?