Laden...

Forenbeiträge von Palin Ingesamt 1.090 Beiträge

18.10.2017 - 20:28 Uhr

Irgendwie hab ich das Gefühl wir reden da ein einander Vorbei.

Fangen wir mal ganz unten an.

Ich hab mir vor Grob 10 Jahren eine Charakter Verwaltung für AD&D geschrieben. Da hab ich auch den SQL Server verwendet und das Password in Klartext in in die Config Geschrieben. Seher ich auch heute noch kein Problem. Auch wenn ich jetzt wohl eine Web Lösung erstellen würde, da ist aber der Hauptgrund nicht die Sicherheit der Daten, sondern das ich von Unterschiedlichen Geräten drauf zugreifen kann.

Dann gibt es natürlich am anderen Ende auch hochsensible Daten. Wie Snowden z.B. da ist dann aber ein Webservice auch keine Ausreichende Absicherung mehr.

Und das zwischen gibt es viele Abstufungen. Was für einen da die Beste Lösung ist muss man halt in Einzelfall betrachten.

Wie gesagt ich Persönlich bin im Allgemeinen auch für einen WebService, da er auch höhere Sicherheit liefert. Ich halte aber das Argument, das jeder zugriff auf eine Datenbank nur über einen Service laufen darf. Weil man sonst unsichere Software Programmiert für falsch.

Ich stelle jetzt auch einfach mal die Hypothese in den Raum, dass ein schlecht Programmierter WebService deutlich gefährlicher sein kann als eine gut Programmierte Client Lösung.

Grundlegend geht es doch darum zu gegebenen Anforderungen die möglichst Beste Lösung zu finden. Und wenn ich mich von vorneherein festlege, das es ein Webservice sein muss, schließe ich viele Möglichkeiten aus.

p.s.
Das Snowden Beispiel habe ich bewusst herangezogen, nach dem der eigenen Mitarbeiter zur Sprache gebracht wurde. Und meines Wissens ist er aktuell die größte Schwachstelle und nicht die Software sondern der Mensch. Weil es einfacher ist über ihn an die Nötigen Informationen zu kommen, als über die Software.

18.10.2017 - 17:44 Uhr

Woher soll der Kunde, der vielleicht Lebensmittel oder Maschinen herstellt, sowas wissen? Der will vielleicht einfach nur eine Software haben und für ihn ist es selbstverständlich, dass diese sicher sein muss - ohne dass er es explizit erwähnt.

Ich hab ja nicht gesagt das man einen Kunden nicht beraten soll und offensichtliche Sicherheitslücken im System nicht schließen soll. Aber die Sicherheit und Beratung, sollten auch mit ihr Verbundene Kosten in Relation gesetzt werden. Der Lebensmittel Hersteller möchte von mir sicher nicht eine Stunde hören wie Sicher meine Software für seine Arbeitszeit Erfassung ist.

Die meisten erfolgreichen Angriffe auf europäische Netzwerke (Unternehmen) erfolgen übrigens von Innen, oft eigene Mitarbeiter - nicht von Außen.
Der Faktor "ist ja das eigene Netz" ist nichts anderes als ein (oft fahrlässiger) Trugschluss.

Der wird sich aber auch nicht für die Daten der Arbeitszeit Erfassung interessieren.
Und ob da jetzt ein WebService der im Intranet auf einem Server läuft wirklich viel mehr Sicherheit bring ist Fraglich. Snoden hat ja beim NSA auch Daten mitgehen lassen.

18.10.2017 - 16:57 Uhr

Na ja Datensicherheit kostet auch immer Geld und Zeit. Wenn ich sie nicht brauche und es keine Anforderung des Kunden ist. Wie so sie umsetzen?

Wenn sie eine Anforderung ist, ist es keine Frage ist der WebService die Sicherere alternative. Und grundlegend Bevorzuge ich auch die WebService Variante. Die hat auch noch ein paar andere Vorteile.

Wir haben uns aber auch schon bewusst, gegen einen bestehenden WebService entschieden. Da ging es um die Erfassung Produktions Daten von Maschinen. Und bei einer Maschiene kommen die Schon im Millisekunden Takt. Und ein direkter Datenbankzugriff ist einfach schneller. (Amazon greift ja mit ihren Service denke ich nicht direkt jedes mal auf die Datenbank zu sondern Cachen die Daten.)
Dann ist die Wartung eines zusätzlichen Services ein wenig aufwändiger. Bei Fehlern muss immer geschaut werden, wo lag es jetzt. Hat der Client die Daten falsch an den Service gesendet oder der Service die Daten falsch an die DB usw. Der Service muss Versioniert werden. Und wenn wirklich ein wirklich gleichzeitig ein Update gemacht werden musste bei uns immer ein C# und ein C++ Entwickler zum Kunden. Datenbanken können beide.

Aber im Endeffekt muss man sich die Verschiedenen Tier Architekturen im Zusammenhang mit den Anforderungen anschauen. Und dann genau Abwegen was man braucht. Es hat halt alles seine Vor und Nachteile.

18.10.2017 - 09:32 Uhr

Bei den Fremdschlüsseln bekommst du erst mal NULL. weil EF davon Ausgeht das du die Werte nicht um bedingst brauchst und Wagen und Auftrag könnten ja noch weitere Fremschlüssel haben. So das du im Extrem Fall auf einmal die ganze DB im Speicher hast.

Wenn du die Werte brauchst kannst du das mir Include, dem EF sagen.
Entity Framework Loading Related Entities

17.10.2017 - 16:35 Uhr

Fehlermeldung:
Zusätzliche Informationen: Die configSource-Datei "connections.config" kann nicht geöffnet werden.

Schau mal ob die Datei wirklich in deinem Anwendungsverzeichnis liegt und geöffnet werden kann.

17.10.2017 - 10:17 Uhr

Hi der SQL Server hat schon mal "Probleme" mit Parametern (Nennt sich glaube ich Parameter Sniffing).

Um zu schauen ob es daran liegt, kannst du dir mal mit dem SQL Profiler aus dem Managementstudio anschauen. Was für SQL wirklich auf den Server ausgeführt wird und es dann selbst noch mal auf den SQL Server ausführen.

Wenn es daran liegt kannst du dir das mal anschauen:
Parameter Sniffing Problem and Possible Workarounds

Wenn man das Tracking bei EF nicht braucht kann man es Ausschalten. Bingt da schon ein bisschen an geschwindigkeit.
Was du auch beachten solltest ist das EF beim ersten Aufruf deutlich langsamer ist. (Ich denke mal deshalb hat MrSparkle auch die Frage gestellt).

p.s.
0,15s für reines SQL, bei einer Abfragen bei einer Tabelle mit 10 Datensätze, klingt jetzt erst mal langsam.

15.10.2017 - 15:15 Uhr

Also ich hab Jahrelang Mathe Nachhilfe gegeben. Und hatte da natürlich nicht die Einser Schüler.
Die Leute hatten sich teils selbst abgeschrieben und wurden teilweise auch von ihren Lehren abgeschrieben. Ich hab es aber eigentlich bei allen hinbekommen, das sie in der Lage war gute Noten zu schreiben.

Ich hab ein dem Punkt 2 meist auftretende Probleme festgestellt. Einmal waren sie nicht sicher in den Grundlagen. Die musste ich dann wiederholen und solange mit ihnen Üben biss sie sahsen.

Dann gab es noch das Problem, das auf sie nicht Individuell eingegangen würde und es ihnen nicht so erklärt wurde, dass sie es verstehen konnten. Das war auch das größte Problem für mich, ich war gut in Mathe und musste erst mal verstehen, dass Leute manche Sachen nicht so einfach verstehen. Und ich da einfach andere Ansätze brauche um es ihnen zu erklären.

(Leute die wirklich einfach nicht wollen, habe ich mal ausgeklammert.)

Darüber war es dann möglich ihnen die Nötigen Fertigkeiten beizubringen. Sinnvoll mit Zahlen umzugehen,

Also wenn du wirklich Programmieren willst. Denke ich das du es bis zu einen Grad hinbekommst mit dem du Produktive arbeiten kannst. Ein Einstein wirst du damit aber nicht unbedingt. 😉

p.s.
Wie einige vielleicht hier im Forum mitbekommen haben. Habe ich eine Ausgeprägte Rechtschreibschwäche. Buchstaben in einen Wort zu Verdrehen ist bei mir Standard (Word ist so nett es Rot zu unterstreichen). Die Platziert mein Gehirn automatisch wieder an die richtige Stelle. Funktioniert auch bei ganzen Wörtern ins Sätzen.
Ich denke mal. Das ist einer der Punkte wie so ich verstehen kann, das manchen Menschen Mathe / Programmieren schwerfällt.

11.10.2017 - 16:00 Uhr

Um es mal Grob zu skizzieren:

Interface für den Provider

public interface ICSVProvider
{
String[][] GetData();

}

Abstracte Basis Classe erstellen

public abstract class DACSVBase<TModel>
{

   private ICSVProvider _provider;

 public DACSVBase(ICSVProvider provider)


prodected abstract TModel ToModel(String [] daten)


public IQueryable<TMode>l GetAll() //
{
      var result = new List<TModel>();

      var data = _provider.GetData();

      foreach(var item in data)
      {
            result.add(ToModel(item);
      }

      return result;
}

//Bei Bedarf um weitere Methoden ergänzen


}


Konkrete Klasse daraus


public DAStandartCustomer : DACSVBase<Customer> , ICustomer //Interface kann z.B. vom IoC-Container aufgelöst werden
{

prodected overide CustomerToModel(String [] daten) //ToModel überschreiben mit konkretten Mapping
{
    var kunde = new Customer();

    kunde.ID = date[0];
    kunde.Name = data[1];
   // usw.
}

}

Dann nochmal für einen Kunden nur mit Anderen Mapping

public DAXYZCustomer : DACSVBase<Customer> , ICustomer //Interface kann z.B. vom IoC-Container aufgelöst werden
{

prodected overide CustomerToModel(String [] daten) //ToModel überschreiben mit konkretten Mapping
{
    var kunde = new Customer();

    kunde.ID = date[100];
    kunde.Name = data[10];
   // usw.
}

}

Und jetzt noch mal für ein anderes Objekt

public DAStandartCCar : DACSVBase<Car> , ICar //Interface kann z.B. vom IoC-Container aufgelöst werden
{

prodected overide Car ToModel(String [] daten) //ToModel überschreiben mit konkretten Mapping
{
    var car= new Car();

    car.ID = date[0];
    car.Kenzeichen= data[1];
   // usw.
}

}

Grundlegend könntest du natürlich die Umwandlung auch in der abstrakten Basis Klasse machen. Aber wenn du gegen den ICSVProvider Implementierst. Kannst du da alles Reingeben was auch diese Schnitstelle Implementiert.

Dein ExelProvider könnte z.B. auch die Schnittstelle ICSVProvider implementieren. Wenn dein Kunde als von CSV auf Excel umstellt und die Reihenfolge beibehält, brauchst du keine Zeile Code ändern. Und gegebenen falls nur einen Eintrag in der Config ändern.

p.s. Das ist jetzt einfach nur runter Getippt und man kann sicher noch einiges Optimiern.

11.10.2017 - 14:28 Uhr

Wenn ich dich richtig Verstanden habe sind die einzelnen CSV Dateien schon unterschiedlich Felder (Reihenfolge).
Also zb. die eine hat die Reihenfolge (Name,ID,Anzahl,Einlagerdatum) die Andere (ID,Anzahl,Name).

Der Zugriff auf die CSV Datei ist aber in beiden Fällen der Selbe. Nur das Mapping unterscheidet sich dann.

11.10.2017 - 14:06 Uhr

Hallo tobi45f,

eine allgemeine Lösung ist da schwer anzugeben. Grundlegend solltest du je einen Betreuer für die Masterarbeit haben. Der sollte dir genau sagen können was und in welcher Form dort erwartet wird.

Ich kenne es jetzt so, das im eigentlichen Teil der Masterarbeit nur die Relevanten Aspekte des Quellcodes Angesprochen / Dargestellt werden. Das kann dann direkt der Quellcode sein, weil du dir da einen Algoritmus erarbeitet hast. Ein Klassendiagramm weil das Zusammenspiel der Klassen wichtig ist. Ein Flussdiagram weil der Ablauf wichtig ist u.s.w. Im Allgemeinen wird dann der ganze Quellcode im Anhang veröffentlicht oder auf CD mitgegeben. Falls du es für eine Firma entwickelt hast, musst du hier deren Copy Right Bedingung beachten. Es kann sein das du den Quellcode dann gar nicht in deiner Masterarbeit verwenden darfst.

Aber wie gesagt frag da deinen Betreuer.

11.10.2017 - 13:14 Uhr

Hi timbu42,

ich würde erst mal hingehen und die Verschiedenen Aspekte Trennen.

Du hast einmal das einlesen einer Datei in Unterschiedlichen Formaten (CSV, EXEL, XML usw.). Schreib dir für die Unterschiedlichen Formate eine eigene Klasse (z.B. CSVProvider). Die Auf die Klasse zugeschnittene Strukturen zurück gibt. Bei CSV wäre es z.B. ein String Array.

Da die Dateien unterschiedlich aufgebaut sein können (wenn ich dich richtig verstanden habe). Z.B. CSV Daten stehen an unterschiedlicher Stelle). Dann kannst du für die Unterschiedlichen CSV Dateine noch eine je Klasse erstellen, die dir die einzelnen "Spalten" passend auf ein Objekt (Konkrete Klasse von dir) mappt. Diese klasse Implementiert dann eine Schnittstelle in der das Objekt Definiert ist was zurück gegeben wird.

Jetzt mal Frei herunter getippt

class CustomerA_CSVMapper() : IMapper //gibt sicher besseren Namen
{

     ICSVProvider _provider;

        public CustomerA_CSVMapper(ICSVProvider provider)
{
       _provider = provider;
}

public MyObject GetObjekt()
{
     var daten = _provider.GetDaten();

     var myObject = new MyObject()

      myObject.Name = daten[0];
      //Anderen Werte alle Passent Mappen und Konvertieren

}


class CustomerB_CSVMapper() : IMapper //gibt sicher besseren Namen
{

     ICSVProvider _provider;

        public CustomerB_CSVMapper(ICSVProvider provider)
{
       _provider = provider;
}

public MyObject GetObjekt()
{
     var daten = _provider.GetDaten();

     var myObject = new MyObject()

      myObject.Name = daten[n];
      //Anderen Werte alle Passent Mappen und Konvertieren

}

Naja oder so ähnlich. Ziel ist es die einzelnen Aspekte zu trennen. Und dann so schnell wie Möglich auf einen Objektorientierten Ansatzt zu Mappen. Mit Konkreten Klassen kannst du auch Anständig Arbeiten.

Die Abhänigkeit welchen Provider und welchen Mapper du brauchst kann dir eine Factory Klasse auflösen. (DI und IoC-Container sind da aber sicher der bessere Ansatz). Und ich würde das ganze in den DAL Packen. Alternative kannst du dir hier mal anschauen wie EF oder Drapper das mit den Unterschiedlichen Providern machen. Und das Repository Pattern kann in den Zusammenhang auch nicht schaden.

05.10.2017 - 11:36 Uhr

Im Projekt Explorer, Rechts Click auf die Solution, dann Eigenschaften Auswählen.
Auf dem Tab Anwendungen findest du den Punkt Zielframwork.

04.10.2017 - 19:10 Uhr
  private static SgViewModel _viewModel = new SgViewModel ();

static member Variablen darfst du nie in einer Webanwendung Verwenden. Das wird dann von allen Aufrufern des Controllers die gleiche Instanz verwendet. Da kann alles zurück kommen. (Vielleicht hilft das ja schon).

Ansonsten einfach mal ein MVC Tutorial durch Arbeiten, da ist eigendlich alles dabei was du nach deinen Angaben hier so brauchst.
Getting Started with ASP.NET MVC 5

30.09.2017 - 01:06 Uhr

Hi t0rben,

aus Objekt Orientierter Sicht kann es Richtig sein alle Vorgänger im nächsten Element zu halten. Das kann man so nur nicht direkt einer Relationalen DB Tabelle speichern (OK Praktische geht es schon in dem man für jeden Vorgänger eine Spalte hat. Aber das ist so zimlich die schlechteste Lösung die ich mir Vorstellen kann).

Wenn jetzt aber jeder Vorgänger nur einen Nachfolger haben kann. Kann ich das direkt in einer Spalte in der Tabelle Speicher.
(Wenn ich dann eine m:n Verknüpfung habe, also beliebig viele Vorgänger und Nachfolger brauche ich eine Zwischen Tabelle)

p.s.
Wenn sich Produktions Schritte wieder holen. Kann es Sinnvoll sein, die Produktions Schritte vom Ablauf zu Trennen.

29.09.2017 - 19:01 Uhr

Beim MVVM Pattern sollte das VM die View nicht kennen. Die View kann aber Anhand der Elemente im VM das Diagramm Erstellen und falls sich was ändert über das PropertyChange Event informiert werden um sich dann gegebenen falls neu zu Zeichnen.

p.s.
google mal nach c# FlowChart MVVM. Ich denke da kann man eine Beispiel implementierung finden.

p.p.s.
Dein Tabellen Entwurf stimmt noch nicht. Wenn das "Nächste" Element mehrere Vorgänger haben kann, musst du die ID des "Nächsten" Elements im Vorgänger Speicher. Falls es nur genau ein Nächstes Element geben kann. (Sollten es mehrere sein Brauchst du eine Zwischen Tabelle).

28.09.2017 - 11:06 Uhr

So genau habe ich jetzt auch nicht verstanden was du machen möchtest.
Für mich klingt es jetzt ein bisschen nach einen einfachen IoC-Container.

Tim Ross:Creating a Simple IoC Container

28.09.2017 - 10:01 Uhr

Hi,

im Browser machst du einen HTTP Request. Wenn du es aus dem Quellcode machen willst kannst du den HTTP-Client verwenden.

27.09.2017 - 23:23 Uhr

Hi bsolutions,

Lizenzfragen wird dir im hier keiner Rechtssicher beantworten können. Um da sicher zu sein solltest du immer einen Anwalt hinzuziehen.

Also Grundlegend gehören die Rechte an deiner entwickelten Software/Quellcode dir. Und kein Anderer kann sie nutzen ohne das du ihn die entsprechenden Rechte einräumst (solange du keine Gegenleistung ins Spiel bringst).

Was auch relative Formlos geschehen kann.

Wenn du Schreibst. "Die Bibliothek (DLL) kann kostenlos für non-profit und kommerzielle Projekte genutzt werden".

Kann sie genau das. Sie kann genutzt werden. Was nicht heißt, das mit anderer Software kopiert ausgeliefert und Verkauft werden kann. Diese Rechte könntest du noch expliziter hinzufügen oder wenn du möchtest im Zweifel einfach nicht deine Rechte in Anspruch nehmen. Wobei man bedenken sollte, das Nutzer deiner DLL schon gerne eine Gewisse Rechtssicherheit haben möchten.

Umgekehrt entsteht dir gegen über auch kein Nachtbesserungsanspruch oder Schadensanspruch. Wenn dir keine grobe Fahrlässigkeit oder Vorsatz nachgewiesen werden kann. (Also Schadsoftware darfst du nicht verbreiten oder Erstellen).

Das ist grob die Aussage die ich von einen Befreundeten Juristen, bekommen habe (frei wieder gegeben). Wobei er auch direkt dir Einschränkung gemacht hat, das es nach deutschen Recht so (ähnlich) ist. Und in anderen Ländern andere Rechte gelten können.

Nach deinen Anforderungen scheint mir die MIT Lizenz geeignet, kann aber nicht ausließen, das es bessere gibt.

Ohne jetzt genau zu wissen was dein Projekt macht, würde ich Abts aussage unterstützen. Mach ein Open Source Projekt daraus. Die Funktionalitäten Stellst du kostenlos bereit. Da kannst du auch den Quellcode direkt veröffentlichen.

23.09.2017 - 16:25 Uhr

Wie du selbst Festgestellt hast, habe ich eine Methode als Beispiel gepostet. Und meines Erachtens war damit in dem Kontext relative klar, das ich nicht den Boolean Wert meine, den die Methode zurück gibt, (der ist nicht Nullable ist) sondern den Out Parameter.

Viellicht habe ich mich da miss verständlich ausgedrückt. Und an dem Punkt habe ich auch sicher kein Problem, wenn jemand hingeht und es allgemein verständlich ausdrückt.

Problematisch wird es für mich wenn mir da jemand wieder Spricht und da Ansätze reinbringt, die meines erachten ein Schlechter Programmiert sind.

Bleiben wir also beim Fachlichen.
Ich denke beim Microsoft Framework ist relative klare welche Methoden, eine Null Reference Exception Schmeißen oder welche Null zurück geben (z.B. die Try Methoden.

Und ich denke es kann nicht schaden genau diese Klarheit auch in dem einengen Quellcode unter zu Bringen.

23.09.2017 - 12:34 Uhr

Wenn die Methode :::

Nein, Methoden dürfen jederzeit null zurück geben.

TryMethoden geben i.d.R. - auch nach Naming Empfehlungen - ein Bool zurück.
So ist es auch im .NET Framework implementiert und zeigt ja auch Dein eigenes Beispiel.

Jetzt stell dich bitte nicht dümmer an als du bist.
Ich denke es ist recht klar das es mir dabei um den out Parameter der Methode ging. Und nicht um den bool Rückgabewert er Methode.
Und bis ein paar Ausnahmen setzt es Microsoft ja auch konsequent in ihrem Framework um. Wenn ich im allgemeinen null an eine Methode übergebe, gibt es eine NullReference Exception. Bei den TryPrase Methoden bekomme ich fals zurück und im out Parameter null.
Bei Linq wenn ich .First() machen eine NullRefernce Exeption und wenn ich zum Unterschied .FirstOrDefould() mache null.

Das an der Stelle eine Exception kommt, denke ich ist besser als wenn sie dann auf einen Defould Zeitstempel zurück greifen.
Nein, die Buhl Software knallt einfach weg, weil sie mit der falschen Culture arbeitet.
Kann man im ILCode auch nachvollziehen.

Das ist nicht-defensive Programmierung.

Das das keine Defensive Programmierung ist ist mir auch schon klar.

Es ist ein Bug, den Buhl beheben sollte.
Aber was ist dir an dem Punkt lieber. Das du dich jetzt hinsetzen kannst und Stundenlang eine Steuererklärung machen kannst, die du im Anschluss in die Tonne klopfen kannst weil sie den falschen Zeitraum umfasst. Oder die Software erst gar nicht Funktioniert.

Ja es ist ein Fehler das der TimeStamp nicht Culture Neutral gespeichert wurde. Und dann nicht so geladen wird. Bei einem einem Wert kann ich es auch noch passiv Programmieren, das für den Benutzer eine Meldung kommt. „Bitte geben sie einen gültigen Wert für XYZ ein.“.
So bald ich da ein DB mit 1000+ Datensätzen habe, wird mich der Kunde dafür lynchen wenn er alles per Hand korrigieren muss, nur weil er eine andere Sprache eingestellt hat.

Und darum ging es ja bei meinen Eingangsbeitrag. Defensive Programmierung ist Gold wert wenn man sie richtig einsetzt. Wenn man sie falsch einsetzt kann sie aber zum Problem werden. OK man könnte jetzt noch drüber diskutieren ob es dann wirklich defensive Programmierung ist und ich würde da wohl auch im Endeffekt zustimmen das da Leute Programmiert haben die nicht wirklich wissen was sie machen und was umgesetzt haben was für sie wie defensive Programmierung aussieht.

22.09.2017 - 16:33 Uhr

Wenn die Methode null zurück gibt erwarte ich eigentlich das sie mit Try beginnt. Ist glaube ich auch von Microsoft so vorgeschlagen.

Also:


private bool TryMakeFooBar(Foo foo, Bar bar, out FooBar foobar)

Und wenn die dann Fals zurück gibt, sollte man auch nicht mehr mit foobar weiter machen.

Was BUHL (google sagt WISO- Finazsoftware) angeht. Das an der Stelle eine Exception kommt, denke ich ist besser als wenn sie dann auf einen Defould Zeitstempel zurück greifen. Dann weist du wenigstens das es ein Problem gibt. Und machst dann z.B. deine Steuererklärung. über den falschen Abrechnungszeitraum

Ich denke das eigentliche Problem ist das BUHL nicht einsieht, das es ein Bug ist.
Obwohl vielleicht steht ja in ihren Vertragsbedingungen drin das sie nur Deutsche Betriebssysteme unterstützen, kann könnte es eine Anforderung sein 😉

21.09.2017 - 12:46 Uhr

Gut gemachte defensive Programmierung ist Gold wert. Schlecht gemacht kann sie zum Horror werden. Dann kann es besser sein sie zu lassen und denn Kunden eine Exception um die Ohren fliegen zu lassen.

Mal als Beispiel:


private FooBar MakeFooBar(Foo foo, Bar bar)
{
         if(foo == null) return null;
         if(bar == null) return null;

         return new FooBar(foo.GetFoo(), bar.GetBar);

} 

Wirkt jetzt erst mal defensive, ist aber der Horror. So was hat ein ehemaliger Kollege bei einer Komplexen Berechnung/Optimierung (5000+ LOC) gemacht und zwar in jeder Methode, da ja mit dem Ergebnis von MakeFooBar weiter gerechnet wurde. Und das wird in einer Schleife für 1000+ Datensätze gemacht. Wenn einer von dehnen Fehlerhaft ist, kommen falsche oder gar keine Ergebnisse zurück. Was bei 1000 Datensätzen aber nicht direkt ersichtlich ist.

Dann mal ein weiteres Beispiel:


private FooBar MakeFooBar(Foo foo, Bar bar)
{
         if(foo == null) return  throw new ArgumentNullException(nameof(foo));
         if(bar == null) return throw new ArgumentNullException(nameof(bar));

         return new FooBar(foo.GetFoo(), bar.GetBar());

} 

Meines Erachtens direkt viel viel Besser. Hat für mich aber mindestens noch einen kleinen Schönheitsfehler. Seht ihr ihn?

Die Methode ist private. Die kann so einfach kein Anderer außer mir aufrufen. Grundlegend sollte ich mir selbst trauen können. Wenn ich es in jeder Methode drin habe lenkt es von der eigentlichen Aufgabe ab. Und es ist zusätzliche Arbeit die in 99% der Fälle unnötig ist.
Meines Erachtens sollte man nur an Schnittellen zu anderen Prüfen, Ausnahmen gibt es sich.

Was dann Grob so aussähe:


private FooBar MakeFooBarFromFoo(Foo foo)
{
         if(foo == null) return  throw new ArgumentNullException(nameof(foo));
     
         Bar bar = new Bar();

         return new MakeFooBar(foo, bar);

}

private FooBar MakeFooBar(Foo foo, Bar bar)
{
       return new FooBar(foo.GetFoo(), bar.GetBar());

} 

Defensive Programmierung ich wirklich wichtig. Aber man sollte sicher sein das man bei einem Problem/Fehler sein Programm in einen zustand bringt denn man kennt und auch Kontrollieren kann. Wenn dem nicht so ist halte ich es für besser, den Fehler zu Loggen und das Programm Abstürzen zu lassen. Da Meldet sich der Kunde und ich kann den Fehler beheben. Mach ich das nicht, wird das Problem vielleicht erst in einen Jahr ersichtlich. Der Kunde berechnet in der Zeit vielleicht die ganze Zeit eine falsche Mehrwert Steuer oder ähnliches. Und da jetzt rauszubekommen was da vor einem Jahr falsch gelaufen ist, ist echt nicht einfach.

18.09.2017 - 18:13 Uhr

Falls du einen Chat Programmieren willst denke ich ist SignalR eine gute Wahl. Einfach mal SignalR und Chat googlen, da findest du ein paar Beispiele.

Falls du Runter zu den Grundlagen willst, SignalR ist auch Open Source, und da solltest du eigentlich alles nötige finden.

UDP ist zwar deutlich schneller als TCP. Hat aber da Problem, das nicht garantiert wird das alle Pakete ankommen und auch nicht in der Richtigen Reihenfolge. Was bei Textnachrichten unschön sein kann.

TCP sorgt dafür das alle Pakete ankommen und auch in der Richtigen reihen folge. Dafür ist es langsame, was bei Textnachrichten aber meist nicht so wichtig ist. Bei Voice over Ip ist es schon störender, da stört es dann aber nicht wenn mal ein Paket weg fällt.

18.09.2017 - 17:14 Uhr

Zusammen mit dem Support von Microsoft konnte ich das Problem lösen.

Einen neuen Workspace anlegen und dann den Quellcode noch mal vom Server abzurufen, hat letztendlich geholfen. (Damit sind dann alle hier angegebenen Fehler verschwunden)

Hier noch der Linkt zu Support falls doch noch andere Schritte nötig sind:
https://developercommunity.visualstudio.com/content/problem/108302/vs2017-partial-access-denied-when-connect-to-tfs20.html

18.09.2017 - 15:30 Uhr

Als ich alles in einem Thread laufen ließ war das kein Problem, nur das dann halt für 3-5 sekunden die GUI eingefroren ist. Da dies aber nicht für mich hinnehmbar ist, wollte ich die Berechnung im Hintergrund ausführen lassen, damit ich nebenbei weitere Flächen eingeben kann.

wird.

Wenn ich ihn richtig verstanden habe möchte er während die Berechnung Läuft, weiter Flächen eingeben. (Und ich denke mal für die soll auch die Berechnung durchgeführt werden)

18.09.2017 - 14:21 Uhr

Je nachdem was ihr mach könnt ihr auf VS2017 Comunity umsteigen. Bis 5 Leute und 1.000.000 Umsatz kann es glaube ich kostenlos verwendete werden (Sicherheitshalber noch mal in die AGBs schauen).

Ansonsten könnt ihr mit C# ASP (MVC 4) auch eine Webapi erstellen.

Ich würde trotzdem forschlagen für das Frontend Angular oder Aurelia zu nehmen. Und als Editor Visual Studio Code (Ob wohl ich Persönlich mit dem Editor noch nicht so warm geworden bin).

18.09.2017 - 13:46 Uhr

Wenn ihr aktuell anfangt könnt ihr im Backend .NET APS Core 2.0 verwenden und die Daten dann per Webapi bereitstellen. Für das Frontend könnt ihr dann z.B. Angular oder Aurelia JS verwenden.

18.09.2017 - 13:27 Uhr

Google mal nach "C# producer/consumer queue"

15.09.2017 - 14:56 Uhr

Bei solchen Erweiterungsmethoden mache ich das, damit ich nicht extra zusätzliche usings habe.
So kann ich z.B. in diesem Fall meine Methoden direkt mitnutzen, wenn ich Linq einbinde.

Ich persönlich Bevorzuge ja lieber zusätzliche Usings als zusätzliche Fehlerquelle. 😉

Schau mal hier Use system namespaces for class libraries: good or bad

15.09.2017 - 09:31 Uhr

Du benennst deine Namespaces wirklich System..., wie im Framework? Sollte man nicht machen, das führt zu Konflikten.

Ich denke mal ein Alias beim Using kann dir dar weiterhelfen.

14.09.2017 - 17:10 Uhr

Ich hatte mir das eher so Vorgestellt

Intrface Deklarieren

public Interface IFilter
{
     bool Match(ILogEntry<TEventType> entry);
     
     int CallOrder; // Ist hier jetzt nur Beiespiel hast angelegt, daran könntest du einmal deine Liste Sortiern damit die schnelleren Prüfungen zuerst statt finden.
}

Die Einzelnen Filter Strategien implementieren.

public class MessageContainsFilter : IFilter
{
          private String _valueToContains;

          public MessageContainsFilter(String valueToContains)
          {
                       _valueToContains = valueToContains;
           }

          bool Match(ILogEntry<TEventType> entry)
          {
                return entry.Message.Contains(valueToContains );
           }
}


public class SourceContainsFilter : IFilter
{
          private String _valueToContains;

          public SourceContainsFilter(String valueToContains)
          {
                       _valueToContains = valueToContains;
           }

          bool Match(ILogEntry<TEventType> entry)
          {
                return entry.Source.Contains(valueToContains );
           }
}

public class IDEqualFilter : IFilter
{
          private int_value;

          public SourceContainsFilter(int value)
          {
                       _value = value;
           }

          bool Match(ILogEntry<TEventType> entry)
          {
               return entry.ID = value;
          }
}

Filter Beim Passenden Case einer Liste hinzufügen

case Equal
 
case ID
  filterListeAdd(new IDEqualFilter(Value)); //Value gegeben fals hier nach int Casten.  
//Anderen Cases

Und dann anwenden.


bool Match(ILogEntry<TEventType> entry)
{
      for each (filter in filterListe)
     {
          if(! filter.Match(entry) return fals;
      }

      return true,
}
14.09.2017 - 13:58 Uhr

Erstmal gfoidl Vorschlag ist sicher besser und einfacher Umzusetzen.

Ich denke mal wenn du eine BlockingCollection für die Gefilterten Ergebnisse nimmst, kannst du die Schleife in eine Parallel.ForEach umwandeln. Ist schnell gemacht und wenn dann schnell genug ist hast du dein Problem gelöst.

Zum andern ein Case Select ist jetzt nicht wirklich langsam. Aber wenn ich es nur 1x Aufrufen muss statt 30.000 mal ist es deutlich schneller. Bei z.B. Contains kommst du ja nicht drum herum es für jeden Datensatz aufzurufen.

Wenn du mehrere Filter anwenden willst kannst du sie in eine Liste Verwenden und dann über die Liste laufen. Der 1. Filter der Fals ist ist dann deine Abbruchbedingung. Die Filter kannst du dann gegebenen Falls noch nach Performance Sortieren. Als ich denke der Integer Vergleich ID = 1 ist schneller als ein String.Contains.

14.09.2017 - 13:32 Uhr

Google hat eine such Api, da sind 100 Anfragen pro Tag kosten los. Danach Zahlst du pro 1000 anfragen 5$.

Ich denke das zu umgehen indem du die Webseite direkt aufrufst, verstößt gegen die Geschäftsbedingungen.
What are the alternatives now that the Google web search API has been deprecated?

14.09.2017 - 12:39 Uhr

Hallo inflames2k,

wenn ich das richtig sehe prüfst du bei jedem der 30.000 Aufruf, was wie gefiltert wird. Also ob es jetzt z.B. ein String ist der auf Contains geprüft wird.

Und wenn ich es richtig Verstanden habe, ändert das sich ja nicht.

Grundlegend kannst du die Entscheiungen 1 mal vor den 30.000 Aufrufen treffen. Z.B. mit dem Factory Pattern welche dir dann einen Passenden Filter zurück liefert.

14.09.2017 - 12:07 Uhr

Danke für die Antwort hat mir weiter geholfen.

Und auch der Hinweis auf den Distributed Transaction Coordinator (DTC) Dienst, hat mir sicher einiges an Fehlersuche gespart.

14.09.2017 - 11:02 Uhr

verwendetes Datenbanksystem: MSSQL

Hallo Zusammen,

grundlegend möchte ich nur sicher gehen ob ich alles richtig Verstanden habe.

Wir haben eine ASP MVC Anwendung die eine Transaction mit EF über mehrere Datenbanken machen muss.

Wenn ich es richtig verstanden habe kann ich den TransactionScope nicht benutzen, da alle Contexte die während seines Bestehens erstellt werden unter den TransactionScope fallen. Und bei der ASP von unterschiedlichen Benutzer gleichzeitig unterschiedliche Seite aufgerufen werden können die nicht unter den TransactionsSope fallen sollen.
(Ich hoffe mal das Problem ist so verständlich, falls nicht Probiere ich es noch mal anders zu erklären)

Mir bleibt also nur die Möglichkeit für Context1 BeginTransaction dann für Context2 BeginTransaction.
Dann bei beiden die Daten zu speichern und im Anschluss für Context1 das Commit zu machen und dann für Context2.

Ist das richtig so oder übersehe ich hier etwas was zu Problemen führen könnte?

Bzw. Hatte schon jemand von euch ein Ähnliche Problem und wie hat er es dann gelöst.

07.09.2017 - 16:55 Uhr

Den Performance Problem kannst du mit dem Leistungsprofiler auf die schliche kommen.

Und ja wenn der Prozess zu langsam ist und die UI blockiert, solltest du ihn in einem Thread bzw Task auslagern.

06.09.2017 - 08:53 Uhr

Hallo Zusammen,

ich hab aktuell das Problem wenn ich im VS2017 (v15.3.3 (ich glaube das es zumindest bis zu dem letzten Update funktioniert hat) mein Dacpac Projekt Veröffentlichen(Publish) möchte, es mit dem Fehler abbricht, das die Tabelle schon vorhanden ist. In dem erzeugten Script sind dann auch für ein Tabelle direkt untereinander, das gleichen CREATE Statments vorhanden. (Es ist meist die erste Tabelle, ich hatte aber auch schon eine Variante wo es für jede Tabelle erzeugt wurde)

Bei dem Projekt handelt es sich aber auch nicht um die eigentliche Datenbank, auf die wird Verwiesen. Sondern das Projekt soll nur Testdaten für unsere Integrationstest erstellen.

Die aus den Erzeugten Dacpac Dateien hab ich mir auch im SQL Management Studio ein Script erzeugen lassen, dieses enthielt keine Doppelten Einträge.

Auf einen anderen mir den aktuell / gleichen Stand aus der Quellcode Verwaltung auschecke, funktioniert es dort.

Eine Repair Installation hab ich es schon Versucht.

Wenn ich VS im SafeMode Starte, steht da beim Start unter Datentoolvorgänge der Fehler.

Ausnahme beim Konstruieren des Inhalts dieses Frames. Diese Information wird auch in "C:\Users\palin\AppData\Roaming\Microsoft\VisualStudio\15.0_959817d4\ActivityLog.xml" protokolliert.

Fehlermeldung:
Ausnahmedetails:
System.UnauthorizedAccessException: Zugriff verweigert (Ausnahme von HRESULT: 0x80070005 (E_ACCESSDENIED))
bei Microsoft.VisualStudio.Shell.Interop.IVsShell5.LoadPackageWithContext(Guid& packageGuid, Int32 reason, Guid& context)
bei Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.GetPackage()
bei Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame.ConstructContent()

Wenn ich dann versuche die Solution zu laden stürzt VS ab. Wenn ich mich da mir dem Debugger dranhänge, bekomme ich mit das es eine NullReferenceException in Microsoft.VisualStudio.LanguageServices.Next ist. Ich hatte jetzt auch mal die Sprache auf Englisch gestellt, dann stürzt VS nicht ab, hängt jetzt aber seit ca. 10 Minuten.

Ich denke das es sich vielleicht um 2 Probleme handeln könnte, könnten aber auch zusammen hängen.

Vielleicht hat ja jemand eine Idee was es sein könnte oder was ich noch ausprobieren könnte.

Danke schon mal.

05.09.2017 - 17:14 Uhr

Du kannst ja mal bei den Visual Studio ALM Ranger reinschauen.
Die haben einen Blog, Guidance, eine Artikel Sammlung und PDF zu unterschiedlichen Sachen (Da gab es auch mal eine Übersichtsseite zu, die hab ich aber auf die schnelle nicht gefunden).

30.08.2017 - 17:44 Uhr

Hi Prodigio,

Stellen die als Junior Softwareentwickler ausgeschrieben, sind sicher genau das richtige. Es machen nur leider nicht alle Firmen, so das du dich da sicher auch Bewerben kannst. Das schlimmste was Passieren kann ist das du eine Antwort bekommst, das du noch nicht die nötige Erfahrung für die Stelle hast.

Auch sollte man die ganzen Anforderungen in vielen Stellenausschreibungen nicht so eng sehen. Da Übereiben, die Firmen manchmal mit dem was man alles können sollte. Meist reicht es wenn man einige der Anforderungen erfüllt. Wenn dir da eine Schlüsselqualifikation fehlt, wird dir das bei der Bewerbung schon gesagt werden.

Was das Wissen angeht. Keiner hindert dich daran, dich Private Weiterzubilden. Und meines Erachtens sollte man es auch machen. In der IT kann es nie Schaden auf dem Laufenden zu sein.

Einen Rat vielleicht noch.
Wenn ich es Richtig im Kopf habe Endet mit deinem Abschluss, das Anstellungsverhältnis und du brauchst Rechtzeitig einen Regulären Arbeitsvertrag oder musst dich beim Arbeitsamt melden. (Die frisst hab ich jetzt nicht genau im Kopf, aber ich glaub es waren so 3 Wochen.)
Ich würde dir dazu Raten, zu schauen das du eine Festanstellung, bei deinem jetzigen Arbeitgeber bekommst. Dann kannst du dich aus der Festanstellung heraus bewerben, das nimmt denn druck aus den Vorstellungsgesprächen. 😉

30.08.2017 - 15:47 Uhr

Ich denke FZelle meint die Methode IsDBNull des DataReaders.
Schau mal hier: Using column name when using SqlDataReader.IsDBNull

21.08.2017 - 12:44 Uhr

If (RadioButton1.checked == true) // beim Vergleich brauchst du 2 =


If (RadioButton1.checked ) // du kannst aber auch direkt den Wert Prüfen 

16.08.2017 - 11:44 Uhr

Wenn du ihn als Membervariable der Klasse deklarierst in dem die Methode ist. Dann wird er nur beim erzeugen der Klasse neu erzeugt.

15.08.2017 - 10:53 Uhr

Vielleicht als kleiner Tip bevor du anfängst für alles und jedes Interfaces zu schreiben, man kann es auch Übertreiben.

z.B. Wenn alle Module Energiebrauchen und alles was Energiebraucht ein Module ist. Brauchst du das Interface IEnegryModule nicht.

Bei Abstraktionen gilt: So hoch wie nötig, so niedrig wie möglich.

15.08.2017 - 09:36 Uhr

Mir ist an dem Punkt nicht klar wie so IEnergiebedarf BaseEnergie kennen soll.

Mal frei und schnell runter getippt.

    public class Ship
    {
        List<ModulA> mA = new List<ModulA>();
        List<ModulB> mB = new List<ModulB>();
        List<IEnergiebedarf> _energiebdedarf = new List<IEnergiebedarf>(); //Liste für alle Module mit Energiebedarf
int BasisEnergie = 100;

        public Ship()
        {
            mA.Add(new ModulA() { Energiebedarf = 1 });
            mA.Add(new ModulA() { Energiebedarf = 5 });

            mB.Add(new ModulB() { Energiebedarf = 5 });

           _energiebdedarf.AddRange((IEnergiebedarf)mA.ToList()); //Alle ModuleA zu der Liste hinzufügen
            _energiebdedarf.AddRange((IEnergiebedarf)mB.ToList()); // Alle ModuleB zu der Liste hinzufügen
        }

        public void RundenTick()
        {
            

       //        BasisEnergie =  BasisEnergie  - _energiebdedarf.Sum(c => c.Energiebedarf )); //Gesamten Energiebedarf bestimmen
         

        }

        public int Energie
        {
            get { return BasisEnergie; }
            set { BasisEnergie = value; }
        }
    }

p.s. ist jetzt vielleicht eine dumme Frage. Aber wie kann ich in Codeabschnitten den Text Fett darstellen.

Edit:Hab jetzt mal die passenden Zeilen auskommentiert 😉

@Coffeebean Danke.

Edit2: Hab jetzt mal die Kommentare hinten angefügt 😉

10.08.2017 - 17:29 Uhr

Meines Wissens hat sich da nichts geändert.

Und bei einer Webanwendung möchte ich dir ganz dringend von einem SingelTon Abraten.
(Was glaubst du was Passiert wenn 1000 Leute aus Unterschiedlichen Threads auf den SingelTon zugreifen)

Bei EF kannst du dir mal das Repository Pattern anschauen (das ist da meist so der Standart) oder auch die UnitOfWork.

01.08.2017 - 13:39 Uhr

Das einem das Wissen fehlt um ein Problem nach aktuellen Aspekten gut so lösen, geht Entwicklern Regelmäßig so. Dafür sind die Technologien im IT Bereich einfach recht schnell im Wandel.

Erster Ansatz ist meistens das Problem erst mal richtig zu Verstehen.

Danach kann man sich anschauen welche Technologien, zur Lösung des Problems zur Verfügung stehen. (Da kann man dann auch mal im Forum nachfragen, nach dem Motto. Ich hab Problem X und mir als Technologie schon A und B mal angeschaut, kennt da noch jemand was besseres oder welche Technologie würdet ihr Bevorzugen usw.).

Klingt zwar erst mal aufwändig, ist aber meist deutlich schneller als sich mit einer nicht wirklich geeigneten Technologie herum zu ärgern.

01.08.2017 - 13:22 Uhr

Für die Sotware kann dir ein HAL weiterhelfen.

Da wenn ihr (wenn ich es richtig verstanden habe), die Hardeware selber Produziert, hab ihr vielleicht auch den Treiber selber Geschrieben. Hier kannst du vielleicht einen Treiber schreiben der den Joystick simuliert.

How do I create a virtual gamepad?