Suche Menschen die meinen C#-Code kritisieren!

Bachelor angewandte Informatik - digitale Medien udn Spieleentwicklung aber...
Wir hatten ein SemesterProgrammierung wo man uns beigebracht hat was "duubels" sind. *hust* was man heutzutage offenbar nichtmal mehr macht XD angeblich auch noch was über Java... Was aber am Ende auchkein Schwein konnte ders nicht schon vorher drauf hatte...
Dann haben wirn bisl was über Sortier- und Suchverfahren gelernt, irgendwas über Laufzeitberechnung und das wars. Von dem Zeug von hier hab ich NIE gehört. ich hab mir alles selbst beigebrahct über IntelliSense und nie ein Buch gelesen weil.. naja hab ich ja schon erklärt. Dann hatten wir noch was in KI wo der plötzlich ein Niveau angesetzt hat dem nur die asiaten folgen konnten, die Belege und Aufgaben mussten wir uns alle von den Genies schreiben lassen die das alles warscheinlich eh schon wussten, in den Projekten war ich einer von denen die die ganze Arbeit allein gemacht haben... Einmal sollten wir ein Eliza zusammenbauen und ich war so gelangweilt dass ich die ganzen Textverarbeitungsmethoden einfach selbst geschrieben habe XD

Ansonsten haben nochn paar Professoren n bisl über Spiele geredet, es gab viele Projekte wo wieder keine Sau was gelernt hat sondern jeder das gemacht hat was er schon konnte während schon im ersten Semester über 80% der Studenten abgegangen sind weil sie gemerkt haben dass der Zusatz "Spieleentwicklung" nur eine böse Falle war weil sie nicht sagen wollten "Mathe" XD das hatten wir gleich in 6facher ausführung... wozu Programmierpraxis es gibt ja Automatentheorie... schön trocken und immer schön mit auswendig lernen, wozu es bitte mit realen Anwendungen verknüpfen wie z.B. den Animationsmaschinen, die es in Unity gibt...

Oh Gott ich schwafle schon wieder XD ich könnte warscheinlich 200 Seiten darüber schreiben warum meine Hochschule ein Haufen von Idioten sind, es gibt zwei Professoren die ich respektiere weil die sich wenigstens bemühen modern zu sein, der Rest beschwert sich ständig dass wir Studierenden keinen Respekt vor denen haben, gleichzeitig ist es denen aber auch scheiß egal was wir denken, was wir einzuwenden haben oder was wir uns eventuell wünschen würden damit wir das Thema besser verstehen. Sagen immer "Studium heißt Selbststudium" und ich nur so "warum zur Hölle geh ich dann überhaupt hin?" vor allem wenn dieProfs ihre verdammten Vorlesungen aus Wikipedia klauen und von anderen Unis XD

Ich fühl mich so unvorbereitet auf meinen Beruf wie's nur irgendwie geht und wie diese Frage hier zeigt hab ich nichtmal nen Ansprechpartner der über meienn code drüber guckt und sagt "das ist gut, das ist scheiße, mach das mal so", weswegen ich jetzt euch arme Menschen bemühen muss, die ja wohl selbst noch reichlich zutun haben und selbst wenn nicht sicher besseres zutun haben als sich in den Unity-Code eines Neulings reinzulesen der Codelesbarkeit in seinem leben noch nie gehört hat und alles nur nach intuition macht XD
 
Crast schrieb:
Manche Aktionen, wie den Code zu formattieren, da musst du der IDE sagen, dass sie es machen soll (und wie).
Eine gute IDE hat in der Rubrik "Speichern" eine Option "Code Formatieren", die man einmalig per Hand anhaken sollte.

Kokujou schrieb:
Ich fühl mich so unvorbereitet auf meinen Beruf wie's nur irgendwie geht
Das liegt an dem "Studium". Willst du auf den Beruf besser vorbereitet sein, hättest du eine "Ausbildung" machen müssen. Das Studium vermittelt dir sehr viel Theorie und Hintergrundwissen (inkl. Mathe), so dass du auch verstehst, was du schreibst und eher für höhere Gehälterklassen geeignet bist als die ausgebildete Drone, die stumpf das runterschreibt was ihr vorgegeben wurde.
Ging mir nach meinem Studium auch so und hab dann in meinen 1. Job "mal eben so" C# gelernt (die Ähnlichkeit zum mir bekannten Java hat schon geholfen), inkl. ordentlicher Projektstrukturen (vorausgesetzt, es existiert schon eine, inkl. Mitarbeitern mit Erfahrung). Ich habe da in einem halben Jahr mehr praktisches Wissen vermittelt bekommen als in ein paar Jahren Studium.

Du bist da schon weiter, indem du dir das neben dem Studium noch selbst beibringst. Das musst du auch bei der Bewerbung raushängen lassen, dass du mehr kannst als der Bachelor vorsieht.
 
Darlis schrieb:
Eine gute IDE hat in der Rubrik "Speichern" eine Option "Code Formatieren", die man einmalig per Hand anhaken sollte.
Also wenn du das meinst was ich denke dann... Strg + K + D ist es bei Visual Studio aber das beschränkt sich eigentlich nur aufs Einrücken.

Infos zum Master
Und der Master der, um ehrlich zu sein, Informationsmanagement heißt, und nix mehr mit irgendwas zutun hat XD Der ist noch ne Stufe drunter. Wir lernen gerade Personal Information Management... Auf englisch weil unsere lieben russichen Mitbürger das so wollen *kein Kommentar*. Aber eigentlich ist in diesem Fach nichts relevant, das ist so als würde man dir aufs neue immer wieder sagen "2+2=4, 2+2=4" wtf? Ähnlich in Informationsvisualisierung wobei da das Thema zumindest interessant ist, aber das sind so selbstverständlihckeiten wie dass man multidimensionale Daten nicht in nem Scatter Plot darstellt und dass man verschiedene Eigenschaften zur Darstellung verschiedener Daten verwenden kann man dabei aber auf die menschliche Wahrnehmung achten muss, Farben, Formen, Größen, etc... Ich hab eh alles vergessen was ich je in diesem Studium gelernt habe und mich dann eben einfach auf meine Eigenausbildung konzentriert.

Problem beim eigenständigen Lernen
Das Problem dabei ist aber dass es eine Grenze gibt von dem was, ich zumindest, allein erreichen kann. Und die verdeutlicht dieser Thread. Hättet ihr jetzt nichts gesagt hätte ich meinen Code niemals verbessern vom Style her und hätte die Main.cs noch 3mal größer als sie ohnehin schon war XD Ich hab nur eingesehen, das abzudocken, was man in anderen Objekten platzieren kann/muss, also in der Szene. Wobei mir gerade auch eingefallen ist, dass man diverse statische Klassen auch durch die Komponenten lösen kann... mal gucken^^

Ganz besonders ist das aber bei Modellierung der Fall. Allem was Grafik betrifft. Ich wollte unbedingt mal in 3D-Modellierung reingucken, mal selbst ein paar Projekte machen, vielleicht auch noch was in Richtung Sound, weil ich mir bis jetzt immer alles was ich brauche aus google klaue. Gut ich will eh programmierer werden, aber erstens sammelt man Pluspunkte wenn man zumindest verständnis für den Arbeitsablauf anderer Abteilungen hat und es ist einfach interessant, vielleicht kann man so im äußersten Notfall wenn man Mitarbeiter ausfallen selbst einspringen, damits nicht komplett stehen bleibt. Ich habs ganz oft versucht mit allen Engines die ich dafür kenne und ich hab nichtmal ein Mokona hinbekommen (googlet es mal ist total putzig und eigentlich einfach zu modellieren) XD aber ich hatte einfach keine Ahnung und nach stundenlanger recherche hab ich dann aufgegeben.

Es sollte auch mal ein Modul geben, aber das ist natürlich immer wieder gestrichen worden. das einzige Modul weswegen ich dieses Studium unter anderem überhaupt begonnen habe XD Ain't Life a Bitch.

Vorwort
Aber gut vielleicht sollte ich aufhören hier rum zu lamentieren (vielleicht? XD) es geht ja um was ganz anderes :3 Also, nette Menschen die mir sagen dass ich alles falsch mache :3 wie gesagt SO grottig finde ich meinen Code jetzt auch nicht, wenn man die fette Update-Routine mal außer Acht lässt könnte man ja zumindest einen Blick auf die Datenstrukturen werfen... Außerdem möchte ich noch kurz erklären wie ich das mit dem Multiplayer löse, zumindest theoretisch das ist noch unausgereift, ich bin echt gespannt wie viele Bugs dasin der mobilen Version hat. Aber erstmal füge ich hier überschriften ein damit jeder sieht was er überspringen kann wenn ihm der Text zu lange wird. lustigerweise scheine ich es bei Texten besser zu schaffen dort Ordnung rein zu bringen ;)

Realisierung des Networkings
Zuerst mal habe ich das Unity Matchmaking benutzt, aber nicht weil ich das für sinnvoll hielt sondern einfach weil mir nichts anderes einfiel, ich wollte nämlich möglichst low-level arbeiten. Ich benutze es also nur (siehe NetworkScript.cs) einfach nur um eine Verbindung zu etablieren und die Clients aufzulisten. Ab dann gehe ich die Sache ohne die ganze Unity-Sache mit synchronisierten Objekten und Zuständen und Positionen an, stattdessen mache ich es, wie ihr sicher auch für sinnvoll halten werdet, einfach über Nachrichten.
Das Spiel startet indem man einen Kreis aus 12 Karten (PC) oder einen Fächer hat und aus dem wählt man eine KArte aus. Diese Karten werden aus einem Deck zufällig gezogen, das Deck wird aber vorher gemischt und alles was ich tue um zu synchronisieren ist den Random Seed hin und her zu schicken (den Teil mag ich besonders :p) weil Zufall ist ja gar nicht so zufällig, wie wir wissen.
Nun muss lediglich noch die gezogene Karteübers Netzwerk geschickt werden. sämtliche Animationen und die darauffolgende Szenenerstellung erfolgt wie üblich lokal.

Dann die nächste Szene, auch hier muss das Deck wieder synchronisiert werden und auch hier schicke ich lediglich wieder Nachrichten, diese beinhalten diesmal den Index der Karte in der Hand (ja ich weiß nicht sonderlich cheating-sicher aber ich hab eher die Neigung realitätsnah zu programmieren. Abgesehen davon wenn einer unbedingt cheaten will soll er doch XD die Mühe die er sich damit macht da verdient er's doch zu gewinnen :p aber weiter), außerdem noch, wenn er eine Karte im Feld ausgewählt hat, dann welche (das passiert wenn 2 Karten auf dme Feld liegen, bei 1 und 3 wird sofort eingesammelt und bei 0 aufs Feld gelegt). Und zuletzt noch dasselbe erneut für die Karte die vom Deck gezogen wird in jeder Runde. Was noch hinzukommt ist, falls ein Yaku erzielt wurde, dann ob man Koi Koi gesagt hat oder nicht. Das sind alles sehr sehr kleine Zahlenwerte, Speichertechnisch überlege ich schon ob es sinnvoller wäre das irgendwie direkt als bit-array zu machen XD oder zumindest als Byte-Array. kA wie da die möglihckeiten sind aber man hat ja maximal 8 Karten in der Hand und Integer gehen in die Milliarden ^^ Bei Netzwerken ist die Verringerung der Datenlast ja das mindeste. Allerdings im Punkto Ausfall-Optimierung, wenn mal einer instabiles Internet hat, weiß ich noch nicht wie ich das angehen soll

Kurzer Crashkurs in Hanafuda
Und um das Skript zu verstehen muss man das Spiel verstehen. Eigentlich ist es sehr einfach:
12 Monate a 4 Karten. Jede Karten hat außerdem eins von vier Motiven: Landschaften, Tiere, Karten und Lichter. Jeder Spieler hat 8 Karten + 8 Karten auf dem Feld und der Rest ist im Deck. Man kann Karten vom Feld einsammeln wenn sie den gleichen Monat haben und das Motiv entscheidet darüber, welchen Yaku man hat. Yaku sind bestimmte Kombinationen von Motiv-Karten oder speziellen Karten wie z.B. dem Ino-Shika-Chou Yaku (Wildschwein, Hirsch und Schmetterlinge). Ein Yaku gibt eine bestimmte Anzahl punkte und hat man einen, kann man entweder das Spiel beenden, oder man sagt "Koi Koi" (Jap. "Komm doch") und kriegt Bonuspunkte, kann weiter sammeln. Allerdings gehen alle Punkte verloren wenn der andere das Spiel beendet.
Ist der Zug beendet legt man eine KArte vom Deck aufs Feld und kann dann nochmal Karten einsammeln die vom Monat her passen.

Das Spiel hat nur genau 8 Züge ich hab schon überlegt ne KI zu bauen die den kompletten 8-stufigen Zustandsbaum zur Laufzeit aufstellt, natürlich grob gekürzt. Könnte sich vielleicht lohnen ;)

So genug geschwafelt XD
 
Wieso wechselst du nicht auf ne andere Uni/FH? Dann kannst genau die Fächer haben, die dich interessieren...
 
  • Gefällt mir
Reaktionen: BeBur
Kokujou schrieb:
Also wenn du das meinst was ich denke dann... Strg + K + D ist es bei Visual Studio aber das beschränkt sich eigentlich nur aufs Einrücken.
Ja, das ist die Tastenkombi dazu. Neben dem Einrücken wird da aber schon etwas mehr gemacht.
In der aktuellen Version von VS sind auch weitere (experimentelle) Code-Cleanup-Optionen dazu gekommen. Damit kannst du quasi Code hinrotzen und VS formatiert den leserlich. Findest du unter Text-Editor/C#/Codeformat/Formatierung
 
Das guck ich mir mal an. Resharper war aktuell eher weniger Hilfreich, die Hälfte der fehler die er angekreidet hat stimmten gar nicht XD obwohl er hat schon geholfen ich hatte ein paar unschöne Dinge drinne wie dass ich bereits existierende Namen verwendet habe..... Bugquelle #1 XD

die FH Köthen war die einzige die in greifbarer Nähe war, finanzierbar war und die vom Namen her angeboten hat was ich wollte... und die Modulnamen haben auch gestimmt zumindest bei 30%... Ich sag's ja das war ne ganz gemeine Falle! Ist ja auch ne Kostenfrage. Ich hab ja hier ne Wohnung die ich kostenlos beziehen kann dank meinen Eltern. Das nächstbeste wäre in Halle gewesen aber wenn man irgendwas studieren will dass tatsächlich mit Spielen zutun hat blecht man gerne mal ein paar Tausend Euro für Semestergebühren hab ich mir sagen lassen, da schien mir die HSA die beste Alternative zu sein... *hust* von wegen *hust* und als ich dann im 3. Semester gemerkt habe dass das nichtmal Ansatzweise so sein wird wie ich mir das gehofft hatte, hab ich mir gedacht jetzt abbrechen und fast 2 Jahre verlieren? Ne! da zieh ich lieber durch... Viele haben aber halt genau das gemacht oder sind direkt in den Job gesprungen.
 
Da ich weiß, wie gern du eine "wall of text" liebst und du mich dafür vermutlich schon hasst... hier die nächste mit meinen Anmerkungen. Sie sind definitiv nicht vollständig und sind vermutlich an einen etwas älteren Stand deines Codes gerichtet. Außerdem sind manches persönliche Präferenzen.

Projekstruktur
- Ich würde die PSD-Dateien separat vom Code halten, aus zwei Gründen. 1) damit kannst du dein VCS einen Gefallen tun. Die meisten kommen mit so großen Dateien nicht gut zurecht. Bei git gibt es eine Abhilfe mit LFS (Large File Support). Allerdings ist die Versionierung von Nicht-Textbasierenden-Dateien oft ein etwas kontroverses Thema. 2) Trifft bei dir nur bedingt zu: Die meisten Entwickler scheren sich einen Dreck um PSD-Dateien, da sie von den Designern die entsprechenden Exporte kriegen. Von daher nur in das Projekt packen was auch wirklich dort rein muss.

Code
- Zuviele Ebenen! Versuch innerhalb einer Methode 2 bis 3 Ebenen tief zugehen. Brauchst du mehr, schreibst du eine neue (private) Methode. (Hatten wir ja bereitsmehrfach)

- So offen (public) wie nötig, so geschlossen (private) wie möglich. Ich habe einige Publics gefunden, sowohl Felder als auch Methoden, die hätten privat sein können. Du kannst so verhindern, dass ungewollt Methoden aufgerufen werden die das Objekt unerwartet verändern oder sonstige Side Effects haben.

- Getter und Setter. Felder sind dafür da, Daten zu kapseln. Erlaubt man offenen Zugriff auf sie, läuft man in die Gefahr ein Objekt so zu verändern, dass es nicht mehr dem entspricht was es sein soll. Mit Gettern und Settern kann man viele tolle Sachen machen. Z. B: Immutable Objects oder überprüfen ob die neuen Werte valide sind.

- Magic Numbers (hard coded value). Die wenigsten Werte sind selbsterlkärend. Es bitet sic mehr an Konstanten dafür zu verwenden. Ebenfalls können somit Typos verhindert werden.

- Strings bzw Zahlen übergeben um bestimmten Code aus zu führen. Es ist besser diese Weerte als Konstanten bereitzustellen der direkt Funktionen zu übergeben. Somit verhindert man Typos und die Bedeutung des Wertes steht mehr im Fokus als der Wert selbst. Dafür bieten sich Enums sehr an. Genauso kann man abstrakte Klassen und Interfaces nutzen um ein Objekt zu übergeen, wo man eine Methode von aufruft, statt jedesmal zu entscheiden was gemacht werden soll.

- Einheitlichkeit. Manchmal definierst du mehrere Variablen in einer Zeile, manchmal alles separat. Mal fangen Variablennamen klein, mal groß an. Hält man seinen Code einheitlich wirkt er viel sauberer und man findet eher Bugs. Aber auch das Thema hatten wir schon das ein oder andere mal.

- Kürzere Methoden, dafür mehr. Manche deiner Methoden strecken sich über mehr als 100 Zeilen. Da versteht niemand was geschieht. Ich würde auch behaupten in einer Woche wüsstest du es auch schon nicht mehr. Daher lieber mehrere Methoden mit einen guten Namen lals eine so lange. Besonders bei Switch-Blöcken kann man das leicht umsetzen.
Jede Operation in einem Block wird ausgelagert und die Entsprechenden Werte werden als Parameter übergeben. Ich habe auch einige Stellen gesehen wo du Oberhalt von If-Else-Blöcken ein Kommentar gemacht hast, was der folgende Block macht. das sind Stellen wo du neue Methoden nutzen kannst.

- Geschweifte Klammern. Viele deiner einzeiligen IF-Blöcke haben keine geschweiften Klammern. Ja es ist möglich. Aber es ist sehr Fehler anfällig.

- Auskommentierter Code. Ich persönlich bin der Ansicht, dass Auskommentierter Code nicht da sein sollte. Handelt es sich um alten Code, dann sollte man ihn löschen. Brauch man ihn wieder hat man ein VCS. Handelt es sich um neuen Code, der noch nicht genutzt werden soll, dann hat man ein VCS und packt den Code in einen anderen Branch. Ist es Code der zum Testen auskommentiert ist oder Debug-Logs enthält gerade nur stören oder man gerade an ihm arbeitet, dann kann er meinet wegen bestehen, aber nicht länger als ein paar rbeitseinheiten. Und vor dem nächsten Commit gehört er raus.

- Lange Conditions. Einige deiner Bedinungen in IF/Else-If sind sehr lang und recht komplex, da bietet es sich ebenfalls an Methoden zuschreiben um sie zuvereinfaachen, bzw die Booleans (logisch gruppiert) in Variablen zu speichern.

- Patterns für Probleme wie Singeltons verwenden.Ich persönlich mag diese Seite: https://www.philipphauer.de/study/se/design-pattern.php.
Alternativ das Buch Design Patterns von GoF, auch wenn es etwas älter ist.

- Die Schlüssel wörter seal und readonly verwenden um den Werte und Klassen zu schützen.
 
  • Gefällt mir
Reaktionen: CitroenDsVier, areiland und Kokujou
Uii ich freu mich~

Dann chronologisch: PSD-dateien? Ich hab PSD-Dateien? Sind das nicht Photoshop Dateien? Ich hab nie mit Photoshop gearbeitet. höchstens mal mit Gimp und da hab ich die Dateien sofort weggeshcmissen und nur das ertige bild rein gemacht, die meiste Grafik hab ich mir irgendwo zusammengeklaut :o wie dus so schön geschrieben hast ich scher mich nen dreck drum :p Aber gut ich dachte immer mit Git soll man das ganze Projekt iwie ständig backuppen.... aber wenns nur der cod esein soll das kriegich ja eventuell noch hin... ich finds nur extrem scheiße dass man bei git nicht sagen kann "nimm die Dateien in Ordner xy und benutze die für dich" nein stattdessen legt der immer nen eigenen ordner an. Frechheit eigentlich.

Mit ebenen meinst du... if(){if(){if(){}}} und so weiter?

Ehrlich gesagt fänd ich's fast besser wenn public der Standard wäre und ich den Leuten lieber sage wenns mal privat sein soll XD aber ganz ehrlich hab ich mich nie mit Zugriffsmods beschäftigt. Nur mal kurz überlesen was sie bedeuten aber wie man sie jetz einsetzt...
Also privat ist ja glaub nur innerhalb der Klasse, öffentlich überall, dann gibts noch iwie internal, das kann vom selben... namespace oder so aufgerufen werden und protected, das hab ich gar nicht kapiert. Aber OK mehr private - notiert :3

Ich habe ja ein paar getter und setter drinne aber viele Variablen brauchen so eine Beschränkung eigentlich gar nicht. Besonders im Rahmen der UI habe ich glaub einen getter und setter der die Variable limitiert, sodass sie nur von einem Bidlschirmrand zum anderen animiert wird z.B. und ich so auch bequem Infinity reinschreiben kann ohne mir den genauen Wert merken zu müssen :p Aber bei vielen ist das gar nicht nötig, die Vorteile davonk enne ich aber danke :)

Okay Magic Numbers als Konstanten wie const oder denkst du da an was anderes? früher gabs da noch iwas mit define oder so... und pragma XD egal. Aber was das jetzt mit Typos, also Rechtschreibfehlern zutun hat...

Bei dem nächsten Abschnitt bin ich mir nicht ganz sicher was du meinst, könntest du dir da vielleicht ne Kleinigkeit rauspicken und es demonstrativ umschreiben? nur son kleinen 3-4 Zeiler oder so, was kleines damits deutlich wird.

Ja die Konsistenz... das ist der typische Effekt wenn man während dem Arbeiten dazu lernt, so wie ich jetzt immer lieber diese ?: operatoren mag statt es über if/else zuregeln. Hat mir der Resharper auch mal angekreidt, ich dachte drauf :)

Ich werd mal versuchen ne Art Blaupausenmethode einzubauen, also ne Methode wo quasi größtenteils textbasiert der grobe Auflauf geschrieben wird und dann die Funktionen den eigentlichen code machen sodass man nur diese Blaupausen Methode lesen muss und sich bei den anderen schon seinen Teil denkt...
Das wäre dann sowas wie:
if(GameStarted)
CheckPlayerMove()
if(SelectHandCard)
{
HoverCard();
HoverField();
}
if(ClickOnHandCard)
PlayCard(...);
usw, würde dir sowas eher zusagen?

Warum fehleranfällig? Bei Einzeilern kann man sich die geschweiften Klammern gut schenkenund ich finde das liest sich so ganz gut, geschweifte Klammern wären nach der Logik fast eher ein hinweis darauf da ne Methode abkapseln zu können XD Manchmal schreib ich alles sogar in eine Zeile wenns nicht zu lang wird.

Ich hab ja eben noch kein VCS daran arbeite ich gerade^^ Ja genau sowas ist es aber. es ist Code der unter umständen Fehlerfreier ist als der jetzige und genau so eine Art von Aktion sollte ja durch Git, so ich es rigendwann jemals zum Laufen kriege ohne mir vorher das Leben zu nehmen (sorry übertreibung), gelöst werden.

Also das Speichern in Variablen das sehe ich noch ein, aber... Ganz ehrlich Methoden? Ich find die langen ifs auch schrecklich und ich würde zustimmen wenn man mehrere dieser Sammlungen in einer Funktion unterbringen könnte, die man dann mit Argumenten leicht abwandelt, das würde ich auf jeden Fall noch ummodeln, aber für jedes dieser langen Teile eine neue Funktion? dann findest du dich bald vor lauter funtkionen nicht mehr zurecht... Das ist auch immer mein Bedenken, ob ich nun haufenweise Funktionen reinflacke oder alles in einer langen reinschreibe, klar ein bischen besser ist es schon, aber auch nicht viel besser. Kennst du irgendeine Konvention in der man noch weiter Abdocken kann? Die Funktionen in ne andere klasse z.B. auslagern? in ne andere .cs Datei?

Und das mit dem seal und readonly musst du mir erklären da hat Resharper auch mal gemeckert aber ich hab immer das Problemweil ich ja der einzige bin der das benutzt das schränkt mich im Denken etwas ein ^^

Danke erstmal für dein tolles Feedback das wird mir sehr nützen :3 So n paar tipps zur Performance-Steigerung wären zwar noch toller gewesen aber man wer weiß vielleicht ist mein Code der performanteste code überhaupt und ich bin abgesehen von meiner Code-Sauklaue ein Superprogrammierer :p Man darf ja noch träumen.

Zuletzt eine kleine Feststellung: Ich hab nichts gegen Walls of Text solange ich dabei Mitdenke. Bücher, Vorlesungen die alle wollen nicht dass ich mitdenke die wollen nur dass ich wissen aufsauge. Bei deinem text aber konnte ich mir die einzelnen Punkte durchlesen, darüber nachdenken was du damit meinst, wie das auf meinen code passt und ob ich die aÄnderungen so annehmen oder abändere, oder ob das was du da bemerkt hast an einigens tellen sogar meiner Meinung nach eine Berechtigung hat. In ner Vorlesung heißt es ja nur "ich rede also Klappe" und bei Büchern ist es noch schlimmer. Schlimstenfalls verbunden mit der überaus redundatnten Arbeit den inhalt aus den büchern wiedergeben zu müssen anstatt dass er einfach selbst das Buch liest XD Generell hasse ich Bücher. Aus dem einfachen Grund dass so ziemlich jedes Sachbuch von 100 Seiten auf eine reduziert werden könnte weil ständig nur drumrumgeschwafelt wird. Darum frage ich auch lieber in Foren weil mir hier die menschen einfach die Fakten ins Gesicht sagen.
Ich will nix über die Geschichte wissen, ich will auch keine Studien die das Belegen, es ist so. Punkt. Ausrufezeichen. Deswegen kann ich Dokumentationen schon besser lesen, weil man da den Text bequem überlesen kann und stattdessen sofort zu den Beispielcodes kommt oder die kleine Erläuterung unter der Variable liest. "Diese Funktion macht dies und dies" Kurz, Prägnant. ein Buch wäre da eher so: "Im jahre 1872 erschu Richard Schmidt die den Begriff *** der sich dann im Jahre 1928 als Standardformulierung für Variable yz eingeprägt hat die heutzutage mehrere bedeutungen haben kann" blablabla... Immer wenn ich vor einem buch sitze wache ich plötzlich nach einer Stunde auf und stelle fest ich hatte einen Blackout. Und das ist diesmal nicht übertrieben.
 
Kokujou schrieb:
Sind das nicht Photoshop Dateien? Ich hab nie mit Photoshop gearbeitet.
Ja sind es. Habe dort welche im Projekt gesehen. Eventuell von einer deiner Assets?

Kokujou schrieb:
Mit ebenen meinst du... if(){if(){if(){}}} und so weiter?
ja, alles was Blöcke besitzt, if, if else, for, switch, ...
Diese Blöcke können super als Methode ausgelagert werden. Wenn es nur um eine Handvoll Zeilen geht, ist es kein muss, aber wenn ein Block 10+ Zeilen hat, dann kann man das was dort geschieht zusammen fassen, besonders wenn es zusammen hängt

Kokujou schrieb:
Ehrlich gesagt fänd ich's fast besser wenn public der Standard wäre und ich den Leuten lieber sage wenns mal privat sein soll XD
Auf wunsch kriegst du gerne dazu eine weiter "wall of text" :) Also wieso weshalb warum.

Kokujou schrieb:
Okay Magic Numbers als Konstanten wie const oder denkst du da an was anderes? früher gabs da noch iwas mit define oder so... und pragma XD egal. Aber was das jetzt mit Typos, also Rechtschreibfehlern zutun hat...
Enums, const, einfache Variablen, alles was dich davon abhält Strings oder Zahlen zu übergeben.
Wieso es gegen Typos schützt? Angenommen du übergibst den wert "Funny Mode" an 3 Stellen. an einer schreibst du jetzt "Funy Mode", schon wird dein ganzer Code nicht funktionieren. Das selbe gilt für Zahlen.

Kokujou schrieb:
Bei dem nächsten Abschnitt bin ich mir nicht ganz sicher was du meinst, könntest du dir da vielleicht ne Kleinigkeit rauspicken und es demonstrativ umschreiben? nur son kleinen 3-4 Zeiler oder so, was kleines damits deutlich wird.
Aber natürlich! In deiner Main übergibst du die Zahlen 0, 1 und 2 um den Game Mode auszuwählen.
Eine schönere Option, die auch mehr mit OOP zutun hat, wäre eine abstrakte Klasse Gamemode zuhaben, von der deine einzelnen Modis erben. Statt 0 übergibst du dann z. B. deinen Standard-Mode als Instanz. Verständlicher oder mehr Ausführung?

Kokujou schrieb:
Im allgemeinen heißen die "ternäre Operatoren". Sie sind hilfreich und ich persönlich nutze sie auch oft. Gibt aber einige Leute die es als "schlechten Code" bezeichnen. Es ist also Them wo die Meinunen auseinander gehen.

Kokujou schrieb:
usw, würde dir sowas eher zusagen?
Genau das meinte ich! Im nächsten Schritt, um mehr OOP zu haben kann man das auch los werden, aber das ist schonmal ein Schritt in die richtige Richtung!

Kokujou schrieb:
Warum fehleranfällig? Bei Einzeilern kann man sich die geschweiften Klammern gut schenkenund ich finde das liest sich so ganz gut, geschweifte Klammern wären nach der Logik fast eher ein hinweis darauf da ne Methode abkapseln zu können XD Manchmal schreib ich alles sogar in eine Zeile wenns nicht zu lang wird.
Es gibt mehrer Stellen wo man aufgrund von Unaufmerksamkeit Probleme hat.
Beispiel #1: Du möchtest noch eine weiteren Aufruf einfügen, überisehst aber die fehlenden Klammern (fügst also keine hinzu) und wunderst dich, weshalb sich das Programm nicht wie erwartet verhält.
Beispiel #2: Du löscht den Body eines solchen Blocks, vergisst aber ebenfalls die Bedinung zu entfernen, weshalb die nachfolgende Anweisung automatisch nur beim erfüllen der Bedinung ausgeführt wird.

Kokujou schrieb:
Ich hab ja eben noch kein VCS daran arbeite ich gerade^^ Ja genau sowas ist es aber. es ist Code der unter umständen Fehlerfreier ist als der jetzige und genau so eine Art von Aktion sollte ja durch Git, so ich es rigendwann jemals zum Laufen kriege ohne mir vorher das Leben zu nehmen (sorry übertreibung), gelöst werden.
Auf wunsch kann ich dir gerne dabei helfen.

Kokujou schrieb:
aber für jedes dieser langen Teile eine neue Funktion?
Mit der Zeit kriegt man ein Gespür was gut ausgelagert werden kann und was man lieber zusammen lässt. Und alles nur auslagern ist auch der falsche Weg, das stimmt.

Kokujou schrieb:
Kennst du irgendeine Konvention in der man noch weiter Abdocken kann? Die Funktionen in ne andere klasse z.B. auslagern? in ne andere .cs Datei?
Das Paradigma das du suchst, kennst du bereits. Es nennt sich OOP. Ich brauchte sehr lange bis ich wirklich anfing "in Objekten" zu denken und würde behaupten, dass ich noch sehr viel Luft nach oben habe.
Ein anderes Paradigma, was dir helfen könnte wäre FP. Man kann einige Paradigmen miteinander verheiraten ohne die Regeln von einem zu verletzen.

Kokujou schrieb:
Und das mit dem seal und readonly musst du mir erklären da hat Resharper auch mal gemeckert aber ich hab immer das Problemweil ich ja der einzige bin der das benutzt das schränkt mich im Denken etwas ein ^^
Du holst dir aus einer Datenbank ein Objekt mit folgender Struktur:
Code:
Entity
----------
+ Id: Number
+ Name: String
In deiner Datenbank ist Id der Primärschlüssel, demnach darf sich das Feld Id nicht ändern, da du sonst das Objekt in der Datenbank nicht mehr aktualisieren kannst.
Da hilft dir z. B. der Modifier readonly, da er es dir verbietet diesen Wert zuändern. Es schränkt dich also ein, damit du keinen Fehler machst. Würdest du Id und Name ändern, würdest du in der Datenbank einen ganz anderen Eintrag ändern.
Der Modifier seal ist für Klassen interessant. Z. B. stellst du eine Schnittstelle bereit. Ein Nutzer (das kannst auch du selbst sein), erstellt eine Klasse die von einer deiner API-Klassen erbt, mit seal kannst du verhindern, dass z. B. öffentliche Methoden überschrieben werden. Verbietest also dem Nutzer irgendwelchen Mist mit deinen Sachen zu machen.

Kokujou schrieb:
Danke erstmal für dein tolles Feedback das wird mir sehr nützen :3 So n paar tipps zur Performance-Steigerung wären zwar noch toller gewesen
Auch wenn es wohl eher in den Bereich "micro-optimisation" fällt...
Hier findest du Tipps zum Thema String concatenation.
Wenn dir Performance so wichtig ist, nutz Profilers um Probleme zu finden.
Man kann auch Aufgaben parallelisieren mit Hilfe von Threads (aber da kann man sehr schnell auch zu Problemen kommen, wenn z. B. zwei Threads mit dem gleichen Objekt arbeiten wollen).
 
Oh ja in meinem Bachelor hab ich viel mit Parallelisierung gearbeitet...
ich meld mich nur kurz um "gelesen" zu sagen, aber ich muss jetz gleich ins Bett darum antworte ich morgen gegen Abend wenn ich aus der Schule des Bösen komme XD danke schonmal dass du dir die ganze Zeit nimmst!
 
Okay also ICH habe keine Photoshop-Dateien die sind wohl von einem Asset-Import, da pfusche ich mal lieber nicht rum. In Unity kann man bestimte Pakete importieren, Grafiken, Prefabs, alles sowas. Das was du glaube ich meintest waren UI-Grafiken, interne.

Okay zu dem private/public thema würde ich dann doch ne vielleicht etwas kürzer geartete antwort haben wllen... Obwohl ich mir schon denken kann dass es etwas mit externen zugriffen zutunhat, wenn nur ich draufgucke ist es ja egla weil ich weiß wie die Teile verwendet werden sollen, aber wenn andere an irgendwelchen variablen rumpfuschen... joa XD

Ah jetzt weiß ich was du mit den Magic Numbers meinst! Danke! Gute Idee!

Etwas mehr Ausfürhung vielleicht mit Beispielcode das wäre super... muss nicht unbedingt auf meinen code bezogen sein... Was in den verschiedenen Modi passiert sind ja funktionen...
redest du jetzt von sowas wie
class GameMode {...}
und dann sowas wie:
class NormalMode : GameMode { void Execute(); }
oder wie darf ich mir das vorstellen?
Ich hatte irgendwo auch was ähnliches geschrieben unvollendet... das ist bei meinen KIs der Fall gewesen... da hattte ich eine Funktion die Ausgeführt wird der aber verschiedene delegate übergeben werden können, für den Schwierigkeitsgrad glaube... Es war in der Cards.cs, die datei die ich noch nicht überarbeitet habe im konstruktor der KI-Klasse, wo ich eine Variable für ne Funktion deklariere und der dann verschiedene Funktionen zuweise die ich am Ende ausführe. Wäre das auch ne Möglichkeit oder ist mit Klassen die beste Lösung?

Okay und wie sähe von dieser nun wirklich minimalistischen Variante der nächste Schritt aus?

Nagut aber durch die automatische Code-Einrückung passiert sowas eigentlich nicht... wenn das jetzt alos kein schlechter Stil ist sondern es nur darum geht mich selbst nicht zu behindern würde ich es direkt so lassen, ich finds einfach doof weil jede Klammer ja ne eigene Zeile ist XD ich will meinen Code ja kürzen, nicht verlängern

Ja das wäre Super wenn du mir sagen könntest wie ich bei Git es schaffe einen existierenden nicht-Git-Ordner als Ziel für die versionierung auszuwählen würde mir das völlig reichen! XD Offenbar krieg ich das auch iwie in visual stuudio integriert und jetzt krieg ichs nicht mehr weg weil ich mal wieder das ganze Projekt damit gemacht habe und... die Folgen kannst du dir vorstellen bei 1GB pro Version

Okay erstmal was heißt FP? Und... Ich wollte eigentlich nur wissen wohin mit den abgedockten Funktionen ob ich jetz ne Klasse mache wo ich Funktionen sammle... möglichst so dass ich sie nicht statisch machen muss XD Denn das ist ja wieder nicht OOP

Okay also ist seal und readonly quasi eher für Teamarbeiten oder wenn ich meinen cod ezur Verfügung stelle aber wie immer etwas dass ich mir jetzt schonmal aneignen sollte OK^^

Wenn's keine Umstände macht kannst du mir ja kurz erklären wo ich bei Visual Studio den Profiler finde das spart mir das Suchen^^

Oh und eine Frage fällt mir außerdem noch ein... Der ach so böse Stil von statischen Funktionen...
Warum ist das so ein schlechter Stil ich meine ich benutze ständig irgendwelche statischen Funktionen von anderen Namespaces wie z.B. System.Convert.To***.
Ich sehe ein dass wenn ich jetzt ein Card-Objekt als parameter überegebe ich das genauso gut als Funktion in die Klasse integrieren kann und dann card.Funktion() aufrufen kann, aber bei anderen dingen wie z.B. der gameObject-Klasse und anderen Objekten die bereits gegeben sind kann ich das nicht machen, wie weicht man da denn bitte der Statik aus? GameObject kann ich z.b. nicht überschreiben und auch nicht vererben was besonders Ärgerlich war da ich es mit meiner Card-Klasse verknüpfen wollte und das nun nur ging, indem ich eine Komponente hinzufüge.
 
Statische Methoden/Klassen erschweren Unit Tests, außerdem lassen sich so z.B. keine Erweiterungsmethoden schreiben. Merke dir das es immer Ausnahmen solcher der Regel gibt. In den alles meisten Fällen erschweren statische Methoden/Klassen aber die Arbeit.
 
Also dass sie es schwerer machen höre ich zum ersten Mal. Bisher dachte ich es ist einfach nur schlechter Stil...
Habt ihr dann vielleicht ein paar Tipps wie man sie loswerden kann?

Wir haben ja bereits gesagt dass eine Möglichkeit über das übergeben einer Klasse an Funktionen ist, wenn ich die Lösung richtig verstanden habe. Und dann natürlich über die Erstellung von instanzen bzw. die Zuweisung der Variablen zu den Klassen. Gibt's da noch mehr Tricks falls diese aus irgendwelchen Gründen nicht anwendbar sind?
 
Kokujou schrieb:
Okay zu dem private/public thema würde ich dann doch ne vielleicht etwas kürzer geartete antwort haben wllen... Obwohl ich mir schon denken kann dass es etwas mit externen zugriffen zutunhat, wenn nur ich draufgucke ist es ja egla weil ich weiß wie die Teile verwendet werden sollen, aber wenn andere an irgendwelchen variablen rumpfuschen... joa XD
Auch wenn nur du drauf schaust ist es nicht egal. Nach einer Woche, spätestens einen Monat wirst du nicht mehr wissen, ob du die Funktion öffentlich nutzen wolltest.
Aber davon ab: Es zwingt dich besseren Code zu schreiben. Eine Variable ist private, möchtest aber Zugriff haben? Unsauber: du stellst sie auf public. Sauber: du erzeugst einen Getter der verhindert, dass die Referenz geändert werden kann. (Beispiel trifft nicht auf alle Sprachen zu!)

Kokujou schrieb:
Etwas mehr Ausfürhung vielleicht mit Beispielcode das wäre super...
Wenn meiner keiner zuvor kommt, werde ich demnächst für dich ein schönes Beispiel mit ordentlichen Diagrammen erstellen. Denke heute oder morgen abend.

Kokujou schrieb:
Okay und wie sähe von dieser nun wirklich minimalistischen Variante der nächste Schritt aus?
Worauf beziehst du dich hier?

Kokujou schrieb:
Nagut aber durch die automatische Code-Einrückung passiert sowas eigentlich nicht... wenn das jetzt alos kein schlechter Stil ist sondern es nur darum geht mich selbst nicht zu behindern würde ich es direkt so lassen, ich finds einfach doof weil jede Klammer ja ne eigene Zeile ist XD ich will meinen Code ja kürzen, nicht verlängern
Dein Code wird nur optisch dadurch länger. aber wenn es dir darum geht, möglichst wenig Zeilen zu haben: schreib alles in einer Datei mit einer Zeile.

Kokujou schrieb:
Ja das wäre Super wenn du mir sagen könntest wie ich bei Git es schaffe einen existierenden nicht-Git-Ordner als Ziel für die versionierung auszuwählen würde mir das völlig reichen! XD Offenbar krieg ich das auch iwie in visual stuudio integriert und jetzt krieg ichs nicht mehr weg weil ich mal wieder das ganze Projekt damit gemacht habe und... die Folgen kannst du dir vorstellen bei 1GB pro Version
schreibe dir eine PM, da klären wir dass dann.

Kokujou schrieb:
Okay erstmal was heißt FP?
Functional Programming. Ebenfalls wie OOP eine Paradigma.
Ein Teil davon ist, dass Funktionen wie Objekte behandelt werden. Eine Sprache wo das sehr schön mMn machbar ist, ist JavaScript.

Kokujou schrieb:
Und... Ich wollte eigentlich nur wissen wohin mit den abgedockten Funktionen ob ich jetz ne Klasse mache wo ich Funktionen sammle... möglichst so dass ich sie nicht statisch machen muss XD Denn das ist ja wieder nicht OOP
Util-Klassen solltest du vermeiden. Die sind einfach unschön und man neigt dazu, schnell alles dort rein zu packen ohne nach zu denken.
Beispiel wie es besser ist:
IstSoll
Du hast eine Klasse Character. Dort in dieser hast du u. A. die Feld Inventar (das eine Liste von UseableItems ist), x und y (x und y sind Integer, die die Koordinatendes angeben). Du hast die Methoden go(x, y) und useItem(index). In go() veränderst du die Koordinaten. in useItem, wählst du das Item aus, evaluierst um was für ein Item es sich handelt es führst davon abhängig etwas aus.Du hast eine abstrakte Klasse UseableItem, dass die Methode use() vorschreibt.

Du hast eine Klasse Inventory, dass eine Liste von UseableItem hat. Außerdem u. A. die Methode useItem(index). Die Methode useItem wählt anhand des Index das Item aus der Liste aus und ruft use() von UseableItem auf. Es spielt keine Rolle was für ein Item es ist!

Du hast eine Klasse Character. Die hat u. A. die Felder x, y und inventory. Hier ist inventory von Typ Inventory. Neben der Methode go(x, y) hat es wieder die Methode useItem(index). Hier ruft useItem() allerdings von Inventory die Methode useItem() auf.

Kokujou schrieb:
Okay also ist seal und readonly quasi eher für Teamarbeiten oder wenn ich meinen cod ezur Verfügung stelle aber wie immer etwas dass ich mir jetzt schonmal aneignen sollte OK^^
Das selbe Spiel wie bei den Access Modifiern. Es zwingt dich besseren Code zu schreiben.

Kokujou schrieb:
Habt ihr dann vielleicht ein paar Tipps wie man sie loswerden kann?
Es hängt davon ab was sie machen. Eine Möglichkeit sind Services in Form von Singeltons.
In manchen Fällen sind statische Sachen auch vollkommen okay.
 
Na ich weiß ja nicht... Unnötigerweise getter und setter zu verwenden klingt auch mehr nach Codeexpansion. Und welchen Grund sollte es geben eine Funktion nicht zu verwenden wenn sie doch da ist und nützlich ist. Wenn ich eine Funktion verwenden will ist sie nützlich und mich selbst damit einzuschränken klingt irgendwie unsinnig.

Na du hattest gesagt die Gestaltung einer Hauptfunktion als "Blaupause" (da wo ich son bisl Pseudocode gegeben habe) wäre schonmal ein sehr guter Start aber es gäbe noch nen Schritt wie man das mehr OOP machen kann.

Mir geht's darum den Code zu kürzen, nicht ihn in eine Zeile zu schreiben XD Aber wenn VS die Möglichkeit bietet klammern wegzulassen warum es dann nicht tun. Es gibt ja Programmiersrpachen die tatsächlich nur über Codeeinrückung arbeiten. Hab ich mal gehört. So schlimm kann's also nicht sein, ich versteh schon dass es da mal Verwirrung für mich geben kann aber bis jetzt hat mich das wirklich noch nie gestört.

Okay also wird hier quasi über mehrere Item der Index durchgereicht... das klingt allerdings für mich fast noch mehr nach schlechtem Stil, jetzt mal ohne Ahnung davon zu haben. Dann doch liebe gleich Inventory.items[x].use(); worauf es ja am Ende sowieso hinausläuft.

Also als statische Funktionen habe ich z.B. diverse Animationen die Transforms aufnehmen und weiterhin sind dann vielleicht start aber auf jeden Fall Zielkoordinaten drin sowie eine Delegatvariable was nach der Animation passieren soll (quasi wie ein Event :p)
StandardAnimation z.B. ist eine simple Interpolationsanimation von Transform A nach Transform B die ich sogut wie überall Nutze in verschiedenen Klassen. (Achja nur zum Verständnis Transforms sind nix weiter als die Variablen Translation, Rotation und Scale)
Nun würde jeder natürlich sagen, hey, warum die Funktion nicht in die Transform-Klasse auslagern. Tja schön wärs. Aber sowohl GameObject als auch Transform sind Basis-Klassen der Engine die sowie ich weiß nicht überschrieben werden können. Und ich bin nicht sicher ob sie immer von der Card-Klasse aufgerufen werden, aber sagen wir mal dass nicht. Soweit ich weiß rufen es auch GameObject auf die die Card Klasse nur als Child drinne haben also bildlich gesprochen wende ich Animationen auf die ganze Hand an, statt nur auf einzelne Karten.
So. Nun kann ich also nicht einfach der Card-Klasse die Funktion hinzufügen und card.Objekt.Transform ansprechen, das wäre nicht allgemein genug. Bleibt mir also eigentlich nur die Möglichkeit den Transform als Parameter zu verwenden. In einer folglich statischen Funktion
 
Kokujou schrieb:
Und welchen Grund sollte es geben eine Funktion nicht zu verwenden wenn sie doch da ist und nützlich ist. Wenn ich eine Funktion verwenden will ist sie nützlich und mich selbst damit einzuschränken klingt irgendwie unsinnig.
Stell dir jede Klasse als geschlossenes System vor. Um so weiter du es öffnest, destso eher besteht die Gefahr, dass etwas passiert, was nicht geplant ist. Setzt du alle Klassen direkt auf public, hast du die Gefahr, dass selbst du, eine Methode aufrufst, die intern ungewollt das Objekt verändert.
Du möchtest das dein objekt immer das ist, was du denkst das es ist, ist alles auf public, kannst du nicht mehr davon aus gehen und brichst damit sogar das ziel der Kapselung.

Kokujou schrieb:
Na du hattest gesagt die Gestaltung einer Hauptfunktion als "Blaupause" (da wo ich son bisl Pseudocode gegeben habe) wäre schonmal ein sehr guter Start aber es gäbe noch nen Schritt wie man das mehr OOP machen kann.
Es gibt viele Schritte noch. Und wie gesagt. eins nach dem anderen. Einige deiner statics solltest du auch mit OOP wegkriegen. Objekte bzw Daten weiter Kapseln ist auch eine Möglichkeit.

Kokujou schrieb:
Mir geht's darum den Code zu kürzen, nicht ihn in eine Zeile zu schreiben
Code kürzen geht nicht immer damit einher die Anzahl der Zeilen zu reduzieren, das wollte ich dir damit sagen.
Immer wenn du einen Bereich in eine neue Klasse auslagerst, hast du gewissen Boilerplate-Code, der deine Anzahl an Zeilen drastisch steigen lässt. Du solltest also das "Weglassen von Klammern" als "Code kürzen" verstehen.

Kokujou schrieb:
Okay also wird hier quasi über mehrere Item der Index durchgereicht... das klingt allerdings für mich fast noch mehr nach schlechtem Stil, jetzt mal ohne Ahnung davon zu haben. Dann doch liebe gleich Inventory.items[x].use(); worauf es ja am Ende sowieso hinausläuft.
Eventuell habe ich mich schlecht ausgedrückt... Das Ziel bei mir war es, dir zu zeigen, dass z. B. die Logik rings um das item, also was es macht, Sache des Items, also des Objekts, sein sollte. Du reichst zwar den Index durch, überprüfst aber nicht um was für ein Objekt es sich handelt, sondern sagst nur, dass es das machen soll, wofür es gedacht ist. Im Ist-Zustand habe ich geschrieben, dass du schaust was für ein Items es ist und davon abhängig Code ausführst, statt einfach das dem Objekt zu überlassen.

Kokujou schrieb:
Nun würde jeder natürlich sagen, hey, warum die Funktion nicht in die Transform-Klasse auslagern. Tja schön wärs.
Dann erstell dir daraus einen Service, der in dem Objekt selbst genutzt wird. Wenn ndu mehr OOP haben möchtest, solltest du deinem Objekt sagen, dass etwas gemacht wird und nicht dein Objekt übergeben und dmait sagen, dass etwas damit gemacht werden soll.
 
Okay ich denke ich habe jetzt alles verstanden. Bis auf das Letzte.
Hier kapiere ich so gar nicht was du damit sagen willst. Wie sieht sowas denn in C# aus?
Und was meinst du mit Service? In dem Objekt selbst hieße doch ich müsste die Transform-Klasse überschreiben bzw etwas darin einfügen aber genau das geht ja nunmal nicht. Wie löse ich dieses Problem denn?
 
Kokujou schrieb:
Bis auf das Letzte.
Ich würde dich an der Stelle einfach mal bitte, wenn du auf eine bestimmte Aussage oder einen Abschnitt Bezug nimmst, den doch nochmal als Zitat davor zusetzen, das erleichtert allen das nachvollziehen deiner Fragen enorm :). Leichtester Weg: Text Markieren, dann taucht ein Tooltip auf bei dem du auf "Zitieren" klicken kannst. Es wird automatisch in die Antwortbox unten eingefügt.

Kokujou schrieb:
Und was meinst du mit Service?
Kurz und knapp: Bei OOP sind es Klassen die sich um die Business Logik (z. B. aufwendige Berechnungen) kümmern, die keinem Objekt zugeordnet werden kann. Eine (immer noch kurze) aber viel schönere Erklärung findest du auf Stackoverflow: https://stackoverflow.com/questions/29715105/what-is-the-service-class-in-programming
 
Kokujou schrieb:
Oh und eine Frage fällt mir außerdem noch ein... Der ach so böse Stil von statischen Funktionen...
Das scheint ganz generell deine Grundhaltung zu sein. Studium ist unnütz, Coding Styles sind unnütz, Vermeidung statischer Methoden ist unnütz etc.

Vorschlag:
Stell hier mit Code-Tags(!) einzelne Stellen vom Code rein. Dann kann man viel besser darüber sprechen.
 
  • Gefällt mir
Reaktionen: Crast
BeBur schrieb:
Das scheint ganz generell deine Grundhaltung zu sein. Studium ist unnütz, Coding Styles sind unnütz, Vermeidung statischer Methoden ist unnütz etc.

Vorschlag:
Stell hier mit Code-Tags(!) einzelne Stellen vom Code rein. Dann kann man viel besser darüber sprechen.
Der Zitiert mir immer viel zu viel >.> gibts nicht ne Möglichkeit wie in Thunderbird nur den ausgewählten Text zu zitieren? du hast es doch auch geschafft oder hast du da manuell im Komplettzitat rumgebaut?

Also erstmal ein paar Klarstellungen: MEIN Studium ist unnütz, jedes Studium dass sich vernünftig auf das Thema spiele konzentriert hätte, hätte sicherlich mein Seal of Approval!
Und Coding Styles: Es gibt Dinge die ich nachvollziehen kann und Dinge wo ich es einfach überflüssig halte, aber auch bei denen verstehe ich dass das später von mir erwartet wird und da ich es später brauche muss ich da durch ^^ Rechtschreibung z.B. ist mir völlig egal, aber ich beiß mich durch und danke euch auch für den Tipp!
Und statische Methoden: Was sind eigentlich Unit Tests? ich hab erst Unity gelesen XD wie ihr seht ist meine Beherrschung von Fachbegriffen gleich 0, das passiert wenn mans sich selbst beibringt.

Aber wieder zum Thema... Also ich sehe viel Text und wenig Code, wie sieht denn jetzt die Einbindung eines minimalistischen Service in C# aus?

"Dann erstell dir daraus einen Service, der in dem Objekt selbst genutzt wird. Wenn ndu mehr OOP haben möchtest, solltest du deinem Objekt sagen, dass etwas gemacht wird"
So wie du das gesagt hast klingt das wie
Code:
class extendedTransform : Transform
{
void ExtensionMethod(){...};
var extendedVariable;
}
aber das ist ja im Falle von Transforms und GameObject nicht möglich. Ich hab mal gehört dass es irgendwelche Erweiterungsmethoden a la LINQ gibt aber wie man die anwendet wurde in der Doku irgendwie nicht deutlich. Da haben sie eigentlich überhaupt nichts getan nur dass die Klasse iwie so hieß, aber wie sies hingekriegt haben dass die dann von der Instanz aufrufbar ist... keine Ahnung.
 
Zurück
Oben