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 Corpsegrinder
Thema: Verschachtelten und redundanten Code vereinfachen (bezogen auf ein konkretes Beispiel)
Am im Forum: Rund um die Programmierung

Zitat von dani_m
Wenn du schon mit KISS und YAGNI arbeitetst dann ist das sicherlich XP.

Was haben denn KISS und YAGNI mit XP zu tun? Das sind grundlegende Prinzipien. XP ist eine Vorgehensweise, in der auch auf so etwas geachtet wird, aber nur weil jemand KISS und YAGNI beherzigt heisst es noch lange nicht, dass er/sie XP betreibt.

Thema: Verschachtelten und redundanten Code vereinfachen (bezogen auf ein konkretes Beispiel)
Am im Forum: Rund um die Programmierung

Ich sehe das ähnlich wie FZelle. Eine Factory wäre hier durchaus sinnvoll, da man so den unschönen Seiteneffekt des Befüllens der ComboBox aus der Methode zum Auswählen des korrekten Datensatzes entfernen könnte. Wenn wir hier schon über KISS und YAGNI reden, dann würde ich hier auch gerne noch "side effects considered harmful" einbringen. Ich weiss, dass in der OOP selten darauf geachtet wird, wo man andere Objekte verändert, dennoch sollte man sinnvoll trennen. Seiteneffekte die sich auf die GUI beziehen haben nichts in der Logik verloren und vice versa.

Thema: Klassenbeziehungen planen und umsetzen
Am im Forum: Rund um die Programmierung

Zitat von Gepro
Kompositionen:
Ich habe eine Klasse FootballClub und eine Klasse Stadium,
Hier habe ich eine Ganz-Teil Beziehung, Club ist Ganz und Stadium Teil und in diesem Fall eine Komposition; Wenn der Club weg ist, also nicht mehr existiert, dann existiert Stadium quasi auch nicht mehr.
-> Stadium ist eine Eigenschaft von Club und diese Referenz taucht nur in diesem Club auf

Würde ich anders sehen... Ein Stadion fällt ja nicht in sich zusammen, nur weil es den Club nicht mehr gibt. Außerdem gibt es auch Stadien, die nicht nur von einem Club bzw. einer Sportart bespielt werden. Z.B. wurde erst das Olympiastadion und jetzt die Allianz Arena sowohl vom FC Bayern München, als auch vom TSV 1860 München bespielt. Ich würde Stadion zu Club eher in eine 1 zu n Beziehung stellen, da jeder Club in einem Heimstadion spielt, aber in einem Heimstadion mehrere Clubs spielen können und sowohl Stadion, als auch Club unabhängig voneinander existieren können.

Thema: Python Code validierung mit c#
Am im Forum: Rund um die Programmierung

Das Problem ist, dass Python dynamisch typisiert ist, du also häufig erst zur Laufzeit weisst, von welchem Typ ein Objekt ist. Genauer gesagt immer dann, wenn das Objekt nicht im aktuellen Kontext erstellt wird. Deswegen wirst du nie durch eine reine Analyse des Quellcodes alle Fehler, bzw. durch eine solche Analyse nur die wenigsten Fehler finden können.

Mit Tests schreiben meine ich z.B. Unittests. Die sagen dir zwar nicht genau welche Zeile Fehlerhaft ist, dafür aber, in welcher Methode.

Btw. liefert der Python Interpreter dir die Angaben, die du haben möchtest. Also Dateiname und Zeilennummer, in der der Fehler aufgetreten ist.

Thema: Python Code validierung mit c#
Am im Forum: Rund um die Programmierung

Ich denke das geht leichter, wenn du es direkt mit Python machts. Siehe exec. Einfach Zeile für Zeile ausführen und wenn es knallt haste die Zeilennummer.

edit: Obwohl das natürlich nur für einfachen Code geht...

edit 2: Du willst dir also einen Parser bauen, der deinen Code aus Korrektheit überprüft, der wie verstehe ich das? Wäre es nicht einfacher Tests zu schreiben? Dann hast du zwar nicht die genaue Zeile, aber es ist deutlich weniger Aufwand und Tests sollte man eh schreiben ;-)

Thema: Hotspot anbieten: Was muss man technisch und rechtlich beachten?
Am im Forum: Smalltalk

Oder du macht einfach ein 802.1X WLAN und jeder, der das WLAN benutzen will bekommt dann halt ein Kärtchen mit Username und Passwort.

Thema: Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nicht ganz. Der BackgroundWorker verwendet einen Thread aus dem ThreadPool, die Thread Klasse hingegen nicht.

Threading macht überall da Sinn, wo du eine aufwändige Aufgabe erledigen willst, aber das Programm trotzdem weiterhin auf eingaben reagieren soll. Oder eben da, wo du Aufgaben parallel ausführen kannst.

Thema: Was wünscht ihr euch für C# 5?
Am im Forum: Rund um die Programmierung

Zitat von zommi
Schau dir mal "Active Patterns" an. Damit kannste auch normale .NET-Strukturen in den Patterns analysieren. Genauso wie in dem Scala-Snippet von dir.

Ah, okay... die wurden in dem ersten Beitrag den ich gelesen habe garnicht erwähnt ;-). Dann ist es wohl doch recht ähnlich.

Thema: Was wünscht ihr euch für C# 5?
Am im Forum: Rund um die Programmierung

Zitat von Golo Roden
Falls das das gleiche ist wie bei F#: FULLACK

Hab mir gerade das Pattern Matching in F# angeschaut und muss sagen, dass das von Scala noch mächtiger ist. Vor allem dadurch, dass Scala eine objekt-funktionale Sprache ist. Beispiel für ein cooles Feature sind Extraktoren. So kann man quasi die Werte aus einem Objekt extrahieren, oder auch Werte vorgeben, bei denen es sich anders verhalten soll:


object Test {
  case class Person(val name: String, val age: Int)
  case class Square(val size: Int)

  def main(args: Array[String]) {
    val p = Person("Joe", 42)
    val s = Square(10)

    matchTest(p)
    matchTest(s)
    matchTest(Array(1,2,3))
  }

  def matchTest(a: Any) = a match {
    case Person("Joe", a) => println("Oh no, it's Joe.")
    case Person(n,a) => println(String.format("Person with name: \"%s\" and age: \"%s\".", n, a.toString))
    case Square(s) => println(String.format("Square with size: \"%s\".", s.toString))
    case _ => println("Unknown object.")
  }
}

führt zur Ausgabe:
Oh no, it's Joe.
Square with size: "10".
Unknown object.


Aber nicht nur das geht, man kann auch einfach auf Typen checken und hat dann gleich dann gleich eine Variable vom richtigen Typen zur Verfügung:

val p = Person("Joe", 42)

p match {
  case x: Person => println(x.name)
}

Und auch mit Regex kann man tolle Dinge tun. Aber das würde jetzt hier den Rahmen sprengen ;-)

Thema: Joomla auf dem IIS hosten?
Am im Forum: Smalltalk

Oder du benutzt deinen Apache als Proxy für den IIS. Hier eine Beschreibung: http://zeiler.me/julian/techzap/server/windows/iis-und-apache-auf-einem-server-parallel-betreiben/

Thema: Was wünscht ihr euch für C# 5?
Am im Forum: Rund um die Programmierung

Hi,

for in Scala ist keine Schleife, sondern eine Comprehension. Und einfach durch das Zuweisen ist auch nicht ganz richtig, der Compiler erkennt den Typen, Stichwort: Type inference.


Wo wir schon bei Scala sind.. ein wirklich cooles Feature wäre Pattern Matching im Scala-/Erlang-Style.

Thema: Welchen Vorteil hat die ArgumentNullException zur NullReferenceExcpetion?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ein Vorteil wäre z.B., dass man direkt sieht, dass ein übergebenes Argument den Wert null hat und nicht innerhalb der für den Benutzer evtl. nicht einsehbaren Klasse ein Fehler ist, der zu einer NullReferenceException führt. Desweiteren kannst du natürlich einen eigenen Text für die Exception angeben und evtl. sogar mitteilen, welcher Parameter null ist usw... Natürlich mach es in diesen Fällen nur Sinn für Debugginginformationen. Vielleicht fallen jemand anderen aber auch noch andere Gründe ein?

Thema: Applikationen in C# für Android programmieren möglich?
Am im Forum: Rund um die Programmierung

Zitat von inflames2k
C und C++ sollten auch möglich sein. - Auf jedenfall C.

Stimmt nicht ganz. Man kann Teile einer Applikation in C schreiben, aber das Gerüst und die GUI müssen immernoch in Java geschrieben werden.

Thema: Applikationen in C# für Android programmieren möglich?
Am im Forum: Rund um die Programmierung

Du kannst für Android auch in Scala programmieren. Hab selber noch nichts für Android gemacht, aber Scala kann ich nur empfehlen, wenn man mal was neues machen möchte.

Thema: Welche PC Hardware habt ihr?
Am im Forum: Smalltalk

Ich hab auch ein neues Spielzeug ;-)


iMac 27" late 2010
Core i5 4x 2,8 GHz
4GB DDR3 1333 MHz <-- wird möglichst schnell auf 8GB aufgestockt
Radeon 5750 mit 1GB GDDR5 Speicher
1 TB 7200 rpm Platte
Auflösung 2560 x 1440
Apple Wireless Bluetooth Tastatur
Apple Magic Mouse

Thema: Suche Buch zu Entwurfsmustern
Am im Forum: Buchempfehlungen

Das absolute Standardwerk der "Gang of Four" ;-)

Design Patterns


Gruß

Dario

Thema: iteration durch kleiner werdende Liste
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von rasepretrep
muss nich i = list.count-1 sein ? ;)

Oh man... das war eben schnell reingehackt.. ich denke es sollte klar sein, was gemeint ist :-P

Thema: iteration durch kleiner werdende Liste
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Oh, sry.. kleiner typo... ich pass es mal an.


Ansonsten gern geschehen ;-)

Thema: iteration durch kleiner werdende Liste
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

ganz ohne Index geht es nicht, aber folgendes sollte dir helfen:


for(int i = list.Count - 1; i≥ 0; i--) {
  if(list[i].Flag == Flag.MyFlag) {
    list.RemoveAt(i);
  }
}

Da die Liste rückwarts durchlaufen wird, werden auch keine Einträge übersprungen.


Gruß

Dario


typo edit: ++ zu --, Count - 1

Thema: Queue .NET 2.0 - reicht ein Lock?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vorsicht! Das kann zu Deadlocks führen.


Bsp:

Wenn die Queue leer ist wartet Dequeue, bis ein Element verfügbar ist, es kann aber kein Element hinzugefügt werden, weil die Queue noch gelockt ist und der Bereich, der ein Element hinzufügen will wartet, bis die Queue wieder freigegeben wird.

Schau dir einfach mal SyncQueue <T> - Eine praktische Job-Queue an.

Edit: Oh, scheint in .Net doch anders zu sein... der wirft einfach ne Exception, wenn die Queue leer ist...

Thema: Muss meine Liste static sein, damit sie lange genug lebt?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wo würdest du denn eine Liste in einer normalen Klasse instanziieren? Genau das gibt es auch für statische Klassen ;-). Den Rest solltest du selber herausfinden können.

Thema: [gelöst] In Kindklasse Konstuktor der Basisklasse aufrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

zweite Möglichkeit wäre eine Factory.

Thema: Läuft SQLite auf Win CE 6.0 mit X86 Platform? (Kein ARM)
Am im Forum: Datentechnologien

Hi,

x86 wird definitiv unterstützt, sonst würde es ja auch nicht auf normalen Rechnern laufen ;-). Was genau läuft denn schief? Kannst du es denn für die Plattform kompilieren?


edit: Auf der Homepage steht auch: "Cross-platform: Unix (Linux and Mac OS X), OS/2, and Windows (Win32 and WinCE) are supported out of the box. Easy to port to other systems."

Thema: Wann besser rekursiv und wann besser iterativ vorgehen?
Am im Forum: Rund um die Programmierung

@Siassei:

Ich glaube Du hast Tail-Recursion nicht ganz verstanden. Du machst da einen Fehler, der häufig gemacht wird. Der Ausdruck "return Rek(i-1) + i;" is äquivalent zu "return i + Rek(i-1)". Der letzte Aufruf ist in beiden Fällen die Addition. Daher muss auch in beiden Fällen ein Stack aufgebaut werden, damit diese Addition erfolgreich durchgeführt werden kann. Eine Tail-Recursion darf aber als letzte Anweisung nur den Rekursionsaufruf haben. Also nur "return Rek(i-1)" und da wir trotzdem das Ergebnis berechnet haben wollen, mussen wir es als Parameter mitschleifen. Also die neue Methode mit der Signatur Rek(int, int). Im Normalfall würde man natürlich um eine Manipulation zu verhindern eine Helpermethode schreiben, auf die der Anwender keinen Zugriff hat, also in Falle von C# eine private Methode, im Falle von Scala würde man diesen Helper natürlich innerhalb der eigentlichen Funktion deklarieren.


edit:

Probier einfach mal folgenden Code aus, dann siehst du anhand des Stack Trace, dass die erste Variante keineswegs Tail-Recursive ist:


object Main {

  def main(args: Array[String]) {
    try {
      rec(4)
    } catch {
      case e: Exception => println(e.getStackTraceString)
    }

    try {
      tailrec(4)
    } catch {
      case e: Exception => println(e.getStackTraceString)
    }
  }
  
  def rec(i: Int): Int = if(i ≤ 0) throw new Exception("Bumm") else rec(i-1) + i;

  def tailrec(i: Int) = {
    def helper(i: Int,j: Int): Int = if(i≤0) throw new Exception("Bumm") else helper(i-1, j+i)
    helper(i,0)
  }
}


edit 2:

Btw. kann man auf mit der @tailrec Annotation testen, ob eine Methode Tail-Recursive ist. ;-)

Thema: Wann besser rekursiv und wann besser iterativ vorgehen?
Am im Forum: Rund um die Programmierung

Zitat von Sebastian.Lange
Zitat
Leider unterstützt die CLR soweit ich weiss nur auf x64 Tail Call Optimization, ansonsten hätte man damit einen Overflow vollkommen ausschließen können

Was meinst du damit ???

Hi,

damit Du dir nicht den ganzen Kram aus dem Link durchlesen musst erkläre ich es hier noch einmal kurz.

Jede Rekursion kann in eine äquivalente Tail-Recursive Variante umgeschrieben werden. Das heisst, dass der letzte Ausdruck in der Funktion der Rekursionsaufruf ist.

Bsp:


int Rek(int i) {
  if(i ≤ 0) {
    return 0;
  }
  return Rek(i-1) + i; //der letzte Auruf in diesem Ausdruck ist die Addition
}

int Rek(int i, int j = 0) {
  if(i ≤ 0) {
    return i;
  }
  return Rek(i-1, j+i); //der letzte Aufruf ist die Rekursion
}

Im zweiten Fall kann der (JIT-)Compiler optimieren, da nichts auf dem Stack gehalten werden muss. Es werden hier nur die Werte der Parameter geändert und an den Anfang der Methode gesprungen. Somit wird kein Stack aufgebaut und es kann nicht zu einem Overflow kommen.

Thema: Algorithmus um Kurve (eine Liste von Punkten) zu komprimieren
Am im Forum: Rund um die Programmierung

Versuch doch einfach die Punkte genau dann zusammenzufassen, wenn viele Aufeinanderfolgende einen ähnlichen Wert haben, dann verhinderst du die grobe Verfälschung, sondern hast nur noch eine minimale Abweichung des urspünglichen Graphen.

Thema: Wann besser rekursiv und wann besser iterativ vorgehen?
Am im Forum: Rund um die Programmierung

Hi,

meine Erfahrung ist, dass rekursive Methoden in den meisten Fällen einfacher zu lesen und zu schreiben sind. Klar kann es etwas Einarbeitungszeit benötigen, wenn man lange Zeit nur iterativ gearbeitet hat. Wichtig ist, dass du darauf achtest, dass der Stack nicht zu sehr anwächst, wie bereits von MarsStein erwähnt. Leider unterstützt die CLR soweit ich weiss nur auf x64 Tail Call Optimization, ansonsten hätte man damit einen Overflow vollkommen ausschließen können. Aber es ist trotzdem wissenswert, da es in anderen Sprachen/Systemen unterstützt wird und hoffentlich mit Hilfe von F# auch bald in die x86 CLR kommt.

Thema: Wer spielt Star Craft 2?
Am im Forum: Smalltalk

Spiele auch bereits seit der Beta und konnte gestern abend/nacht endlich installieren! Bin asolut begeistert von dem Spiel. Spiele momentan hauptsächlich Terraner.

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

So, habe mir gerade eine hübsche Aufgabe überlegt.

Erstelle ein Banktransktionssystem, welches die Möglichkeit bietet Beträge von KontoA zu KontoB zu transferieren und die jeweiligen Kontostände abzufragen. Das ganze soll Threadsafe, aber OHNE Locking oder Synchronisation in dem Transaktionssystem erstellt werden. Es dürfen aber andere Strukturen benutzt werden, die schon Threadsafe sind (Listen, Queues...). Die Aufgabe ist nicht auf C# beschränkt, allerdings sollten keine Sprachen/Systeme benutzt werden, die STM bieten, wie z.B. Clojure oder Frameworks wie z.B. Akka für Scala.

Viel Spaß ;-)

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Ah, okay... da ich momentan fast nur noch funktional programmiere und da natürlich keine Iteratoren, geschweigedenn Schleifen verwende, bin ich garnicht auf die Idee gekommen es so zu lösen ;-)

Eine neue Aufgabe muss ich mir noch überlegen, werde aber so schnell wie möglich eine stellen.