• 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
174 wizyt
pytanie zadane 2 października 2018 w C i C++ przez Huberti Gaduła (4,500 p.)

Witam, proszę o ocenę klasy pod względem "czystego" kodu.

Klasa służy do zarządzania imieniem gracza.

#pragma once

#include <string>
#include <fstream>

namespace ttt {
	class NameOfOnePlayer
	{
	public:
		NameOfOnePlayer();

		void setFromInputStream();

		std::string get() const;

	private:
		enum Exception { CANNOT_OPEN, CORRUPT };
		static const std::string nameOfFile;

		std::string name;

		std::string getFromInputStream() const;

		bool hasNotProperSize(const std::string& name) const;

		bool isTooBig(const std::string &name) const;

		bool isTooSmall(const std::string &name) const;

		void setFromFile();

		void tryToSetFromFile();

		void setFrom(std::ifstream& file);

		void tryToSetFrom(std::ifstream& file);

		void saveToFile() const;

		void tryToSaveToFile() const;

		void saveTo(std::ofstream& file) const;
	};
}
#include "NameOfOnePlayer.h"
#include <iostream>

namespace ttt {
	const std::string NameOfOnePlayer::nameOfFile = "nameOfOnePlayer.txt";

	NameOfOnePlayer::NameOfOnePlayer()
	{		
		setFromFile();
	}

	void NameOfOnePlayer::setFromFile()
	{
		try {
			tryToSetFromFile();
		}
		catch (const Exception& e) {
			if (e == CANNOT_OPEN)
			{
				setFromInputStream();
				saveToFile();
			}				
		}
	}

	void NameOfOnePlayer::tryToSetFromFile()
	{
		std::ifstream file;
		file.open(nameOfFile);
		if (file.is_open())
		{
			setFrom(file);
			file.close();
		}
		else
		{
			file.close();
			throw CANNOT_OPEN;
		}
	}

	void NameOfOnePlayer::setFrom(std::ifstream& file)
	{
		try {
			tryToSetFrom(file);
		}
		catch (const Exception& e) {
			if (e == CORRUPT)
			{
				setFromInputStream();
				saveToFile();
			}				
		}
	}

	void NameOfOnePlayer::tryToSetFrom(std::ifstream& file)
	{
		if (!(file >> name && file.get()))
			throw CORRUPT;
	}

	void NameOfOnePlayer::setFromInputStream()
	{
		name = getFromInputStream();
	}

	std::string NameOfOnePlayer::getFromInputStream() const
	{
		std::string name;
		std::cout << "Podaj swoje imie: ";
		std::cin >> name;
		while (hasNotProperSize(name))
		{
			if (isTooBig(name))
			{
				std::cout << "Imie moze miec maksymalnie 12 znakow. Sprobuj jeszcze raz:";
				std::cin >> name;
			}
			else if (isTooSmall(name))
			{
				std::cout << "Imie musi miec przynajmniej 3 znaki. Sprobuj jeszcze raz:";
				std::cin >> name;
			}
		}
		return name;
	}

	bool NameOfOnePlayer::hasNotProperSize(const std::string& name) const
	{
		return isTooBig(name) || isTooSmall(name);
	}

	bool NameOfOnePlayer::isTooBig(const std::string &name) const
	{
		return name.size() > 12;
	}

	bool NameOfOnePlayer::isTooSmall(const std::string &name) const
	{
		return name.size() < 3;
	}

	void NameOfOnePlayer::saveToFile() const
	{
		try {
			tryToSaveToFile();
		}
		catch (const Exception& e) {
			if (e == CANNOT_OPEN)
				;//TODO log it to the file with communicates of errors
		}
		
	}

	void NameOfOnePlayer::tryToSaveToFile() const
	{
		std::ofstream file;
		file.open(nameOfFile);
		if (file.is_open())
		{
			saveTo(file);
			file.close();
		}		
		else
		{
			file.close();
			throw CANNOT_OPEN;
		}		
	}

	void NameOfOnePlayer::saveTo(std::ofstream& file) const
	{
		file << name << std::endl;
	}

	std::string NameOfOnePlayer::get() const
	{
		return name;
	}
}

2 odpowiedzi

0 głosów
odpowiedź 3 października 2018 przez UltraSF Stary wyjadacz (11,740 p.)

Po pierwsze średnio znam c++ i  to będzie plus powiem ci jakie są odczucia osoby z innego języka.

Po pierwsze nie wiem czemu ten namesapce to ttt ale średnio czytelna nazwa ;)
jak już try zapisujesz tak

try {
    //
} catch(const Exception& e) {
     //
}

to if też bym tak zapisywał

if (true) {
    //
} else {
    //
}

nie umieszczał bym cout i cin w takiej kalsie, dla mnie to trochę niezgodne z OOP klasa która stertuje I/O dałbym osobno. Tak samo oddzieliłbym obsługę pliku do innej klasy. Wmyśl także zasad SOLID. 

Po za tym jest naprawdę dobrze, rozwijaj się powodzenia :D 

0 głosów
odpowiedź 3 października 2018 przez j23 Mędrzec (194,920 p.)

Linia 58: jeśli to get w warunku jest po to, żeby usunąć znak końca linii, to lepiej użyj ignore.

Podobne pytania

0 głosów
2 odpowiedzi 192 wizyt
pytanie zadane 3 stycznia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
+1 głos
1 odpowiedź 199 wizyt
pytanie zadane 4 listopada 2018 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
1 odpowiedź 151 wizyt
pytanie zadane 3 marca 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 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!

...