• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ocena kodu źródłowego

Object Storage Arubacloud
0 głosów
168 wizyt
pytanie zadane 15 listopada 2018 w C i C++ przez Huberti Gaduła (4,500 p.)
edycja 15 listopada 2018 przez Huberti

Witam, proszę o ocenę poniższego kodu do gry tic tac toe.

GameBoard.h

#pragma once

#include <array>

namespace ttt {
	class GameBoard 
	{
	public:
		enum class Cell { EMPTY, CIRCLE, SHARP };

		GameBoard() 
			: gameBoard() {}

		GameBoard(const std::array<std::array<Cell, 3U>, 3U>& gameBoard) 
			: gameBoard(gameBoard) {}

		const Cell& operator()(unsigned row, unsigned column) const;

		Cell& operator()(unsigned row, unsigned column);

	private:
		std::array<std::array<Cell, 3U>, 3U> gameBoard;

		static const unsigned LAST_ROW = 2, LAST_COLUMN = 2;
	};
}

GameBoard.cpp

#include "GameBoard.h"
#include <stdexcept>

namespace ttt {
	const GameBoard::Cell& GameBoard::operator()(unsigned row, unsigned column) const
	{	
		if (row > LAST_ROW)
			throw std::invalid_argument("row out of bounds");
		else if (column > LAST_COLUMN)
			throw std::invalid_argument("column out of bounds");
		else
			return gameBoard[row][column];
	}

	GameBoard::Cell& GameBoard::operator()(unsigned row, unsigned column)
	{
		if (row > LAST_ROW)
			throw std::invalid_argument("row out of bounds");
		else if (column > LAST_COLUMN)
			throw std::invalid_argument("column out of bounds");
		else
			return gameBoard[row][column];
	}
}

Inicjalizacja w testach jednostkowych wygląda dosyć zawile. Czytając kod trzeba pomijać przedrostek ttt::GameBoard::Cell. Przykład:

ttt::GameBoard gb({
	ttt::GameBoard::Cell::EMPTY, ttt::GameBoard::Cell::EMPTY, ttt::GameBoard::Cell::EMPTY,
	ttt::GameBoard::Cell::EMPTY, ttt::GameBoard::Cell::EMPTY, ttt::GameBoard::Cell::EMPTY,
	ttt::GameBoard::Cell::SHARP, ttt::GameBoard::Cell::CIRCLE, ttt::GameBoard::Cell::SHARP
	});

Może lepiej jest zastosować enum zamiast enum class i wrzucić using ttt::GameBoard?
 

using ttt::GameBoard;

GameBoard gb({
	GameBoard::EMPTY, GameBoard::EMPTY, GameBoard::EMPTY,
	GameBoard::EMPTY, GameBoard::EMPTY, GameBoard::EMPTY,
	GameBoard::SHARP, GameBoard::CIRCLE, GameBoard::SHARP
	});

Ewentualnie przenieść enum class do osobnego pliku Cell.h

using ttt::Cell;
 
ttt::GameBoard gb({
    Cell::EMPTY, Cell::EMPTY, Cell::EMPTY,
    Cell::EMPTY, Cell::EMPTY, Cell::EMPTY,
    Cell::SHARP, Cell::CIRCLE, Cell::SHARP
    });

Czy może lepiej jest skorzystać ze zwykłej zmiennej typu char?

using ttt::GameBoard;

GameBoard gb({
	'n', 'n', 'n',
	'n', 'n', 'n',
	'X', 'O', 'X'
	});

 

1 odpowiedź

0 głosów
odpowiedź 17 listopada 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

co do kodu to zgadzam się z Twoją sugestią

Może lepiej jest zastosować enum zamiast enum class i wrzucić using ttt::GameBoard?

Samo enum wystarczy. Tutaj dzięki klasie dane są zamknięte i nie musisz obawiać się o konflikt nazw. Co do przestrzeni nazw to radziłbym używać nazw bardziej precyzyjnych, które sugerują przeznaczenie. Polecam używanie przestrzeni nazw w pliku nagłówkowym*.h natomiast wykorzystanie jej poprzez using w pliku źrółowym *.cpp. Np. w pliku *h używaj std:: a w pliku cpp na początku dodaj using namespace std;.

Podobne pytania

0 głosów
1 odpowiedź 151 wizyt
pytanie zadane 3 marca 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
0 odpowiedzi 111 wizyt
pytanie zadane 19 lutego 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 11 lutego 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

61,950 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...