inline Functions zur Kapselung
-
Hallo
Ich verwende viele kleine const-Arrays und habe diese in kleine inline Functions gekapselt, damit ich im Debug-Mode ganz einfach die Bounds überprüfen kann (-->
assert()).Mir ist das eingefallen, aber ich bin mir nicht sicher, ob diese einfache Technik ok ist. Funktionieren tut es ja, aber macht ein Programmierer das auch so?
Achja, ich habe nicht so viele Optionen, da es viele solcher inline-Funktionen sind, auf die massiv von mehreren Threads zugegriffen wird und die Funktionen einen erheblichen Teil der gesamten Rechenzeit konsumieren. Ich schätze mal immer noch besser als direkt auf das const-Array zuzugreifen, da ich somit die Möglichkeit habe zentral Debug-Code einzubauen. Und einswitch-caseKonstrukt wäre für diese Zwecke vollkommen daneben, schätze ich mal.// header file inline char piece_to_char(const int color, const int piece) { static const char ptc[COLORS][PIECES] = { {'P', 'N', 'B', 'R', 'Q', 'K'}, {'p', 'n', 'b', 'r', 'q', 'k'} }; assert(color >= COLOR_WHITE && color <= COLOR_BLACK); assert(piece >= PIECE_PAWN && piece <= PIECE_KING); return ptc[color][piece]; } inline int piece_value(const int piece) { static const int pv[PIECES + 1] = { VALUE_PAWN, VALUE_KNIGHT, VALUE_BISHOP, VALUE_ROOK, VALUE_QUEEN, VALUE_KING, VALUE_NONE, }; assert(piece >= PIECE_PAWN && piece <= PIECE_NONE); return pv[piece]; }
-
Ich finde das völlig OK so - wenn ich deine Voraussetzungen akzeptiere. Eine Kleinigkeit würde ich ändern, nämlich die Parameter nicht als const int, sondern einfach nur als int deklarieren.
Stimmen aber die Voraussetzungen? Ist insbesondere das Mapping der Parameter auf die Rückgabe-/Array-Werte notwendig? Vor allem die Funktion piece_value() erscheint mir überflüssig. Kannst du nicht für den Parameter piece einfach sofort den richtigen Wert verwenden?
Stefan.
-
DStefan schrieb:
Vor allem die Funktion piece_value() erscheint mir überflüssig. Kannst du nicht für den Parameter piece einfach sofort den richtigen Wert verwenden?
Kaum. PIECE_VALUES sind eher spieltaktische Werte. König ist 99 wert, Dame ist 9 wert. Turm ist 4 wert, Bauer ist 1 wert. Zum Beispiel.
und piece ist ein int zwischen VALUE_PAWN und VALUE_NONE (derzeit zwischen 0 und 6), optimal für Indexzugriffe.
-
DStefan schrieb:
Ist insbesondere das Mapping der Parameter auf die Rückgabe-/Array-Werte notwendig? Vor allem die Funktion piece_value() erscheint mir überflüssig. Kannst du nicht für den Parameter piece einfach sofort den richtigen Wert verwenden?
Stefan.
Ja, das Mapping ist notwendig. Sollten ja auch nur Beispiele sein, wie sie vielfach in meinen Codes verwendet werden.
Danke für die Antwort
-
Tomahawk schrieb:
Funktionieren tut es ja, aber macht ein Programmierer das auch so?
Jeder Programmierer macht es ein wenig anders. Ich beispielsweise mag es, wenn ich STL-kompatible Container habe, die im Debug-Modus automatisch Laufzeitchecks durchführen -- deshalb nehme ich dafür
std::tr1::array. Dieses Klassentemplate kannst du gleich wie ein BuiltIn-Array verwenden (sogar die Initialisierungsliste), aber es bietet zusätzlichen Komfort wiesize()an. Laufzeitoverhead gibts im Release-Modus keinen.P.S. Hat sich das hier inzwischen erübrigt, oder wie siehst du es mit den Typen? Ich habe dort noch geantwortet, weiss aber nicht, ob du es gesehen hast.
