Laden...
Avatar #avatar-4122.png
LaTino myCSharp.de - Experte
Softwareentwickler Thüringen Dabei seit 03.04.2006 3.003 Beiträge
Benutzerbeschreibung

Forenbeiträge von LaTino Ingesamt 3.003 Beiträge

28.04.2017 - 13:01 Uhr

Das Vergleichen der Strings bringt leider nicht das (wirkliche) gewünschte Ergebnis, denn es sind eben nicht einfach nur schnöde Strings, sondern Datei-Pfade und darum muss man diese auch wie solche behandeln.

Hier wird auch wieder ein klassischer Fehler beim Erstellen des Vorher-/Nachher-Beispiels gemacht:

Der simpelste Fall wird gezeigt anstatt der mit der höchstmöglichen Komplikation.

Ich denke, hier kann man ruhig mal die Kirche im Dorf lassen und davon ausgehen, dass er einfach nur ein paar Pfade unter Windows behandeln will. Strenggenommen hast du zwar Recht, aber für das Problem des TE sind die Hinweise eher irre- als zielführend.

EDIT: den Anforderungen kannst du also hinzufügen:
a) die Pfade sind Windows-Pfadangaben
b) jeder Pfad kommt nur einmal vor, Groß- und Kleinschreibung ist unbeachtlich
c) es gibt immer genau einen Eintrag, der der kürzeste ist und als Ergebnis übrig bleiben soll

LaTino

28.04.2017 - 07:27 Uhr

Geht mir ähnlich, aber ich rate mal wild: du möchtest die Zeichenketten vergleichen und den Teil, beginnend am Anfang der Zeichenketten, extrahieren, bis zu dem alle identisch sind. Ja?


string [] example = new[] 
{ 
    "auf der mauer auf der lauer", 
    "auf der mauer auf der", 
    "auf der mauer auf", 
    "auf der mauer", 
    "auf der", 
    "auf dem" 
};

string result = DoSomeMagic(example);
//result == "auf "

Lösung:


finde den kürzesten string im array
zaehle rückwärts von der länge des kürzesten strings bis 0 und:
    - extrahiere die Buchstaben von 0 bis zum Zähler aus dem kürzesten String
    - teste alle anderen strings, ob sie mit der extrahierten zeichenkette beginnen
    - wenn nein, zähle weiter rückwärts
    - wenn ja: ergebnis ist die extrahierte Zeichenkette


Viel Spass.

LaTino
EDIT: wenn es sich um Dateipfade handelt, geht das ganze auch schneller, weil man nicht alle Zeichen, sondern nur die Pfade extrahieren muss. Die statische Klasse Path in System.IO hat dafür passende Methoden.

27.04.2017 - 09:49 Uhr

Zum einen: frag zwei Entwickler, ob Buch XY empfehlenswert ist, und du kriegst drei Meinungen.
Zum anderen: "Referenzen, die nicht hinterfragt werden müssen" - so etwas existiert in diesem Universum nicht, auch nicht auf mycsharp.de.

Was der Anfänger für gut hält, weil er einiges versteht (oder zu verstehen glaubt), und was erfahrene Entwickler für geeignet halten, sind auch noch zwei paar Schuhe. Schnelle Erfolgserlebnisse sollten jedoch kein Kriterium sein, wenn dafür die vermittelten Inhalte leiden.

Empfiehl das, was du gut findest. Ganz einfach 😃.

LaTino

26.04.2017 - 12:29 Uhr

Ah, Mist, Quelle vergessen, und die ist hier sehr wichtig: das Zitat ist von 2014, upcoming bezieht sich auf 4.61.

Quelle

Sorry 😮)

LaTino

26.04.2017 - 11:46 Uhr

Microsoft hat's nicht so mit dem offiziellen Abkündigen von Features, man erinnere sich an das Hickhack mit Silverlight, wo es auch ewig kein offizielles Statement gab (gibt's eigentlich inzwischen eins?)

Das hier ist das letzt halbwegs offizielle Statement zum Thema, das ich finden konnte. Eine Abkündigung sieht anders aus, aber sind wir ehrlich: de facto ist WebForms tot.

Web Forms isn’t available on ASP.NET 5, but is still fully supported on the .NET Framework. There are a number of important new features coming to Web Forms in the upcoming version of the .NET Framework, including support for HTTP 2.0, async model binding and a Roslyn-based CodeDom provider. We’re also working on various features reminiscent of Web Forms in MVC 6, such as tag helpers and other Razor improvements.

AFAIK kamen die letzten WebForms-Entwicklungen mit .NET 4.61, aber da könnte ich mich irren.

LaTino

26.04.2017 - 07:50 Uhr

Für die Zukunft: die C#-Klasse von Hand schreiben ist keine gute Variante.

a) langsam
b) fehlerbehaftet

Nimm die Zeichenkette, die dir geliefert wird, kopier sie, mach im Visual Studio Bearbeiten->Inhalte Einfügen -> JSON als Klassen einfügen.

Ergibt für deinen Anwendungsfall:


public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string email { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string id { get; set; }
    public string position { get; set; }
    public string height { get; set; }
    public string birthday { get; set; }
    public string strongFoot { get; set; }
}

Klasse Rootobject wirfst du weg, Class1 refaktorierst du, indem du die Typen nach Wunsch änderst und ggf Hinweise an den Serializer per Attribut "JsonProperty" gibst:


public class Kicker
{
    public string Email { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    [JsonProperty("id")]
    public int KickerId { get; set; }
    public string Position { get; set; }
    public int Height { get; set; }
    public DateTime Birthday { get; set; }
    public string StrongFoot { get; set; }
}

Test schreiben:


[TestClass]
public class KickerTests
{
    [TestMethod]
    public void DeserializeKickerTest()
    {
        string input = @"[{""email"":""mail@dlrg-kickers.de"",""firstname"":""Max"",""lastname"":""Mustermann"",""id"":""1"",""position"":""Sturm"",""height"":""181"",""birthday"":""2012-12-11"",""strongFoot"":""rechts""}]";

        var expectedResult = new Kicker
        {
            Email = "mail@dlrg-kickers.de",
            Firstname = "Max",
            Lastname = "Mustermann",
            KickerId = 1,
            Position = "Sturm",
            Height = 181,
            Birthday = new DateTime(2012, 12, 11),
            StrongFoot = "rechts"
        };

        var actualResultList = JsonConvert.DeserializeObject<Kicker[]>(input);
        Assert.AreEqual(1, actualResultList.Length);

        var actualResult = actualResultList[0];
        Assert.AreEqual(expectedResult.Email, actualResult.Email);
        Assert.AreEqual(expectedResult.Firstname, actualResult.Firstname);
        Assert.AreEqual(expectedResult.Lastname, actualResult.Lastname);
        Assert.AreEqual(expectedResult.KickerId, actualResult.KickerId);
        Assert.AreEqual(expectedResult.Position, actualResult.Position);
        Assert.AreEqual(expectedResult.Height, actualResult.Height);
        Assert.AreEqual(expectedResult.Birthday, actualResult.Birthday);
        Assert.AreEqual(expectedResult.StrongFoot, actualResult.StrongFoot);
    }
}

Aufwand: ~3-5 Minuten pro Klasse maximal. Und bitte, keine App ohne UnitTestprojekt.

LaTino

26.04.2017 - 07:32 Uhr

Bei einem Fehler hätte ich eher auf die Stelle mit Convert.FromBase64String(value) getippt, da dann noch nicht genug Daten aus dem Stream gelesen worden wären.

Genau die Stelle, die mir seltsam vorkam. Das[EDIT]Base64-Codierung[/EDIT] sollte zum Versenden eigentlich nicht nötig sein.

LaTino

25.04.2017 - 16:33 Uhr

Zeig mal den Code der Gegenseite. Kommt mir bisschen spanisch vor, was du da machst 😃

LaTino

24.04.2017 - 14:14 Uhr

@MrSparkle
Hatte ich auch über FeFe gefunden 😃

Ich auch 😉.

Wieso hast du das Gefühl, wir würden Differenzen klären? Ist 'ne normale Diskussion, und die gehört mMn ins Forum. Es darf sich gern beteiligt werden. Sollten wir auf das Niveau "deine Mudder!" sinken, dann per PM, versprochen.

LaTino

24.04.2017 - 12:04 Uhr

Moment, du sagst quasi, agile ist in Ordnung, aber wenn es kritisch wird, würdest du dann doch lieber drauf verzichten? (Davon abgesehen: haltet doch bitte die "Expertenkommissionen" nicht für dämlich. Da sitzen meist richtige Füchse mit drin, und schlaue Leute wissen, wenn sie etwas nicht wissen, und wie sie diese Lücken füllen. Darüber hinaus gibt es normierte, standardisierte, erprobte Vorgehensweisen, um Anforderungen korrekt erfassen zu können. Die Entwicklung dort ist ja nicht in den Achtzigern stehengeblieben.)

Und, äh, wenn der Auftraggeber zufrieden ist, heisst das nichts? Kann ich bitte ein Beispiel haben, wo ein Projekt gescheitert ist, obwohl der Kunde mit dem Ergebnis zufrieden war?

(Vermutlich verstehe ich nicht das, was du ausdrücken wolltest, also bitte kurz erläutern 😃 )

LaTino

24.04.2017 - 08:29 Uhr

Sehr, sehr rudimentäre Variante:


const char SPLIT_CHAR = ';';

var mcbList = File.ReadLines(@"mc.txt", Encoding.Default)
    .Select(p => p.Split(SPLIT_CHAR))
    .Where(p => p.Length == 2)
    .Select(Mcb.Create)
    .ToList();

var bindingSourceMc = new BindingSource {DataSource = mcbList};
comboBox1.DataSource = bindingSourceMc.DataSource;
comboBox1.ValueMember = "Ort";
comboBox1.DisplayMember = "FullName";

comboBox1.LostFocus += (sender, args) => //nicht das beste Event dafür, aber ist ja nur Demo :)
{
    var cb = sender as ComboBox;
    if(cb == null) return;
    if (cb.SelectedItem == null)
    {
        var newItem = Mcb.Create(cb.Text.Split(' '));

        bindingSourceMc.Add(newItem);
        comboBox1.DataSource = bindingSourceMc;
        comboBox1.SelectedItem = newItem;
    }

    MessageBox.Show(cb.SelectedValue.ToString(), @"Debug ;)");
};

//Bequemlichkeitsänderungen an MCB
public class Mcb
{
    private Mcb() { }
    private string Name2 { get; set; }
    public string Ort { get; private set; }
    public string FullName => $"{Ort} {Name2}";

    public static Mcb Create(string[] init)
    {
        return new Mcb
        {
            Ort = init[0],
            Name2 = init[1]
        };
    }
}

EDIT: Schönheitskorrektur

24.04.2017 - 07:36 Uhr

Dein Problem ist dein Databinding. Wenn in die CB ein neuer Wert eingetragen wird, musst du:

a) eine neue Instanz der Klasse MCB erstellen
b) sie der DataSource hinzufügen
c) evtl neu binden

WinForms weiß, dass es an Objekte vom Typ "MCB" gebunden ist, dass SelectedValue die Eigenschaft "Ort" des gebundenen Elements ist, und dass die Eigenschaft "FullName" des gebundenen Elements benutzt wird, um den Text darzustellen. Deshalb geht MrSparkles Anmerkung in die falsche Richtung, die Ort-Eigenschaft muss nicht eindeutig sein, weil die Elemente der ComboBox vom Typ MCB sind und als Referenzen immer eindeutig sind, auch wenn ihre Eigenschaften gleich sind. SelectedItem ist dann übrigens die selektierte jeweilige MCB-Instanz.

Was die Combobox NICHT weiß, ist, wie es aus einer Texteingabe eine Instanz von MCB erzeugt werden soll. Das solltest du ihm beibringen, indem du dich in den Prozess des Neueinfügens hängst.

LaTino

23.04.2017 - 13:42 Uhr

(LaTino mit n, da bin ich empfindlich)

Der Vorwurf war nicht, dass du starke Meinungen vertrittst - das tue ich selbst gern und schätze es auch bei anderen - sondern, dass einige Folientexte mit Argumenten verwechselst und es nicht für nötig hältst, deine Aussagen zu untermauern. Das ist schade, weil, wie ich schon schrieb, deine Meinung durchaus kein Einzelfall ist, sondern in meiner täglichen Arbeit bei Projektverantwortlichen und im Management sogar relativ oft anzutreffen ist.

Ein für meine Begriffe sehr gutes Argument wäre ein Verweis darauf gewesen, dass man mit dem Einsatz agiler Methoden u.U. Gefahr läuft das zu tun, was im Link oben "hype driven development" genannt wird. Und die Risiken von "HDD" sind dort (Link) ja recht anschaulich dargestellt.

Wie gehst Du mit den nachfolgenden Problemen um:

  1. Wie Du die Anaomlien, Inkosistenzen und Probleme während der Zunahme des HDD erkennst?

Zugegeben habe ich hier etwas Schwierigkeiten, zu erkennen, was du wissen möchtest. "Zunahme des HDD"? Inwiefern? Was der Autor spöttisch "HDD" nennt, also das Hinterherlaufen hinter Trends, wie soll das "zunehmen"? Entweder man verfällt dem Trend, oder nicht, das ist ein binärer Zustand. (Immer gesehen für ein Projekt.) Wenn man dem Trend verfällt, besteht das Risiko, dass man hinterher das Gegenteil von dem erreicht, was man wollte (dass es teurer wird, länger dauert, unzuverlässiger funktioniert). Wenn man dem Trend nicht verfällt, sondern auf bewährte Methoden zurückgreift, besteht das Risiko, dass man von den Vorteilen des Trends ggf. nicht profitiert, d.h. man vergibt sich die Chance, dass es funktioniert.

Wichtig auch: unter bewährte Methoden wird eine Softwarebutze, die seit Jahren SCRUM macht, eben auch SCRUM verstehen. Bewährt heisst: ich weiß, dass es für mich funktioniert, ich kenne die Vor- und Nachteile, und ich kann beides in meine Kalkulation einbeziehen und stelle im Projektnachlauf fest, dass diese Kalkulation nah an der Realität war. Insofern unterstützt der Link keinesfalls deine These, dass agile Methoden per sé ein "Run in das Mittelmaß" (was soll das eigentlich bedeuten?) sind.

Wie überzeugst Du
a) eure Kunden

Easy. Meine Kunden gehören - wenigstens die Entscheider - zu Unternehmen, wo die IT noch "EDV" und "DFÜ" genannt wird. Die wissen, dass COBOL das Maß der Dinge ist, weil sie Software im Einsatz haben, die damit Anfang der 70er geschrieben wurde und immer noch funktioniert. Überspitzt gesagt: wenn ich die überzeugen will, dass ihr Produkt mit einer gewissen Technologie/Methodik entwickelt werden soll, dann muss ich ihnen ein Beispielprojekt zeigen, dass mindestens schon 30 Jahre läuft. Alles andere wird für kurzfristige Trends gehalten. Ich kenne Entscheider, die halten OOP für einen dieser kurzfristigen Trends.

b) deine Kollegen

Der schwierigste Part. Gute Entwickler sind faul. Wenn sie das Risiko sehen, dass sie mit einer Methode mehr Aufwand haben als mit der anderen, wählen sie im Normalfall das, was sie kennen. Wenn allerdings, um ein fiktives Beispiel zu nennen, 5 Kollegen von einer Konferenz kommen und jetzt alle künftigen Projekte in Rust machen wollen (nix gegen Rust, ich liebe die Sprache), dann lässt man sie Rust evaluieren. Zum einen dauert das lange genug, um die nachkonferenzliche Euphorie verfliegen zu lassen, zum anderen kommt dabei auch noch was Sinnvolles raus. Weiß man dann, welche Probleme man mit Rust lösen kann, kommen ein paar interne Projekte auf der grünen Wiese. Wenn die funktionieren, wird geschult und wenn dann ein Teilbereich eines Projekts aus den bestehenden Erfahrungen heraus am besten mit Rust umgesetzt wird, hat man das Know-How, die Leute und die Erfahrung, um auch Fehlschläge managen zu können.

c) dem Management

Wenn mein Management sieht, dass ich ich nicht abwehre nach dem Prinzip "kenn ich nicht, fress ich nicht", sondern dass ich mir auch Gedanken betriebswirtschaftlicher Natur gemacht habe - Risikoanalyse zB - dann haben sie alles, was sie für eine Entscheidung benötigen. Stell ich mich hin und sage "auf der einen Folie im Internet stand "Only way out [..of agile project (dis)management] is rigorous Release Management, but more then [sic!] ITIL V3.", deshalb sollten wir das nicht machen" dann habe ich a) den falschen Job und wenn das Management dann auch noch auf mich hört, haben b) die auch den falschen Job.

d) den Zuliefern

Zulieferer in dem Sinn haben wir nicht, wir stellen Software her, keine Autos. Teilweise hängen wir von Anbietern anderer Lösungen ab in dem Sinn, dass unsere Software mit deren kommunizieren muss. Ein aktuelles Projekt kommt mir dabei in den Sinn, wo unsere Software Daten verarbeiten und integrieren muss, die eine Reihe von Services eines Drittanbieters zur Verfügung stellt. Besagter Anbieter arbeitet agil, bzw glaubt das. Tatsächlich arbeitet er (aus meiner Sicht) einfach nur unorganisiert. Das führt dazu, dass wir als Konsumenten seiner Services so arbeiten: drei Wochen warten - neue Schnittstelle/neues Feature geht jetzt! - 3 Tage Arbeit - schade, die notwendige Schnittstelle xy tut noch nicht - drei Wochen warten und von vorn. Das ist frustrierend, bringt unseren Zeitplan und schlimmer noch den unseres Kunden durcheinander. Ich halte unseren Hintern aus Schwierigkeiten heraus, in dem ich immer klar kommuniziere, dass es hakt, wo es hakt, und wessen Zuständigkeit das ist. Zudem haben Kunde und ich eine Exit-Strategie ausgearbeitet, als sich langsam herauskristallisierte, wie das läuft. Ich werden den "Zulieferer" nicht überzeugen können, die Finger von Methode xy zu lassen, aber ich kann das Risiko erkennen und managen.

  1. Wie findest Du die wirklichen coolen, innovativen Entwicklungen, erstellt von den kreativsten Köpfen der Welt (den besten?!?) und erhälst Zugang? - Aka finding the underground and get in! - Denn diese sind die Letzten, die sich in der Öffenlichkeit stark produzieren, um sie zu finden. Das ist zwar eine sehr romantische Vorstellung - die des braven, bescheidenen Hackers, der im Hinterhof in der Garage von Mutti the next hot thing strickt und kein Interesse hat, groß per PR auf sich aufmerksam zu machen - aber keine sehr realistische.

Beobachte den Markt (Technologien UND die Konkurrenz). Ruh dich nicht aus. Probiere Dinge. Gib deinen Mitarbeitern die Chance, an etwas zu scheitern und alle davon lernen zu lassen, ohne sie dabei zu demotivieren. Widerstehe der Versuchung, etwas Funktionierendes in einer anderen Technologie von Grund auf neu zu entwickeln. Trau keiner Powerpoint-Folie. Hör auf deinen Justiziar.

Das wären so meine Tipps aus 25 Jahren Softwareentwicklung und PM.

HDD ist und war immer ein Run in das Mittelmaß!
S.u.a. Agiles M & D.

Da habe ich auch noch ein passendes Zitat.

Only a Sith deals in absolutes.

LaTino

22.04.2017 - 17:42 Uhr

Lesenswerter Artikel.

Hype Driven Development

LaTino

21.04.2017 - 05:48 Uhr

@FZelle, was du beschreibst, ist auch ziemlich genau die übliche Vorgehensweise hier im Haus (auch bei vorherigen AG wurde so oder ähnlich vorgegangen[1]). Ich muss zu meiner Schande gestehen, dass ich die entsprechende Stelle nicht parat habe, aber ich meine, mich zu erinnern, dass im agile manifest etwas in der Art "ganz oder gar nicht" erwähnt wird. Und das lässt sich auch gut begründen. (Vermutlich scheitern auch Projekte daran, dass die agilen Methoden nicht konsequent durchgezogen werden, oder wie Abt sagt, "gelebt" werden.) Insofern betrachte ich diese Art der Softwareentwicklung nicht als agil.

LaTino
[1] die einzelnen Teams - 3-6 Entwickler - entscheiden selbst, wie sie vorgehen. Wir haben welche, die machen scrum nach Lehrbuch, und welche, die eher starr vorgehen, und welche, die sich gar nicht groß organisieren. Kommt auf den Teamleiter an. Solang die Ergebnisse korrekt und rechtzeitig vorliegen, quatscht da auch keiner rein. Gab auch mal so Sachen wie "pair programming friday", fällt mir da ein...das könnte man mal aufleben lassen.

EDIT: mal spasseshalber geschaut: Extreme Programming
Von den Punkten bis "Evolutionäre Praktiken" benutzt mein Team 10 bis 11 (von 12). Dennoch arbeiten wir nicht agil, nur weil wir dieselben Methoden benutzen.

20.04.2017 - 14:20 Uhr

gfoidl:

Klar muss es bei jedem (professionellen) Projekt eine Vorgabe geben, aber diese erfolgt -- eben aufgrund der sich ändernden Anforderungen od. erst sich während der Entwicklung ergebenden (neuen, geänderten) Anforderungen -- eher durch eine Roadmap, einen Kosten- und Laufzeitrahmen. Hier ist dann Aufgabe des Projekt-Leiters dafür zu sorgen, dass die "must-haves" auch (z.B. iterativ) umgesetzt werden und während der Entwicklung zusammen mit dem Auftraggeber immer neu abgestimmt und priorisiert werden.

Und da ist schon der (ein) Knackpunkt bei agilen Methoden. Es gibt keine Grundlagen für ein Angebot. Wie soll man sich an einem Ausschreibungsverfahren beteiligen, wenn schon in der Natur der Sache liegt, dass man den Aufwand gar nicht abschätzen kann? Und woran macht man eine Vertragserfüllung fest? Wie schaut's mit Regress und Mängeln aus, woran macht man die am fertigen Werk juristisch sicher fest? Die agilen Konzepte haben darauf keine überzeugenden Antworten, finde ich. Ich will mich nicht unbedingt auf blaster's Seite schlagen - seine starken Meinungen werden mMn nur ungenügend mit Argumenten gestützt. Aber: man muss zur Kenntnis nehmen, dass in der Projektwelt sehr reichlich Vorurteile ggü agiler Softwareentwicklung bestehen[1], und dass nicht alle dieser Vorurteile unbegründet sind.

Ich selber nutze sehr gern einige Methoden und Konzepte, wenn es passt, aber ich würde deshalb nicht behaupten wollen, dass wir agile Softwareentwicklung betreiben.

LaTino
Anekdote am Rande: voriges Jahr, Ausschreibung eines Projektes mit einem enormen Budget (eher acht als sieben Stellen) und der Aussicht auf einen Fuß in der Tür. Bevor wir dort in Delegation auftauchen und unser Konzept vorstellen dürfen, muss ich von jedem Beteiligten ein Resümee abgeben. Und was passiert: alle mit Schwerpunkt auf Agile werden schlichtweg abgelehnt. Weder durften die mit zur Präsentation, noch weiter am Projekt beteiligt werden. Hat für die eine oder andere hochgezogene Augenbraue gesorgt, dem Projekt aber absolut nicht geschadet, soviel muss ich zugeben.

19.04.2017 - 19:10 Uhr

Agile Methoden - wie SCRUM, Cristal Clear oder XP sind Anfängerkramm.

Wow. Dazu fällt mir nichts mehr ein.

Vielleicht, weil du dich um überwiegenden Teil in der agilen Szene bewegst?

diese Meinung ist in Projekten durchaus nicht selten. Nach dem Motto "agile ist eine nette Idee, funktioniert nur leider nicht, sobald man eine gewisse Projektgröße erreicht." Das liegt mMn nicht am Konzept an sich, sondern an der gefühlt riesigen Masse gescheiterter agiler Projekte. Ich glaub nur, dass es ein Trugschluss ist, dass dieses Scheitern am Konzept liegt.

Wasserfall, V-Modell und Konsorten für "echte" Projekte, scrum für überfinanzierte, kurzlebige Webfrickel-Startups. Die Aussage würden vermutlich mehr als die Hälfte der Projektleiter aus meinem Bekanntenkreis sofort unterschreiben. Ich selber nur mit einem "kommt darauf an"-Vorbehalt.

LaTino

19.04.2017 - 14:21 Uhr

Geht bisschen vom Thema weg, aber ohne große Spezifikationen sind große Standards nicht definierbar (Kernapplikation ist das beste Beispiel, was mir dazu einfällt...das MUSS bis ins Kleinste spezifiziert/standardisiert sein, weil sonst jeder Akteur seine Suppe kocht und das Gesamtprojekt scheitern würde. Wenn man mal 5 Minuten Zeit hat: Die VDV-Kernapplikation herunterladen, beliebiges Dokument nehmen und reinschauen. Soweit ich mich erinnere, fand ich den Umgang mit UML gerade in der Spec ziemlich gelungen[1]).

Da kann man prima drüber streiten, schon klar. An den TE bleibt die Aussage: UML für Codegenerierung ist eine Idee, die sich nicht bewährt hat. Die Beschäftigung damit lohnt eher nicht.

LaTino
[1] heisst nicht, dass auf jeder zweiten Seite ein activity diagram ist. Bisschen stöbern lohnt.

19.04.2017 - 14:01 Uhr

Da muss ich ein bisschen widersprechen. Große Spezifikationen[1] beinhalten sehr gerne noch UML, insbesonders activity, use cases, interaction und state diagrams. Was selten geworden ist, ist das, worauf du hinauswillst: Versuche, Code direkt aus einem Klassendiagramm zu generieren. Es hat sich gezeigt, dass das meistens nicht so zielführend ist - Begründung liefert Abt ja.

UML ist aber mehr als nur das, und wie gesagt, für Dokumentation, Spezifikation, Architekturbeschreibung und dergleichen sind die entsprechenden Diagrammtypen sehr gut geeignet und werden auch benutzt.

LaTino
[1] Beispiele:
SAP (diverse Specs)
VDV KA (e-Ticketing, VDV-Kernapplikation)
etliche Specs aus dem Gesundheitsbereich
Logistikspezifikationen
...

19.04.2017 - 13:36 Uhr

Ich habe WSDL Files, bekomme aber keine Verbindung, weil kein Connect, URL zu finden ist.

Dieser Satz ergibt keinen Sinn.

https://msdn.microsoft.com/de-de/library/aa751905(v=vs.110).aspx

Dann:


using(var client = new GeneratedClient(myBinding, myEndpointAddress))
   return client.BasicDataQuery(myBasicDataQueryRequest);

(Namen der Operation und der Kommunikationsobjekte natürlich nur geraten, die entnimmst du - ebenso wie die Bindung und den Endpunkt - der WSDL bzw. eben der Konfiguration)

LaTino

19.04.2017 - 07:31 Uhr

Der Client sendet eine Anfrage, der Listener empfängt und sendet eine Antwort.
Deshalb wäre es nett als Anfangsbeispiel den HttpListener zu nehmen. (nicht den Web)

Sorry, aber ich halte das händische Bauen eines Clients/Servers mittels HttpListener für völligen Unfug. Das ist ein SOAP-Request, also nimm auch den SOAP-Weg, den .NET dir anbietet (= WCF). Alles andere ist unverhältnismäßig viel Aufwand. Wenn du an die WSDL rankommst (wovon ich ausgehe, wenn ich schon den Namensraum lese), kannst du sowohl Service als auch Client komplett durch tools zusammenbauen.

LaTino
EDIT: Leitfaden SAP XI / WSDL
EDIT 2: [Hinweis] Wie poste ich richtig?, Punkt 2.2.

13.04.2017 - 16:29 Uhr

Wenn man die Möglichkeit hat eine Exception zu vermeiden, dann vermeidet man dass, denn ein Exception-Handling ist aufwendig.

Exeption handling ist nicht aufwändig. Teuer ist alles, was zur Laufzeit im catch landet - daher so viel wie möglich abklopfen und nur "echte" Ausnahmen auch fangen.

LaTino
ich weiß, dass du das so meintest, der Satz war nur missverständlich 😃

11.04.2017 - 22:14 Uhr

Ich bin ziemlich sicher, dass broadcasting über (named) pipes nicht geht. Der von gfoidl vorgeschlagene Weg mit Wcf/UDP dürfte ganz gut geeignet sein.

LaTino

10.04.2017 - 13:20 Uhr

Du möchtest über die Lebenszeit deines Hauptfensters nur eine Instanz des Einstellungsfensters haben. Instanzvariable also, oder besser noch eine Property.



public class MainWindow : Window
{
    private SettingsWindow SettingsWindow { get; } = new SettingsWindow();


//...
    private void OnClickDingens(object sender, EventArgs e)
    {
        if(!SettingsWindow.IsVisible) SettingsWindow.Show();
        else SettingsWindow.Focus();
    }
}

Edit: @MrWasabi: ShowDialog ist besser, ja, löst aber sein Problem nicht, dass das Fenster jedes mal neu erstellt wird.

06.04.2017 - 07:45 Uhr

Uh, nein, eher nicht (heisst nicht, dass es so was nicht gibt, mir ist nur nichts bekannt). Es gibt ein paar Videotutorials im Netz, auch ein Projekt für Vier Gewinnt aus einer Vorlesungsreihe[1], aber die leiden alle unter denselben Problemen:

  • es sind Videos. Zum Nachvollziehen und Lernen (mMn) völlig ungeeignet.
  • es wird zwanghaft versucht, Entwurfsmuster an einem praktischen Beispiel zu erläutern, was dafür sorgt, dass das Ergebnis zumindest etwas, meistens aber völlig over-engineered ist und eben nicht mehr viel mit der Praxis zu tun hat.

Wenn man die Entwurfsmuster kennt und verinnerlicht hat, erkennt man auch Situationen, in denen man sie anwenden kann. Das ist eigentlich eine reine Erfahrungs/Übungssache. Was den Mangel an Lehrmaterial vielleicht ein bisschen erklärt. Schnapp dir ein Projekt, plane, organisiere, mach Fehler und lerne, wäre mein Rat 😃.

Grüße,

LaTino

[1] Hab's gefunden! https://www.youtube.com/watch?v=iX2hrsWsTT0

05.04.2017 - 13:45 Uhr

Freeman, Robson, Bates, Sierra: Head First Design Patterns.

Die Gang-Of-Four-Entwurfsmuster ausführlichst erklärt, begründet und anhand von praktischen Beispielen implementiert. Bonus: das Buch verwendet Java als Sprache, so dass man den Code der Beispiele nicht 1:1 übernehmen kann, sondern nachdenken und ihn anpassen muss. Hat sich gezeigt, dass auf die Weise sogar mehr hängenbleibt.

LaTino

04.04.2017 - 09:28 Uhr

Kommt auf's Schema an, ob das unsauber ist, nicht? Ist auch egal, Lösung hast du ja bereits.

LaTino

04.04.2017 - 09:10 Uhr

Es kommt nicht so richtig rüber, ob dein XML valide oder nicht ist. Was heisst "unsauber"? XML-Struktur in Ordnung, aber validiert nicht gegen das Schema? Oder wie?

Ansonsten hindert dich niemand, auf null zu prüfen. Und Convert.ToString() mit einem string-Argument aufzurufen, kommt mir bisschen überflüssig vor.


FeatureSet Parse(XElement element)
{
   return new FeatureSet
   {
          Name /*Properties PascalCase! */ = element.Element("name")?.Value ?? "defaultname",
          Type = element.Element("type")?.Value ?? "defaulttyp",
          SelfCenter = element.Element("usedGroups")?.Attribute("numberofUsedGroups")?.Value ?? "defaultdingens"
    };
}

var features = XDocument.Load(Filename).Root.Descendants("feature").Select(Parse).ToList();

EDIT: Ansonsten würde ich an deiner Stelle den Parser vergessen und stattdessen vernünftige XML-Deserialisierung betreiben.

LaTino

31.03.2017 - 15:27 Uhr

Sha256 gilt als sicheres hashing-Verfahren, Sha256 mit 2048bit-RSA gilt ebenfalls als geeigneter Signier-Algorithmus. Von der Seite her benutzt du schon geeignete Werkzeuge. An deiner Implementierung kommt mir ein Detail seltsam vor, aber das müsste ich mir noch genauer anschauen. So aus der hohlen Hand würde ich ohne Gewähr sagen: "passt".

LaTino

23.03.2017 - 11:08 Uhr

Also anhand der Skizze könnte ich nun nicht erkennen, dass der letzte Punkt eine andere X-Koordinate hat 😃

*lach* Nicht ganz falsch, ich meinte aber: wenn die Punkte sich durch eine Funktion interpolieren lassen können, dann muss man sie einfach nach x sortieren. Wenn dem nicht so ist, kann man davon ausgehen, dass auch die Abstandsermittlung für einige Fälle ein falsches Ergebnis liefert.

LaTino

23.03.2017 - 10:51 Uhr

Wenn deine Skizze tatsächlich dein Vorhaben abbildet, solltest du vielleicht einfach nach X-Koordinate sortieren, statt dich mit Abstandsberechnungen abzugeben.

LaTino

17.03.2017 - 14:18 Uhr

Für einen schnellen Blick ist die in VS eingebaute Codemetrik-Berechnung ja durchaus praktisch. Umso ärgerlicher, dass das für .net core-Projekte nicht verfügbar ist. Gibt's kleine, funktionierende Alternativen, die empfehlenswert sind?

LaTino

17.03.2017 - 13:57 Uhr

Man hätte einfach erwähnen können, dass es FromQuery und nicht FromUri heisst...
Zudem "einfach so" war es schon immer - machts aber nicht besser 😉

Darum ging's doch gar nicht. Ich hatte das ausdrücklich an Sir Rufo gerichtet, weil er übersehen hatte, dass es um ASP.NET Core ging, und in seinem Codeschnipsel "FromUri" schrieb.

Ich finds aber ausgesprochen nett, dass du glaubst, mir das alles erklären zu müssen 😄.

LaTino

17.03.2017 - 13:53 Uhr

@Abt verstehe ich nicht. FromUri gibt's in asp.net core nicht. Was an meiner Aussage war falsch?

17.03.2017 - 11:02 Uhr

@Sir Rufo, net core kennt kein FromUri. URL-Parameterübergabe funktioniert da einfach so [tm].

LaTino

17.03.2017 - 09:01 Uhr

'türlich tut sich da nichts. Du hast ja auch meinen Hinweis, dass du XNamespace benutzen sollst, ignoriert.

LaTino

17.03.2017 - 08:59 Uhr

Deshalb stand da ein "mMn". Wenn du das für unüblich hältst, ist das völlig ok. Ich habe die Veränderung des Zitats überhaupt nur erwähnt, weil alles andere unhöflich gewesen wäre 😃.

LaTino

17.03.2017 - 07:40 Uhr

Es ist üblich, den Body bei GET-Requests zu ignorieren [1]. Also solltest du da auch nix reinpacken. Abt hat schon geschrieben, wie Parameter (wie zB filter) übertragen werden:

Einschränkungen wie Filter macht man nicht über URL Segmente, sondern über Query-Parameter.
zB /api/persons/?Age=5

(Ich habe mir mal erlaubt, den letzten Slash einzufügen, der gehört da mMn hin).

LaTino
[1] https://groups.yahoo.com/neo/groups/rest-discuss/conversations/messages/9962 (Roy Fielding ist einer der Autoren von http und hat als einer der Ersten REST beschrieben, dem kann man das so glauben, denke ich 😉 )

17.03.2017 - 07:32 Uhr

Wenn du schon Linq To Xml nutzt:


XDocument.Parse(valueToModify).Root.Descendants("prefer").Select(p => p.Element("value")).ToList().ForEach(element => element.Value = newValue);

(Beispiel, du solltest XNamespace natürlich benutzen)

LaTino

16.03.2017 - 15:39 Uhr

C# ist Turing-vollständig. Das heisst, es geht prinzipiell alles (erst recht so simple Anforderungen).

Anhand der mageren Informationen tippe ich mal, dass MaskedTextbox deine Wünsche schon erfüllt.

LaTino

15.03.2017 - 12:00 Uhr

Hallo,

lies mal
>

ohmeingottohmeingottohmeingott

Originally .NET had no enum value for OSX and we returned Unix.
The, when it was introduced by microsoft, we tried to switch to the new value
but too much stuff broke. We never tried again ever since a couple of years ago.

'n Psychologe hätte zu dieser Art der Problembewältigung sicherlich ein, zwei Sachen zu sagen 😉.

LaTino

15.03.2017 - 10:36 Uhr

Antwort steht in der mono-faq.

Notice that as of Mono 2.2 the version returned on MacOS X is still 4 for legacy reasons, too much code was written between the time that the MacOSX value was introduced and the time that we wrote this text which has lead to a lot of user code in the wild to not cope with the newly introduced value.

(Was so als Gesamtaussage meine Vorurteile mono betreffend aufs Schönste bestätigt.)

LaTino
(for the record: OSX ist Unix, sogar zertifiziert)

14.03.2017 - 11:20 Uhr

Was du möchtest, ist den Inhalt der lokalen Variable, die deine ConstantExpression darstellt, richtig? Dh. du möchtest den Inhalt der Variable zu jenem Zeitpunkt auswerten. Diesen Vorgang (Auswerten des Inhalts zur Laufzeit) nennt man auch compiling. Mit anderen Worten: wenn du den Inhalt auswerten möchtest, musst du (zumindest die ConstantExpression) kompilieren. Anders geht's nicht, denn vorher ist deine ConstantExpression nichts weiter als der Verweis auf eine lokale Variable.

(und "langsam" ist relativ, by the way.)

Grüße,

LaTino

13.03.2017 - 13:55 Uhr

Weil die innere Schleife einen Index nimmt (im if: Array[zweiterItem + 1], der sonst für IndexOutOfRange-Fehler führen würde (weil +1 gerechnet wird).

Das ist also eine Besonderheit in diesem Fall, keine allgemein gültige Regel für verschachtelte Schleifen.

LaTino

13.03.2017 - 10:46 Uhr

Wieso invokest du mit einem Typ als sender?

10.03.2017 - 12:32 Uhr

? Ich hab's doch vorher nochmal erklärt und nachher dann nur mit Quelle belegt?

🤔

LaTino

10.03.2017 - 11:43 Uhr

Vielleicht noch was zu Deklaration/Initialisierung. Der Speicherbedarf eines Arrays ist feststehend - Anzahl der Elemente * Größe eines Elements. Wenn die Größe des Arrays bekannt ist (-> also erst bei der Initialisierung), wird der entsprechende Speicherbereich für das Array freigeräumt. In .NET wird zusätzlich der Inhalt dieses reservierten Speichers so gesetzt, dass jedes Element des Arrays auf den Wert von default(T) gesetzt wird.


var intArray = new int[10]; //-> alle Inhalte des Arrays sind sofort default(int), also 0.
var referenceArray = new MyClass[10]; // -> default von Referenztypen ist null, dh. in diesem Array steht 10 mal eine null

Dadurch entfällt die manuelle Initialisierung der Elemente des Arrays, die in anderen Sprachen notwendig ist.

Quelle: CSharp Language Specification, Kap. 1.8

An array is a data structure that contains a number of variables that are accessed through computed indices. The variables contained in an array, also called the elements of the array, are all of the same type, and this type is called the element type of the array.
Array types are reference types, and the declaration of an array variable simply sets aside space for a reference to an array instance. Actual array instances are created dynamically at run-time using the new operator. The new operation specifies the length of the new array instance, which is then fixed for the lifetime of the instance. The indices of the elements of an array range from 0 to Length - 1. The new operator automatically initializes the elements of an array to their default value, which, for example, is zero for all numeric types and null for all reference types.

Damit dürfte auch dieser Punkt deiner Lehrerin erschöpfend beantwortet sein 😉.

LaTino

10.03.2017 - 11:27 Uhr

Ich wähle MSDN und möchte lösen: DoWorkEventHandler.

LaTino

10.03.2017 - 11:15 Uhr

Noch in Beta:
Google Cloud Platform: your Next home in the cloud

LaTino
(überrascht mich, ich dachte, das hätten sie schon lange)