3 Stimmen

Übergabe von Objekten und bewährte objektorientierte Entwurfspraktiken

Ich bin Universitätsstudent und lerne Programmieren. Zum Üben schreibe ich ein Blackjack-Programm. Ich verwende C++ und verfolge dabei einen objektorientierten Ansatz.

Ich habe eine Deck-Klasse entworfen, die im Grunde baut und mischt ein Kartenspiel. Das erzeugte Deck besteht aus einem Array von 52 Objekten der Klasse Card. Das ist, was ich bis jetzt habe.

Mein Plan ist es, ein Geber-Objekt, das ein Deck von 52 Karten hat, eine Karte an ein zweites Spieler-Objekt und dann an die eigene Hand des Gebers zu geben.

Meine erste Frage ist: Ist es eine schlechte Praxis, das Array der Kartenobjekte in der Deck-Klasse öffentlich zu machen?

Ich frage dies, weil ich das Array als Attribut betrachte und mir beigebracht wurde, dass die meisten Attribute privat gemacht werden sollten. Ich möchte nicht anfangen, schlechte oder faule Praktiken in meinen Projekten zu verwenden und möchte es richtig machen.

Eine andere Frage: Wie werden Objekte, wie z. B. das in meinem Blackjack-Programm verwendete Kartenobjekt, im Allgemeinen von einem Objekt - wie dem Dealer - zu einem zweiten Objekt - wie einem Spieler - bewegt?

1voto

Jerry Coffin Punkte 452852

Zumindest IMO versuchen Sie, es zu übertreiben. In Wirklichkeit hat ein Kartenspiel kein Verhalten - es ist nur ein Haufen von Karten. Sie haben keinen Geber, der dem Kartenspiel sagt, dass es sich selbst mischen soll; Sie haben einen Geber, der das Deck mischt. In einem Programm würde ich dasselbe tun - das Kartenspiel wäre nur ein std::vector<card> die dem Händler gehört (und die mit ziemlicher Sicherheit privat sein sollte).

Für den Handel hätte jeder Spieler seine eigene std::vector<card> für seine Hand. Der Geber würde dann jedem Spieler eine Karte weitergeben, indem er die Karte des Spielers deal (oder was auch immer) Mitgliedsfunktion.

0voto

In silico Punkte 49539

1) Im Allgemeinen, ja. Die Spielerinstanzen mischen sich nicht in die Karten des Dealers ein, also sollte es privat sein.

2) Eine Möglichkeit, dies zu tun:

struct Card
{
    Suit suit;
    Rank rank;
};

class Player
{
private:
    void AddCard(Card card);
    friend class Dealer;
};

class Dealer : public Player
{
public:
    void DealTo(Player& player);
};

Dealer dealer;
Player player2;
dealer.DealTo(player2);

0voto

Martin York Punkte 245363

Meine erste Frage ist: Ist es schlechte Praxis, um das Array von Kartenobjekten öffentlich in der Deck-Klasse zu machen?

Abhängig. Aber normalerweise ist es schlecht, Daten öffentlich zu machen.
Dies liegt daran, dass öffentliche Elemente Teil der Schnittstelle werden und daher gepflegt werden müssen.

Es wäre besser, das Array zu einem privaten Mitglied zu machen und die Aktionen dann über die öffentliche Schnittstelle zu veröffentlichen. Dies ermöglicht es Ihnen, die privaten Daten später zu ändern (wenn Sie z.B. lernen, wie man einen Vektor verwendet, können Sie das Array durch einen Vektor ersetzen). Wäre das Array öffentlich, könnten Sie den Typ nicht ändern, ohne dass dies Auswirkungen auf alle anderen Typen hätte, die die Tatsache, dass es sich um ein Array handelt, nutzen).

Prinzip: Ausblenden von Implementierungsdetails.
Dies führt zu einer lockeren Kopplung zwischen den Typen.

Eine andere Frage: Wie werden Objekte, wie z. B. das in meinem Blackjack-Programm verwendete Kartenobjekt, im Allgemeinen von einem Objekt - wie dem Dealer - zu einem zweiten Objekt - wie einem Spieler - bewegt?

Entfernen Sie es aus dem Array in einem Objekt (und schrumpfen Sie das Array, um zu zeigen, dass es weniger Karten hat (daher möchten Sie vielleicht einen Containertyp, der seine Größe ändern kann)) und legen Sie es in ein anderes Array (Container) im Zielobjekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X