Refactor AForm and derived classes to introduce isExecutable method for better code reuse and clarity
This commit is contained in:
parent
e631a84565
commit
525d4e2beb
@ -25,7 +25,9 @@ class AForm
|
||||
int getSignGrade() const;
|
||||
int getExecuteGrade() const;
|
||||
void beSigned(const Bureaucrat &bureaucrat);
|
||||
virtual void execute(const Bureaucrat &executor) const = 0; // Pure virtual function, making AForm an abstract class
|
||||
bool isExecutable(const Bureaucrat &executor) const;
|
||||
virtual void execute(const Bureaucrat &executor)
|
||||
const = 0; // Pure virtual function, making AForm an abstract class
|
||||
|
||||
class GradeTooHighException : public std::exception
|
||||
{
|
||||
|
||||
@ -56,6 +56,15 @@ void AForm::beSigned(const Bureaucrat &bureaucrat)
|
||||
_isSigned = true;
|
||||
}
|
||||
|
||||
bool AForm::isExecutable(const Bureaucrat &executor) const
|
||||
{
|
||||
if (!_isSigned)
|
||||
throw FormNotSignedException();
|
||||
if (executor.getGrade() > _executeGrade)
|
||||
throw GradeTooLowException();
|
||||
return true;
|
||||
}
|
||||
|
||||
const char *AForm::GradeTooHighException::what() const throw()
|
||||
{
|
||||
return "Form grade is too high!";
|
||||
|
||||
@ -40,10 +40,7 @@ std::ostream &operator<<(std::ostream &os, const PresidentialPardonForm &form)
|
||||
|
||||
void PresidentialPardonForm::execute(const Bureaucrat &executor) const
|
||||
{
|
||||
if (!getIsSigned())
|
||||
throw AForm::FormNotSignedException();
|
||||
if (executor.getGrade() > getExecuteGrade())
|
||||
throw AForm::GradeTooLowException();
|
||||
isExecutable(executor);
|
||||
|
||||
std::cout << PRESIDENTIAL_PARDON_FORM<< executor.getName() << " made shure Zaphod Beeblebrox pardoned "
|
||||
<< _target << "." << std::endl;
|
||||
|
||||
@ -26,19 +26,16 @@ RobotomyRequestForm::~RobotomyRequestForm()
|
||||
|
||||
void RobotomyRequestForm::execute(const Bureaucrat &executor) const
|
||||
{
|
||||
if (!getIsSigned())
|
||||
throw AForm::FormNotSignedException();
|
||||
if (executor.getGrade() > getExecuteGrade())
|
||||
throw AForm::GradeTooLowException();
|
||||
isExecutable(executor);
|
||||
|
||||
std::cout << ROBOTOMY_REQUEST_FORM DESTRUCTOR
|
||||
std::cout << ROBOTOMY_REQUEST_FORM
|
||||
<< "Drrr, Drrr. Drilling noises... " << std::endl;
|
||||
std::srand(static_cast<unsigned int>(std::time(0)));
|
||||
if (std::rand() % 2)
|
||||
std::cout << ROBOTOMY_REQUEST_FORM DESTRUCTOR << _target
|
||||
std::cout << ROBOTOMY_REQUEST_FORM << _target
|
||||
<< " has been robotomized!" << std::endl;
|
||||
else
|
||||
std::cout << ROBOTOMY_REQUEST_FORM DESTRUCTOR << _target
|
||||
std::cout << ROBOTOMY_REQUEST_FORM << _target
|
||||
<< "'s robotomy failed. " << _target
|
||||
<< " is not the same anymore..." << std::endl;
|
||||
}
|
||||
|
||||
@ -29,11 +29,7 @@ ShrubberyCreationForm::~ShrubberyCreationForm()
|
||||
|
||||
void ShrubberyCreationForm::execute(const Bureaucrat &executor) const
|
||||
{
|
||||
if (!getIsSigned())
|
||||
throw AForm::FormNotSignedException();
|
||||
if (executor.getGrade() > getExecuteGrade())
|
||||
throw AForm::GradeTooLowException();
|
||||
|
||||
isExecutable(executor);
|
||||
std::ofstream ofs(_target + "_shrubbery");
|
||||
if (!ofs)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user