Du bist nicht angemeldet.

Werbeanzeige

Sacaldur

Community-Fossil

Beiträge: 2 326

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

361

13.01.2014, 17:07


Die API sollte meiner Meinung nach etwas besser gekapselt werden. Warum haben sie ein paar ihrer Komponenten in Eigenschaften gelegt, die Null-Objekte zurückliefern und eine Fehlermeldung in die Konsole printen?
Ich würde eine waschechten Exception vorziehen, da sie den Programmierer dazu zwingt, ordentlicher zu arbeiten.
Außerdem sollten die Spiele bei einer Exception ein veränderbares Verhalten haben. Die Exception einfach wegzucatchen ist ja nicht wirklich eine schöne Lösung, Fehler zu finden.

Intern rufen diese Properties auch nur GetComponent oder eine ähnliche Methode auf (statt die Komponente zu speichern, es wird also auch keine Exception weggecatcht). In einem anderen Thema gab es das bereits, allerdings ist null in dem Fall ein gültiger/sinnvoller Wert, der aussagt, dass keine entsprechende Komponente gefunden wurde (und statt eines Catchs macht man dann einen Vergleich mit null). Und da jedes GameObject ein Transform besitzt, wird in diesem Fall nie null zurückgegeben.
Deutlicher wird das bei Methoden wie getComponents, welche eine Ergebnismenge besitzen. Eine Menge kann leer sein, also ist eine leere Liste eine gültige Rückgabe. Eine Exception zu schmeißen, weil nichts gefunden wurde, ist in diesem Fall um so unsinniger (gab es in bereits erwähnten anderen Thread auch bereits).

Die Properties und noch einige andere Dinge, die man nicht unbedingt machen würde, wenn man ganz sauber arbeiten will (die vielen Klassen, die ausschließlich statische Elemente beinhalten, wie Input oder Time), vereinfachen die Entwicklung aber für Leute, die gerade erst mit der Programmierung anfangen. Und es gibt wirklich viele Leute, die mit Unity ihre Spiele erstellen, obwohl diese eigentlich keine Programmierer sind.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

LeBusch

Frischling

Beiträge: 81

Beruf: Student B.Sc. Informatik

  • Private Nachricht senden

362

24.01.2014, 21:07

C#-Quelltext

1
val = Convert.ToBoolean(GameControls.Locked);

... Wobei "GameControls.Locked" bereits vom Typ Boolean ist. Zu viel "Copy & Paste mit minimalen Anpassungen" aus anderen Funktionen und zu wenig Schlaf :whistling:

FSA

Community-Fossil

  • Private Nachricht senden

363

25.01.2014, 16:17

Solche Sachen finde ich in Massen, weil ich vor Kurzem alle meine Datentypen vereinheitlicht habe :P
Da stehen dann auch so Dinge wie:

C-/C++-Quelltext

1
int32_t someInt = ToType<int>(someOrherInt);

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

RmbRT

Treue Seele

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

364

31.01.2014, 23:47

Das hier hab ich von C++.de:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#define arr_count(a) (sizeof(a)/sizeof(a[0]))
...
int main(void)
{
   int arr[] = {1, 2, 3};
   mach_was(arr);
}

void mach_was(int * arr)
{
   printf("%d", arr_count(arr));
}

schlechtestes Beispiel für die nutzung von sizeof + makro...
"Dumm ist, wer dummes tut."

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

365

01.02.2014, 00:36

Gibt es in C++ überhaupt gute Beispiele für die Nutzung von Makros? (abgesehen von der Nutzung von #ifdef)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

366

01.02.2014, 00:42

Ja natürlich gibt es das.
Nur das Missbrauchspotential ist halt sehr hoch, das macht die Makros aber nicht von Grund auf schlecht.
Makros können für die automatische Codegenerierung nützlich sein. Oder wenn es keine richtigen "constexpr"-Funktionen gibt. (MSVC :zombie: )

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (01.02.2014, 14:35)


NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

367

01.02.2014, 14:28

Ich habe mich nicht viel mit Makros beschäftigt, weil ich nicht nur in einem Buch gelesen habe, dass man so gut wie alles, was sie ermöglichen, schon mit C++03 eleganter lösen kann. Würde mich gern eines besseren belehren lassen :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

368

01.02.2014, 14:48

Makros können für die automatische Codegenerierung nützlich sein.

Allerdings wohl nur extrem selten, in der Regel ist man mit templates besser beraten.

Oder wenn es keine richtigen "constexpr"-Funktionen gibt. (MSVC :zombie: )

In den Fällen, wo man nicht einfach auf Inlining vertrauen kann, sondern tatsächlich ein constexpr von der Sprache her erforderlich wäre, könnte man aber zumindest theoretisch meist etwas Gleichwertiges auch mit templates basteln, ist aber natürlich ein wenig schmerzhaft...
Abgesehen davon: you're welcome ;)

Ich habe mich nicht viel mit Makros beschäftigt, weil ich nicht nur in einem Buch gelesen habe, dass man so gut wie alles, was sie ermöglichen, schon mit C++03 eleganter lösen kann. Würde mich gern eines besseren belehren lassen :D

Abgesehen von bedingter Kompilierung, gibt es tatsächlich kaum Fälle in C++, wo man nicht besser andere Sprachmittel einsetzen würde...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (01.02.2014, 14:55)


369

01.02.2014, 18:24

"kaum" Fälle.
Was wäre denn ein Beispielfall? Mir fällt nämlich echt keiner ein. 8|

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

370

01.02.2014, 19:29

Zitat

In den Fällen, wo man nicht einfach auf Inlining vertrauen kann

Auf "inlining vertrauen" nützt nichts, wenn ein zur Compiletime konstanter Ausdruck erforderlich ist.

Zitat

Was wäre denn ein Beispielfall?

Immer dann, wenn mehrmals bestimmter Code erforderlich, bei dem Templates oder Funktionen aus verschiedenen Gründen nicht in Frage kommen, man aber auf redundanten Code trotzdem verzichten will.
Ein konkreter Anwendungsfall als ich zuletzt extensiv den Präprozessor benutzt habe, war, als ich GLSL Shaderuniforms typsicher in Form von Templates wrappen wollte. Es gibt ja eine unglaublich große Anzahl an ähnlichen Funktionen(Das sind auch nur die Funktionen zum setzen von Uniforms bei gebundenen Shadern.), für verschiedene Typen, Anzahl, Vektoren...
Ich konnte einfach ein Makro schreiben, dass mir automatisch die ganzen Templatespezialisierungen für die vielen Kombiniationsmöglichkeiten mit den obigen Funktionen generiert.
Es wäre natürlich auch anders gegangen, aber die Präprozessorlösung ist deutlich felxibler als die geschätzt 6000 Zeilen die man sonst gebraucht hätte.

Zitat

Abgesehen davon: you're welcome ;)

Kenne ich. In Zukunft habe ich auch vor mal umzusteigen.
Für C++11(geschweige denn C++14) sehe ich das jedoch auch als alles andere als eine Trophäe für Microsoft. constexpr aus C++11 wird immer noch nicht vollständig unterstützt und die das C++14 Feature steht vorsichtshalber auch ganz am Ende. :fie:

Werbeanzeige