Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von herbivore
Thema: Dateimuster-Strings (auch in Kombination) überprüfen und abfragen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Marcel,

sind alle Muster erlaubt, die man mit den Platzhaltern * und ? überhaupt bilden kann?

Also auch sowas wie *X???Y*?.*z* ?

Dann wäre z.B. A*.zip und *Z.zip erlaubt. Die bilden zwar nicht unbedingt Teilmengen voneinander, aber es kann trotzdem sein, dass beiden Muster auf einige Dateien gleichermaßen passen, z.B. auf AZ.zip. Wie soll damit verfahren werden?

Oder geht es dir wirklich nur darum, echt redundante Muster zu finden? Wie in deinem Beispiel, wo DHI*.zip echt redundant zu D*.zip ist.

herbivore

Thema: Wie kann ich das tschechische Alphabet zulassen (Eingabevalidierung)
Am im Forum: Grundlagen von C#

Hallo Kuklinski,

um Probleme mit Encodings zu vermeiden, die nicht alle (tschechischen) Zeichen enthalten, kann man auf die Regex-Notation \uxxxx ausweichen, siehe Escapezeichen in regulären Ausdrücken. Dann ist es egal, in welchem Encoding der Quellcode vorliegt und ebenfalls egal, welches Encoding der Compiler erwartet/verwendet, siehe auch /codepage (C# Compiler Options).

herbivore

Thema: Wie kann ich das tschechische Alphabet zulassen (Eingabevalidierung)
Am im Forum: Grundlagen von C#

Hallo chilic,

Zitat
Oder die Zeichen einzeln durchlaufen und prüfen. Das dürfte ich allen Punkten schneller sein ...
schneller oder langsamer sind beim Programmieren irrelevante Kategorien, solange das in Bezug auf die Geschwindigkeit eigentlich relevante Kriterium schnell genug erfüllt ist. Wenn die Validierung einer Benutzereingabe z.B. 0,1 Millisekunden dauert, dann ist es vollkommen unnötig, diese Zeit auf 0.01 Millisekunden zu verkürzen. Selbst Faktor 10 bringt einem in diesem Fall überhaupt nichts. Diesen Umstand beschreibt auch der Satz: "premature optimization is the root of all evil".

Solange "schnell genug" (d.h. üblicherweise "ohne spürbare Verzögerung") erfüllt ist, sind die eigentlichen Kriterien die Fehlerfreiheit und die Lesbarkeit.
Zitat
... als ein sehr komplexer Regex, also sowohl beim coden, beim späteren verstehen des Codes und auch bei der Ausführung.
Hier geht es nicht um einen sehr komplexen, sondern um einen wirklich simplen Pattern.

Doch auch unabhängig von der Komplexität der Pattern ist meine Erfahrung genau andersherum. Bei mir war Regex nicht nur deutlich leichter und schneller zu erstellen, sondern auch flexibler und immer deutlich leichter wartbar, gerade wenn die Aufgabe komplexer ist. Auch bei meiner Aufgabe im Programmierspiel kam dN!3L in seiner abschließenden Lösung zu einem ähnlichen Fazit:
Zitat von dN!3L
Wenn ich den Aufwand der ganzen Nacharbeiten noch mit dazurechne, sind reguläre Ausdrücke eindeutig einfacher erstellt und man findet Fehler schneller.

Ich persönlich habe noch an keiner einzigen Stelle bereut, Regex eingesetzt zu haben, egal wie einfach oder komplex die Aufgabe war, ganz im Gegenteil.

Man darf auch nicht vergessen, dass ein Pattern nur dann komplex wird, wenn die Komplexität schon in der Aufgabe steckt und dann ergibt auch das Ausprogrammieren komplexen - und meiner Erfahrung nach eben sogar noch komplexeren - Code.

herbivore

Thema: Wie kann ich das tschechische Alphabet zulassen (Eingabevalidierung)
Am im Forum: Grundlagen von C#

Hallo Kuklinski,

Zitat
Ich habe eine Methode in der ich nur das Deutsche [...] Alphabet zulasse.
wie sieht die Methode denn aus? Die Methode unten lässt ja nur das englische Alphabet zu. Für das Deutsche fehlen noch die Umlaute und das (normale) Eszett (und evtl. das neue große Eszett). Ich vermute, da hast du die (zusätzlich) erlaubten Zeichen auch einfach alle einzeln aufgelistet.

Ansonsten kannst du mal in Liste der Unicode-Eigenschaften schauen. In Unicode sind die Zeichen ja in Kategorien eingeteilt (wobei ein Zeichen durchaus in mehreren Kategorien enthalten sein kann). Auf Anhieb habe ich da keine Kategorie gesehen, die nur die Zeichen enthält, die du willst. Aber vielleicht findest du mit etwas Recherche in diese Richtung doch noch was.

Dabei ist diakritisch alleine allerdings keine ausreichende Unterscheidung, weil viele Alphabete bestimmte diakritische Zeichen enthalten. Die deutschen Umlaute sind ja auch nur bestimmte diakritische Zeichen. Du willst halt die diakritischen Zeichen, die im Tschechischen verwendet werden.

Wenn du viele verschiedene Alphabete unterstützen willst, und du mit den bestehenden Unicode-Kategorien nicht weiter kommst, dann wäre es vermutlich sinnvoll, eine eigene Tabelle zu auszubauen, in der zu allen überhaupt erlaubten Zeichen eingetragen ist, in welchen Alphabeten sie vorkommen, wobei jedes Zeichen in beliebig vielen Alphabeten vorkommen kann. Wenn du die Tabelle hast, kannst du leicht eine Methode schreiben, die zu einem übergebenen Alphabet(snamen) alle enthaltenen Zeichen liefert (als char [] oder als String). Aus dieser Rückgabe kannst du dann den jeweils gewünschten Regex-Pattern bauen.

herbivore

Thema: UML komposition oder aggregation?
Am im Forum: Smalltalk

Hallo zusammen,

klar hängt es letztlich von der konkreten Aufgabenstellung ab. Und wenn ich es mir jetzt nochmal genauer überlege, sind sicher sind Fälle denkbar, in denen genau das Sinn macht:

Zitat
Zuerst eine Eigenschaft setzten (Aggregation) und dann die Methode ZuendeAn ausführen ist wohl etwas umständlich ...

Nämlich wenn man so ein Art Streichholz-Domino-Day spielen will, also Streichhölzer erst lustig aneinander legt (ZuendetAn-Property) und dann erst später das Startstreichholz anzündet (ZuendeAn-Methode), so dass (möglichst) alle abbrennen. (*)

Dann wäre es Aggregation. Wenn man das Gebilde als Gesamtkunstwerk sieht, könnte es sogar Komposition sein.

Auch wenn das bedeutet, dass es keine einzige eindeutig richtige Lösung gibt, und dadurch kurzfristig vielleicht verwirrt, könnte mein Einwurf doch langfristig hilfreich sein, weil es auch im späteren Informatikerleben immer genau die verschiedenen Möglichkeiten und deren Vor- und Nachteile gegeneinander abzuwägen gilt.

herbivore

(*) Man könnte vielleicht noch eine Zündwahrscheinlichkeit setzen und dann mehrere Durchläufe spielen, um zu prognostizieren, wie viele Streichhölzer wohl abbrennen werden und wie viele nicht.

Thema: UML komposition oder aggregation?
Am im Forum: Smalltalk

Hallo zusammen,

also ich sehe hier ehrlich gesagt nichts von beidem. Aggregation und Komposition bedeutet ja in der Regel beides, dass die Klasse ein Member enthält, das auf die assoziierten Objekte verweist (Aggregation) oder diese enthält (Komposition) (*).

Klar könnte man sagen, dass das Streichholz wissen soll, welche anderen Streichhölzer es anzündet bzw. angezündet hat. Dann wäre es Aggregation und die Klasse Streichholz hätte ein Member angezuendeteStreichhoezer oder anzuzuendendeStreichhoezer.

Aber ist das hier wirklich das Gewünschte? Eigentlich würde man doch eher erwarten, dass es eine Methode ZuendeAn gibt, und die bekommt als Parameter, welche Streichhölzer angezündet werden sollen. Dann läuft die Beziehung (also allenfalls einfache Assoziation, aber weder Aggregation und erst recht nicht Komposition) locker über die Parameter der Methode, ganz ohne Member.

Bin ich gerade neben der Spur?

herbivore

(*) Auch wenn das beides technisch üblicherweise über eine normale Referenzvariable realisiert wird und der Unterschied nur darin liegt, wie die Variable im Code behandelt wird. Zum Beispiel dass bei Komposition Destroy für die Variable aufgerufen wird, wenn das umgebende Objekt destroyed wird und bei Aggregation nicht.

Thema: [Snippet] Prozess in existierender Kommandozeile starten
Am im Forum: .NET-Komponenten und C#-Snippets

Beschreibung:

Da ich es irgendwie immer wieder vergesse, was man tun muss, damit ein aus einem Kommandozeilenprogramm gestartetes anderes Kommandozeilenprogramm in der gleichen bzw. sogar derselben bestehenden Console läuft (die bestehende Console also an den neuen Prozess vererbt wird), schreib ich es hier mal auf (für mich und natürlich auch für andere). Es ist ganz einfach: UseShellExecute = false ist der Schlüssel (und nicht CreateNoWindow o.ä., worauf ich immer reinfalle).

Es ist auch nicht nötig, RedirectStandardOutput o.ä. zu verwenden, was neben Problemen mit Puffer und Flush, auch den Nachteil hat, dass etwaige Positionierungsanweisungen und/oder Farben in der Ausgabe verloren gehen, da beim Redirect nur der reine Text übertragen werden würde.

Mit dieser Methode startet man den neuen Prozess in der bestehenden Console:


public static int StartProcessSync (String cmd, String parms)
{
   var p = new Process ();
   p.StartInfo = new ProcessStartInfo (cmd, parms);
   p.StartInfo.UseShellExecute = false;
   p.Start ();
   p.WaitForExit();
   return p.ExitCode;
}

Das WaitForExit sorgt dafür, dass der alte Prozess erst weiter lauft, wenn der neue beendet ist, also insbesondere erst dann, wenn er seine Ausgabe beendet hat. So kommen sich die beiden Prozesse nicht in die Quere. Und per ExitCode kommt man auch noch "gratis" an den Rückgabecode des aufgerufenen Prozesses.

Schlagwörter: Prozess, Process.Start, starten, erzeugen, ausführen, Console, Consolenprogramm, Kommandozeile, Kommandozeilenprogramm, Kommandozeilen-Programm, existierende, existierenden, bestehende, bestehenden, selbe, selben, gleiche, gleichen, same, geerbte, geerbten, erben, erbende, erbender, inherit, inherited

Thema: [gelöst] RegEx: eine Art 'exakte' Suche
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo dannoe, hallo Trekki1990,

Q-A[^-] verlangt, dass auf A auf jeden Fall noch ein Zeichen folgt (das kein Bindestrich ist). Das ist beim zweiten gewünschten Match nicht der Fall.

Gewünscht ist, dass hinter dem A kein Bindestrich steht (egal, ob überhaupt noch etwas danach steht oder eben nicht).

Und das geht mit Q-A(?!-) also einem negativen Lookahead auf einen Bindestrich.

Oder man gibt, wie Palladin007 vorschlägt, einfach (positiv) an was folgen soll.

herbivore

PS: Ich weiß nicht, ob man mit regex101.com on-the-fly testen kann; mit On-the-fly Regex-Tester: Regex-Lab geht das. Das vereinfacht das Testen deutlich.

PPS: Auch bei Regex gilt DRY. Also z.B. statt

    (Q-A) - \w+|(Q-A)$
besser
    Q-A( - \w+|$)
    ggf. kombiniert mit RegexOptions.ExplicitCapture
oder
    Q-A(?: - \w+|$)

Thema: Sticky/Thread für ASP.NET Core 2.0
Am im Forum: Wünsche und Kritik

Hallo emuuu,

das wichtigste ist erstmal, dass so ein Thread überhaupt erstellt wird. Und das kann m.E. nur jemand, der sich mit gerade dem Thema beschäftigt hat. Da bist du in der Tat wohl der beste Kandidat. Du hast das frische Wissen und siehst den Bedarf, bringst also auch gleich die nötige Motivation mit.

Aus meiner Sicht kannst du den Thread einfach erstellen. Der muss nicht gleich perfekt sein, denn pflegen kannst du ihn auch, weil man eigene Beiträge auf myCSharp.de beliebig lange nach der Erstellung editieren kann - genau für solle Fälle. Technisch gesehen können auch die Mods und Admins editieren, falls jemand anderes später Ergänzungen liefert oder bestehe Links irgendwann tot sind. Die Mods und Admins können den Thread auch in die FAQ verschieben oder sticky machen.

Wenn du dich nicht in der Lage siehst, den Thread ganz alleine zu erstellen, dann mach erstmal einen Thread auf, in dem du um Vorschläge bittest und in dem dann die Vorschläge erstmal gesammelt werden.

Mit anderen Worten: Kaum hat einer eine gute Idee, schon muss er sie umsetzen. :-)

herbivore

Thema: Mehrfach Beiträge erstellen ist, innerhalb von 120 Sekunden, nicht erlaubt.
Am im Forum: Wünsche und Kritik

Hallo Killerkrümel,

die Einstellung wirkt bei Beiträgen des gleichen Users, egal wo diese gepostet werden ... und das ist auch gut so. Wenn dir innerhalb von weniger als zwei Minuten einfällt, dass du in einem Beitrag etwas vergessen hast, ist es spricht ohnehin viel dafür, diesen zu editieren (hierbei gibt es keine Wartezeit), als noch einen Beitrag hinterher zu schieben. Willst du unbedingt einen Beitrag hinterher schieben, musst du eben den nötigen Moment warten.

Wenn keiner Anzeichen für einen Fehler hat und die Meldung tatsächlich - wie beabsichtigt - nur kommt, wenn die Wartezeit unterschritten wird, reden wir hier aber ohnehin über etwas, was offensichtlich kein Problem ist. Und was keine Änderung erfordert. Auch keine Verkürzung der Wartezeit.

herbivore

Thema: Suche geeignetes Projekt zum Einstieg
Am im Forum: Smalltalk

Hallo Arno,

schau bitte zunächst alle Threads aus [FAQ] C# Projektvorschläge (Anfänger, Schüler, Praktikanten) durch.

Falls du wider Erwarten nicht fündig wirst, schreib bitte, warum dir keines der Projekte gefallen hat.

herbivore

Thema: Mehrfach Beiträge erstellen ist, innerhalb von 120 Sekunden, nicht erlaubt.
Am im Forum: Wünsche und Kritik

Hallo p!lle,

dann hattest du heute vielleicht zuviel Energydrink. :-)

War denn auch wirklich jeweils weniger als 120 Sekunden vergangen? Wenn du heute wirklich nur ausnahmsweise so schnell warst, gibt es ja kein echtes Problem.

herbivore

Thema: Mehrfach Beiträge erstellen ist, innerhalb von 120 Sekunden, nicht erlaubt.
Am im Forum: Wünsche und Kritik

Hallo p!lle,

ja, die Einstellung gibt es schon sehr lange, ohne dass ich mich an irgendwelche Beschwerden erinnern kann. Das zeigt, dass es keine oder zumindest keine ernsthaften Probleme damit gibt.

Die Einstellung verhindert, dass das Forum böswillig (und z.B. automatisiert) mit Beiträgen geflutet wird und ist daher geboten.

Meiner Erfahrung nach braucht man normalerweise mehr als zwei Minuten, um einen Beitrag zu lesen und zu beantworten. Falls ausnahmsweise mal nicht, muss man kurz warten.

herbivore

Thema: Wie einem Nicht-ITler den Sinn und Nutzen von Code-Refactoring erklären
Am im Forum: Smalltalk

Hallo HeikoAdams,

ich würde das am ehesten mit einer Verkabelung vergleichen, die im Laufe der Zeit gewachsen ist. Das kann z.B. eine Telefonverkabelung zu Beginn des Telefonzeitalters in einem großen Haus sein, dessen Mieter nach und nach Telefon bekommen haben. Immer wenn ein neuer Anschluss dazu kommt, wird ein neues Kabel über die vorhandenen gelegt. Irgendwann ist das ein großer Wust, durch den keiner mehr durchblickt. Es wurde in dem Sinne nichts falsch gemacht und es funktioniert auch, aber man kann die Verkabelung kaum noch verstehen und Reparaturen, Änderungen und Erweiterungen werden immer aufwändiger. Deshalb installiert man einen ausreichend dimensionierten Schaltkasten und legt man die Kabel darin noch mal ordentlich, schön parallel, rechtwinklig und weitgehend kreuzungsfrei. Nun funktioniert es - wenn man keine Fehler gemacht hat - immer noch so wie vorher, nicht besser als vorher, aber jetzt ist alles viel übersichtlicher, verständlicher und leichter zu reparieren/warten.

Als man mit der Verkabelung angefangen hat, hat man es auch so gut wie möglich gemacht, aber hat man vieles einfach noch nicht gewusst. Die Auswirkungen mancher Entscheidungen nicht überblickt. Künftige Anforderungen nicht kommen gesehen. Erst wenn das Ergebnis und eben auch das Chaos da ist, sieht man die Wege, wie man es besser machen kann.

herbivore

Thema: Interessante Features aus Kotlin, die sich auch C# gut machen würden
Am im Forum: Rund um die Programmierung

Hallo zusammen,

Zitat von herbivore
In der nächsten c't gibt es den zweiten Teil des Artikels. Wenn dort weitere interessante Features vorgestellt werden, werde ich berichten.
ich hab den zweiten Teil schon vor einiger Zeit gelesen, eigentlich nur überflogen. Die dort vorgestellten Feature fand ich nicht so überzeugend, teilweise sogar unpassend bzw. kontraproduktiv. Ich habe aber nicht die Zeit gefunden das näher auszuführen. Falls jemand anders den zweiten Teil gelesen hat und darin Features gefunden hat, die er interessant fand, kann er das gerne schreiben.

herbivore

Thema: Humor: Java Programmierer ... und andere lustige Sachen
Am im Forum: Smalltalk

Hallo zusammen,

heute bin ich zufällig auf einen tiefsinnigen Cartoon zum Thema KI ([EDIT]der Link geht mittlerweile leider auf einen ganz anderen Cartoon[/EDIT]) gestoßen, den ich euch nicht vorenthalten möchte.

herbivore

Thema: Wo Lizenzhinweise hinterlegen
Am im Forum: Smalltalk

Hallo d.jonas,

bei der Entscheidung, wo und wie deutlich du auf Fremdbibliotheken du hinweist, würde ich mich an deiner Stelle in die Lage eines Programmierers einer Fremdbibliothek versetzen. Als solcher hast du viel Aufwand und Zeit in die Bibliothek gesteckt und möchtest deine Mühe bestimmt gerne ernsthaft gewürdigt wissen. Du willst dann sicher nicht, dass es so wirkt, als wären die Lizenzhinweise eine lästige Pflicht oder als wäre es darum gegangen, die Lizenzhinweise in der hinterste Ecke zu verstecken.

Klar, Rechtssicherheit erlangst du nur durch ein Gutachten eines erfahrenen Fachanwalt. Wenn du es jedoch so machst, dass jeder Fremdbibliotheksanbieter den Eindruck bekommt, dass du seine Arbeit als ernsthaft gewürdigt hast, dann wird er kaum wegen irgendwelcher möglicherweise nicht erfüllten formalen Aspekte rechtlich gegen dich vorgehen (die können besseres mit ihrer Zeit anfangen). Und nicht verklagt zu werden ist viel wichtiger, als in einem (langen und teuren) Prozess am Ende Recht zu bekommen.

herbivore

Thema: (Deutsche) sprechende Zahlen
Am im Forum: .NET-Komponenten und C#-Snippets

Hallo emuuu,

die Unterstützung für negative Zahlen wäre doch ganz einfach zu realisieren. Falls die Zahl negativ ist, könnte man "Minus " + GetZahlenname (-zahl) zurückgeben. Nur für int.MinValue müsste man noch eine Sonderbehandlung einbauen, weil -int.MinValue außerhalb des Wertebereichs eins int liegt (es würde jedoch innerhalb des Wertebereichs eines longs und erst recht Decimals liegen).

Generell könntest du überlegen, ob du den Wertebereich nicht gleich auf long und/oder sogar Decimal ausweitest. Das löst zwar das MinValue Problem nicht, aber zumindest die Erweiterung auf long kostet sehr wenig und behebt eine unnötige Einschränkung.

Zitat
würde ich dem ganzen ein Math.Round(x, 2) vorschalten und die Nachkommastelle auch als ganze Zahl übersetzen (nicht wissenschaftliche Aussprache).

Ich würde den Benutzer bestimmen lassen, wie viele Nachkommastellen er ausgegeben haben will und auch wie er die Nachkommastellen ausgegeben haben will, also als Zahl oder Ziffernfolge.

herbivore

Thema: Freiwillige, anonyme Umfrage zum Thema DevOps
Am im Forum: Smalltalk

Hallo Abt,

ich hab mal irgendwo gelesen, dass Links in Twitter-Nachrichten in der ersten halben Stunde öfter angeklickt werden, als in der ganzen Zeit danach. Das scheint sich auf dein Umfragelink übertragen zu lassen. Ich halte es also für fraglich, ob du die hundert voll bekommst, egal wie lange du wartest, zumindest wenn du keine neuen Benutzer von anderen Plattformen einbeziehen willst. Aber das ist natürlich nur (m)eine Vermutung.

herbivore

Thema: Problem mit FileInfo.LastWriteTime
Am im Forum: Rund um die Programmierung

Hallo zusammen,

das Problem hat mich gerade nochmal eingeholt. Es ist wohl doch etwas anders als in meinem Kommentar oben beschrieben.

Nach meinen aktuellen Versuchen scheint 'dir' immer den aktuellen Zeitzonenoffset auf die eigentlich als UTC gespeicherte Zeit zu addieren, egal welcher Zeitzonenoffset zum Zeitpunkt der letzten Änderung gültig war. Also während der deutschen Winterzeit +1 und während der deutschen Sommerzeit +2. Das bedeutet, dass 'dir' für ein und dieselbe Datei eine um eine Stunde abweichende Zeit anzeigt, je nachdem, ob man 'dir' im Winter oder im Sommer aufruft.

Nehmen wir an, es gibt zwei Dateien, eine zuletzt im Sommer geändert und eine im Winter und zwar jeweils um 14:00 in der zum Änderungszeitpunkt geltenden Zeitzone. Die im Dateisystem gespeicherte UTC-Zeit ist im Sommer um zwei Stunden niedriger (also 12:00 UTC) und im Winter nur eine Stunde niedriger (also 13:00 UTC).

'dir' addiert im Sommer aufgerufen nun pauschal zwei Stunden auf die gespeicherte UTC-Zeit und zeigt folgendes an:

11.07.2017  14:00                 0 sommer.txt
11.01.2017  15:00                 0 winter.txt

'dir' addiert im Winter aufgerufen nun pauschal eine Stunde auf die gespeicherte UTC-Zeit und zeigt folgendes an:
11.07.2017  13:00                 0 sommer.txt
11.01.2017  14:00                 0 winter.txt

Wenn man nun die Zeit haben möchte, die 'dir' aktuell anzeigt, muss man also auf die UTC-Zeit eine Stunde addieren, wenn aktuell die deutsche Winterzeit gilt, und zwei Stunden, wenn aktuell die deutsche Sommerzeit gilt.

Das ist natürlich sehr unbefriedigend, denn wenn ich eine Datei um 14:00 geändert habe, dann möchte ich, dass immer 14:00 angezeigt wird, egal wann ich 'dir' aufrufe.

Also eigentlich sollte die Anzeige Sommers wie Winters lauten:
11.07.2017  14:00                 0 sommer.txt
11.01.2017  14:00                 0 winter.txt

Aber immerhin weiß ich nun wie 'dir' rechnet und kann somit das Verhalten nachahmen/nachbilden.

herbivore

Thema: Interessante Features aus Kotlin, die sich auch C# gut machen würden
Am im Forum: Rund um die Programmierung

Hallo Sir Rufo,

Zitat
Das Beispiel funktioniert so gar nicht und wenn, dann würde es ein int liefern.
richtig!
Zitat
So eine Umstellung halte ich nicht für gut.
Der Vorschlag ist alt (um nicht zu sagen veraltet) und war auch damals nur ein Gedankenspiel im Zusammenhang mit der Einführung des Null-conditional operator in C#. Der Ansatz von Kotlin, null gar nicht erst zuzulassen, ist da tatsächlich viel konsequenter. Dann fliegt auch keine NRE, aber weil gar keine entstehen kann.


Hallo Palladin007,

ok, ich glaube, den Vorschlag kannte ich nicht. Hätte durchaus was für sich.

herbivore

Thema: Interessante Features aus Kotlin, die sich auch C# gut machen würden
Am im Forum: Rund um die Programmierung

Hallo zusammen,

mir wäre lieb, wenn wir den Ausflug in F# hier beenden und wieder zu Kotlin (und C#) zurückkehren könnten.


Hallo Palladin007,

ich weiß nicht, ob du vielleicht das meinst, was ich in C# 6 - Übersicht der Neuigkeiten vorgeschlagen hatte:

Zitat von herbivore
Der Null-conditional operator ist praktisch. Eigentlich sogar so praktisch, dass man überlegen könnte, das Verhalten zum Standard zu machen, wenn das denn nicht ein Beaking Change wäre. In den wenigen Fällen, in denen tatsächlich eine NullReferenceException geworfen werden soll, könnte man die "umgekehrte" Syntax einführen:

int length = customers!.Length;

Diesen Vorschlag habe ich aber nur auf myCSharp.de gemacht und nirgends eingereicht. Um zu verhindern, dass es ein Beaking Change wäre, könnte man das Default-Verhalten über eine neue Compiler-Option steuern. Ich vermute, dass sowas in C# trotzdem nicht kommt.

herbivore

Thema: Interessante Features aus Kotlin, die sich auch C# gut machen würden
Am im Forum: Rund um die Programmierung

Hallo zusammen,

ich habe gerade in der neuen c't 15/17, S. 164 einen Artikel über die Programmiersprache Kotlin gelesen, die wohl von Java abstammt und daher auch Ähnlichkeiten zu C# hat.

Kotlin hat durchaus einige interessante Features:

  • generelles Verbot von null-Referenzen (das explizit aufgehoben werden kann und muss, um null zu verwenden)
  • switch erlaubt beliebige boolschen Bedingungen
  • fast alles kann als Ausdruck verwendet werden, z.B. auch if
  • Wenn im if eine Variable mit is auf einen bestimmten Typ geprüft wird, betrachtet der Compiler die entsprechende Variable im Then-Teil automatisch als von diesem Typ.

Ansonsten gibt es noch eine Reihe weiter Verbesserungen gegenüber Java, die aber C# auch schon enthalten sind, z.B. Properties statt getter und Erweiterungsmethoden. Andersherum gibt es aber eben auch eine Reihe von Verbesserungen, die (noch) nicht in C# enthalten sind, z.B. die oben genannten.

Die Motivation für die Entwicklung von Kotlin waren wohl genau solche Produktivitätsverbesserungen gegenüber Java.

In der nächsten c't gibt es den zweiten Teil des Artikels. Wenn dort weitere interessante Features vorgestellt werden, werde ich berichten.

Hat jemand von euch schon Erfahrungen mit Kotlin gesammelt? Und wenn ja, wie sind diese ausgefallen?

herbivore

Thema: Komplexe lange Methode mit vielen If's besser strukturieren
Am im Forum: Rund um die Programmierung

Hallo LaTino,

vorne weg: ich bin grundsätzlich ein Freund von solchem Infrastruktur-Code, wie du ihr hier vorschlägst und schätze um seine Vorteile. Insbesondere die Vermeidung von Redundanz und die Möglichkeit eines zentralen Eingriffs, z.B. beim Loggen und Debuggen. Ich habe in meinem Beitrag nur gesagt, dass es einige, ganz wenige Fälle gibt, in denen sich kaum etwas verbessern und sich insbesondere die Code-Menge nicht nennenswert reduzieren lässt.

Natürlich kommt es nicht nur auf die Code-Menge an, wenn es um Lesbarkeit und Verständlichkeit geht. In den allermeisten Fällen verbessert eine Strukturierung die Lesbarkeit.

Im konkreten Fall reden wir laut dem Thread-Ersteller über eine sehr umfangreiche Funktionalität, die eben keine erkennbare Struktur hat und die letztlich einfach vollständig ausgeführt werden muss. Klar gibt in dem Code ifs, aber auf Ebene der Abschnitte, die in den einzelnen Methoden ausgelagert wurden, muss jeder dieser Abschnitte durchlaufen werden. Und auch wenn man vielleicht Abschnitte theoretisch vertauschen könnte, entscheidet man sich hier wohl für eine sinnvolle Reihenfolge und durchläuft die Abschnitte sequentiell.

Das ist ein sehr einfach zu verstehendes Konstrukt. Insbesondere, wenn man - wie vorgeschlagen - die Abschnitte durch Kommentare nicht nur erklärt, sondern auch kennzeichnet und damit voneinander abgrenzt. Trotzdem bleibt die (Meta-)Message, dass alle Abschnitte durchlaufen werden müssen im Code zu erkennen.

In einem solchen - wie gesagt - seltenen Fall kann es tatsächlich sein, dass alle Änderungen - egal wie gut sie gemeint sind - die Lesbarkeit verschlechtern, weil eben die Botschaft, "Ja, es ist viel Code, aber es hilft eben nichts, alles und muss ausgeführt werden", verloren geht. Und weil dieser an sich einfache Aufbau schlimmstenfalls durch eine aufgezwungene Struktur zerfasert und/oder verschleiert wird.

Ich hatte schon Fälle, in denen ich mich vor lauter Struktur gefragt habe, was denn eigentlich letztlich passiert. Zerfaserte Strukturen können - und mehr will ich gar nicht sagen - die Lesbarkeit und Verständlichkeit auch erschweren. Nicht umsonst gibt es dass KISS-Prinzip.

Natürlich ist KISS kein Freibrief einfach immer allen Code einfach sequentiell hintereinander zu schreiben. Und normalerweise wird sich es fast von alleine anbieten, Code in einzelne kleine Methoden auszulagern und es werden sich sinnvolle Namen für diese Methoden geradezu aufdrängen. Dann sollte man das natürlich auch entsprechend strukturieren.

Doch wenn sich nach gründlicher Prüfung einfach keine redundanten Stellen finden lassen und sich auch keine halbwegs passenden Namen für einzelne Methoden anbieten, dann kann das lesbarste durchaus auch mal ein größere Methode sein. Lang bedeutet in einigen bestimmten Fällen nicht automatisch komplex oder schwierig zu verstehen.

Möglicherweise würde man, wenn man sich den konkreten Fall im Detail anschaut, doch noch Redundanzen und doch noch sprechende Methodennamen (die natürlich für eine Aufteilung sprächen) finden, denn unbefriedigende Fälle, die sich allen Verbesserungsversuchen widersetzen, sind wirklich selten.

Doch es gibt eben auch ein paar wenige Fälle, wo mehr Struktur die Sache nicht besser macht, manchmal sogar im Gegenteil.

Es geht also gerade nicht um ein Pauschalurteil, dass nur reduzierte Codemenge es leichter macht. Was jeweils für ein Fall vorliegt, muss natürlich jeder einzelne für sich entscheiden.

herbivore

Thema: Komplexe lange Methode mit vielen If's besser strukturieren
Am im Forum: Rund um die Programmierung

Hallo Unfug,

so schön die Objektorientierung in dem allermeisten Fällen ist, in bestimmten Situationen kommt sie einfach an ihre Grenzen.

Das scheint hier so ein Fall zu sein, in dem es nur begrenzt Verbesserungsmöglichkeiten gibt.

Mir fällt es zwar auch schwer, wenn ich in eine solche Situation kommt, es auszuhalten, dass es nicht viel besser geht, aber im Grunde bleibt einem kaum was anderes übrig.

Insbesondere bleibt am Ende manchmal die Erkenntnis, dass keine Umstrukturierung die Code-Menge und die prinzipielle Code-Komplexität nennenswert ändert und schon gar nicht reduziert. Jede Umstrukturierung es also letztlich niemanden einfacher macht, den Code zu verstehen.

Natürlich kann eine Aufteilung in einzelne Methoden bestehende Abhängigkeiten aufzeigen und begrenzen, etwa wenn eine Variable in der großen Methode an vielen verschiedenen Stellen verwendet wird/wurde. Wenn diese Abhängigkeiten aber unvermeidbar sind, weil der Variablenwert eben wirklich an vielen verschiedenen Stellen benötigt wird, dann kann eine Aufteilung zu langen Parameterlisten der einzelnen Methoden führen, was es nicht wirklich besser macht oder im schlimmsten Fall sogar schlechter.

Es kann also in solchen Ausnahmefällen - und damit meine ich wirklich nur in solchen wenigen(!), gut durchdachten Ausnahmefällen durchaus Sinn machen, es bei der einen großen Methode zu belassen, und die Energie, die man für das Refactoring aufzuwenden bereit ist/wäre, lieber darein zu investieren, die Methode ausführlich und gut zu kommentieren/dokumentieren.

Zumal eine große Methode die (Meta-)Message klar(er) transportiert, dass wirklich alles nötig ist und alles immer durchlaufen werden muss, und es sich gerade nicht um einzelne Bauteile handelt, die man nach Belieben auswählen kann.

herbivore

Thema: Wer Leerzeichen zum Einrücken von Code verwendet, verdient mehr!
Am im Forum: Szenenews

Hallo Community,

der "Krieg" ist ja so alt, wie das Programmieren selbst: Soll man Code mit Leerzeichen oder mit Tabs einrücken? Jetzt gibt es eine ultimative Antwort: Wer Leerzeichen zum Einrücken von Code verwendet, verdient mehr! (*)

Hier gehts zur Untersuchung: Developers Who Use Spaces Make More Money Than Those Who Use Tabs

Ich hab ja schon immer gewusst, dass Leute, die Leerzeichen verwenden, die besseren Menschen sind :-) (**)

Ok, jetzt wieder im Ernst. Das sollte keine Polemik sein, sondern einfach nur ein bisschen Spaß und die Einstimmung auf die folgenden interessanten Überlegungen! Vor allem möchte ich hier gerade keinen Krieg entfachen. Was allerdings nichts an den Ergebnissen ändert. Der Knackpunkt ist natürlich - wie immer - die Interpretation. Und erst dann zeigt sich, was die eigentliche Erkenntnis aus dieser und anderen Studien ist.

Und da muss man den Erstellern der Studie ein Kompliment machen. Sie unterscheiden klar zwischen Korrelation und ursächlichem Zusammenhang. Das kann man nämlich nicht oft genug sagen: Nur weil Daten korrelieren muss es noch lange keinen ursächlichen Zusammenhang geben.

Ein Beispiel: Wenn es heißt, dass sportliche Menschen länger leben, dann bedeutet das eben nicht automatisch, dass man einfach nur mehr Sport machen muss und dann länger lebt. Denn oft ist es so, dass Menschen, die regelmäßig Sport machen, auch sonst gesünder leben, insbesondere weniger rauchen. Und dass es einen ursächlichen Zusammenhang zwischen Rauchen und Lebenserwartung gibt, sollte mittlerweile ausreichend gesichert und bekannt sein.

Obwohl nun Sport und Lebenserwartung korrelieren, wenn man die Gruppe der sportlichen und der unsportlichen Menschen vergleicht, kann der ursächliche Zusammenhang eben ganz überwiegend darin liegen, dass in der ersten Gruppe weniger Raucher sind.

Wenn man nun seine Lebenserwartung erhöhen will, ist es wichtig, etwas zu tun, was ursächlich darauf einwirkt. Reine Korrelation reicht nicht. Also konkret würde ein Raucher, der anfängt Sport zu machen, vermutlich am Ziel vorbei gehen. Er würde wohl viel mehr erreichen, wenn er mit dem Rauchen aufhört, selbst wenn er weiterhin keinen Sport macht.

Bevor ihr das Sportbeispiel jetzt argumentativ zerfetzt, lest bitte erst weiter. Im Beispiel bleibt natürlich der Zweifel, ob Sport nicht auch für sich etwas positives für die Lebenserwartung bewirkt. Korrelation kann natürlich auf einem ursächlichen Zusammenhang basieren, nur ist es eben überraschend oft anders. Wichtig ist zu gucken, ob hinter einer Korrelation auch tatsächlich ein ursächlicher Zusammengang steckt oder es sich nur um eine zufällige oder indirekte Koinzidenz handelt. Sonst kann man mit seinen abgeleiteten Handlungen böse auf die Nase fallen. Machen wir ein klareres Beispiel:

Man betrachtet eine große Gruppe von verschiedenen Personen, die Nägel mit dem Hammer in Holz schlagen und stellt fest: je lauter diese dabei schreien, desto tiefer dringt der Nagel mit jedem Schlag in Holz. Lautstärke korreliert also mit Schlagtiefe. Aber deshalb gibt es - wie mal leicht einsieht - noch lange keinen ursächlichen Zusammenhang zwischen Lautstärke und Schlagtiefe.

Jemand, der sich sagt, ich schlage einfach weiter wie bisher, schreie dabei aber einfach (bewusst) lauter, wird keine besseren Ergebnisse erzielen. Andersherum wird jemand, der (bewusst) das Schreien unterdrückt, den Nagel trotzdem genauso tief ins Holz bringen, wenn er denn genauso kräftig schlägt.

Das Schreien ist hier eher die Folge des kräftigen Schlagens, keinesfalls seine Ursache und erst recht nicht die Ursache der Schlagtiefe.

Im Extremfall wird jemand, der die (vermeintliche) Erkenntnis der Studie wörtlich nimmt, scheitern, nämlich wenn er zu dem (falschen) Ergebnis kommt, dass er das lästige und anstrengende Schlagen ganz einstellen kann, da es laut Studie "offensichtlich" auf die Lautstärke des Schreiens ankommt. Er steht dann ohne Hammer schreiend neben dem Nagel und wundert sich, dass der erwünschte und erhoffte Erfolg nicht eintritt.

Es ist verblüffend, wie oft Leute genau das tun, wenn es nicht so offensichtlich ist, dass der auf Grund einer Korrelation oft stillschweigend angenommene ursächliche Zusammenhang gar nicht (d.h. eben nur scheinbar) existiert.

Das bedeutet zweierlei:

Zum einen sollte jeder, der Datenanalysen durchführt, sich des Unterschiedes zwischen Korrelation und ursächlichem Zusammenhang bewusst sein, um keine Fehlschlüsse aus den Ergebnissen zu ziehen. Aus Korrelation alleine folgt eben noch lange kein ursächlicher Zusammenhang. Dass gilt insbesondere bei den immer beliebter werdenden Big-Data-Analysen. Falsch angewendet und falsch interpretiert leitet man daraus leicht die falschen Handlungen ab und wundert sich dann, warum diese nicht zu den erhofften Ergebnissen führen.

(*) Zum anderen sollte man aus Schlagzeilen nicht leichtfertig irgendwelche Handlungen ableiten. Ich bin mir sicher: Keiner von euch wird mehr verdienen, nur weil er ab morgen anfängt, Leerzeichen statt Tabs zu verwenden, egal wie konsequent er dabei ist. Das gilt für alle Arten von Schlagzeilen, die auf Basis (tatsächlich) festgestellter Korrelationen irgendwelche (vermeidlichen) ursächlichen Zusammenhänge behaupten - wie es Journalisten leider nur allzu gerne machen und ich es hier einmal nachgeahmt habe, um auf diesen wichtigen Unterschied hinzuweisen.

(**) Und man sollte erst recht nicht über den nicht existierenden Zusammenhang hinaus noch weitergehende Zusammenhänge konstruieren, für die nicht mal eine Korrelation festgestellt wurde.

herbivore

Thema: String von rechts / hinten splitten
Am im Forum: Grundlagen von C#

Hallo CWolle,

keine gute Idee, eine Schleife auszuprogrammieren, um den letzten Schrägstrich zu finden, wenn es doch dafür extra eine fertige Methode gibt: String.LastIndexOf ...


Hallo zusammen,

... allerdings ist die konkrete Aufgabe ohnehin ein Fall für die von MrSparkle vorgeschlagene Methode Path.GetFileName.

herbivore

Thema: Wie autonome Fahrzeuge die Welt verändern werden
Am im Forum: Smalltalk

Hallo zusammen,

die Bundesverkehrsminister Alexander Dobrindt eingesetzte Ethik-Kommission zum automatisierten Fahren hat gestern ihren Bericht vorgelegt. Darin werden fünfzehn zwanzig ethische Regeln für den automatisierten und vernetzten Fahrzeugverkehr aufgestellt. Einige davon betreffen auch die in diesem Thread angesprochen ethischen Probleme in sog. Dilemmasituationen, also Situationen, in denen ein Unfall unvermeidlich ist, das Fahrzeug aber noch Einfluss darauf nehmen kann, welche der verschiedenen möglichen Unfallfolgen eintreten, z.B. ob das autonome Fahrzeug gegen einen stehenden LKW oder einen Fußgänger fahren soll. Hier gibt es naturgemäß moralische Probleme sowie ganz praktische Interessenkonflikte.

Ich finde, die von der Kommission hierzu aufgestellten Regeln gut gelungen. Natürlich können Sie nicht alle Probleme auflösen, aber sie entschärfen sie doch zu mindestens so gut es überhaupt geht.

Es fängt damit an, dass laut Regel 1 "Teil- und vollautomatisierte Verkehrssysteme [...] zuerst der Verbesserung der Sicherheit aller Beteiligten im Straßenverkehr [dienen]." Das wird in Punkt 2 [hab ich hier nicht zitiert] und vor allem in Punkt 5 noch konkretisiert:

5. Die automatisierte und vernetzte Technik sollte Unfälle so gut wie praktisch möglich vermeiden. Die Technik muss nach ihrem jeweiligen Stand so ausgelegt sein, dass kritische Situationen gar nicht erst entstehen, dazu gehören auch Dilemma-Situationen, also eine Lage, in der ein automatisiertes Fahrzeug vor der „Entscheidung“ steht, eines von zwei nicht abwägungsfähigen Übeln notwendig verwirklichen zu müssen. Dabei sollte das gesamte Spektrum technischer Möglichkeiten – etwa von der Einschränkung des Anwendungsbereichs auf kontrollierbare Verkehrsumgebungen, Fahrzeugsensorik und Bremsleistungen, Signale für gefährdete Personen bis hin zu einer Gefahrenprävention mittels einer „intelligenten“ Straßen-Infrastruktur – genutzt und kontinuierlich weiterentwickelt werden. Die erhebliche Steigerung der Verkehrssicherheit ist Entwicklungs- und Regulierungsziel, und zwar bereits in der Auslegung und Programmierung der Fahrzeuge zu defensivem und vorausschauendem, schwächere Verkehrsteilnehmer ("Vulnerable Road Users") schonendem Fahren.

Das entscheidende zu den Dilemmasituationen, die sich trotzdem alle dem nicht ganz vermeiden lassen werden, steht dann in den Punkten 7 und 9:
7. In Gefahrensituationen, die sich bei aller technischen Vorsorge als unvermeidbar erweisen, besitzt der Schutz menschlichen Lebens in einer Rechtsgüterabwägung höchste Priorität. Die Programmierung ist deshalb im Rahmen des technisch Machbaren so anzulegen, im Konflikt Tier- oder Sachschäden in Kauf zu nehmen, wenn dadurch Personenschäden vermeidbar sind.

9. Bei unausweichlichen Unfallsituationen ist jede Qualifizierung nach persönlichen Merkmalen (Alter, Geschlecht, körperliche oder geistige Konstitution) strikt untersagt. Eine Aufrechnung von Opfern ist untersagt. Eine allgemeine Programmierung auf eine Minderung der Zahl von Personenschäden kann vertretbar sein. Die an der Erzeugung von Mobilitätsrisiken Beteiligten dürfen Unbeteiligte nicht opfern.

So sehr man auch geneigt ist, Überlegungen anzustellen, dass das Leben eines Kindes aus verschiedenen Gründen als schützenswerter einzuschätzen sein könnte als das Leben eines Schwerkranken in der letzten Lebensphase, halte ich das Verbot einer solchen Abwägung für gut und richtig. Es folgt nicht zuletzt aus dem Gleichheitsgrundsatz des Grundgesetzes.

Richtig und wichtig finde ich auch die Klarstellung, dass der Kunde, der ein autonomes Fahrzeug kauft und bezahlt, sich damit nicht das Recht erkaufen kann, dass der Hersteller ihn als Insassen besser schützt als die (möglicherweise vollkommen unschuldigen) anderen Unfallbeteiligen. Insbesondere das ein autonome Fahrzeug nicht per se statt gegen den eingangs genannten LKW lieber gegen den Fußgänger fahren darf, weil dann der Aufprall für die Insassen glimpflicher verläuft.

In dem eben ausgelassenen Punkt 8 geht es eher um rechtstheoretische Fragen und eine ganz praktischen Konsequenz, nämlich um eine Aufsichtsbehörde, die die in der Praxis gesammelten Erfahrungen in zukünftige Leitlinien für die Programmierung einfließen lassen soll. Auch das finde ich sinnvoll, denn in diesem so grundsätzlichen neuen Gebiet kann man nämlich einfach nicht alles voraussehen und damit eben auch nicht alles vorab theoretisch behandeln.
8. Echte dilemmatische Entscheidungen, wie die Entscheidung Leben gegen Leben sind von der konkreten tatsächlichen Situation unter Einschluss „unberechenbarer“ Verhaltensweisen Betroffener abhängig. Sie sind deshalb nicht eindeutig normierbar und auch nicht ethisch zweifelsfrei programmierbar. Technische Systeme müssen auf Unfallvermeidung ausgelegt werden, sind aber auf eine komplexe oder intuitive Unfallfolgenabschätzung nicht so normierbar, dass sie die Entscheidung eines sittlich urteilsfähigen, verantwortlichen Fahrzeugführers ersetzen oder vorwegnehmen könnten. Ein menschlicher Fahrer würde sich zwar rechtswidrig verhalten, wenn er im Notstand einen Menschen tötet, um einen oder mehrere andere Menschen zu retten, aber er würde nicht notwendig schuldhaft handeln. Derartige in der Rückschau angestellte und besondere Umstände würdigende Urteile des Rechts lassen sich nicht ohne weiteres in abstrakt-generelle Ex-Ante- Beurteilungen und damit auch nicht in entsprechende Programmierungen umwandeln. Es wäre gerade deshalb wünschenswert, durch eine unabhängige öffentliche Einrichtung (etwa einer Bundesstelle für Unfalluntersuchung automatisierter Verkehrssysteme oder eines Bundesamtes für Sicherheit im automatisierten und vernetzten Verkehr) Erfahrungen systematisch zu verarbeiten.

Ich hatte ja schon in vorangegangenen Beiträgen geschrieben, dass ich Dilemmasituationen aus verschiedenen Gründen für gar nicht so problematisch halte, wie sie oft hingestellt werden. Verbleibende Probleme werden aus meiner Sicht durch die Regeln der Kommission sehr akzeptabel behandelt. Auch und gerade dadurch, dass bestimmte Abwägungen explizit ausgeschlossen werden.

herbivore

PS: Siehe dazu auch die BMVI-Pressemitteilung: Ethik-Kommission zum automatisierten Fahren legt Bericht vor

Am Ende der Pressemitteilung findet sich ein Link auf den kompletten Abschlussbericht als PDF.

Thema: [gelöst] WebBot variable ID auslesen
Am im Forum: Web-Technologien

Hallo pentester,

da du von GetElementById ein HtmlElement zurück bekommst, kannst du darauf einfach HtmlElement.GetAttribute aufrufen. Damit bekommst du "FixerTeilDerID_XXXXX". Das XXXX darin kannst du dann wirklich per Regex auslesen, siehe z.B. [Artikel] Regex-Tutorial.

herbivore

Thema: RegEx --> String mit fester Spaltenbreite prüfen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo HiJack82,

es reicht natürlich nicht (\w|\s){7} in den Look Ahead zu schreiben. Das fordert ja nur, dass mindestens 7 Zeichen vorhanden sind. Es muss auch noch der Teil in der Look Ahead, der das Ende dieser 7 Zeichen markiert, also mindestens der Punkt (\.). So wie ja vorher auch das $ mit im Look Ahead stand.

herbivore