Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solution #608

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 49 additions & 6 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,67 @@


class IntegerRange:
pass
def __init__(
self,
min_amount: int,
max_amount: int
) -> None:
self.min_amount = min_amount
self.max_amount = max_amount

def __set_name__(self, instance: "Visitor", name: str) -> None:
self.protected_name = "_" + name

def __get__(self, instance: "Visitor", owner: object) -> object:
return getattr(instance, self.protected_name)

def __set__(self, instance: "Visitor", value: int) -> None:
if not isinstance(value, int):
raise TypeError("Expected an integer value")
if not (self.min_amount <= value <= self.max_amount):
raise ValueError("Value out of the allowed range")
setattr(instance, self.protected_name, value)
Comment on lines 4 to +24

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The IntegerRange class is a descriptor that validates if a value is an integer and within a specific range. This is a good use of descriptors to enforce data validation.



class Visitor:
pass

def __init__(self, name: str, age: int, weight: int, height: int) -> None:
self.name = name
self.age = age
self.weight = weight
self.height = height
Comment on lines 27 to +33

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Visitor class is a simple data class that holds information about a visitor. It might be a good idea to add some data validation in the __init__ method to ensure that the name is a string and that age, weight, and height are integers.



class SlideLimitationValidator(ABC):
pass
def __init__(self, age: int, weight: int, height: int) -> None:
self.age = age
self.weight = weight
self.height = height
Comment on lines 36 to +40

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SlideLimitationValidator class is an abstract base class that defines the interface for all slide limitation validators. This is a good use of the ABC module to define a common interface.



class ChildrenSlideLimitationValidator(SlideLimitationValidator):
pass
age = IntegerRange(4, 14)
weight = IntegerRange(20, 50)
height = IntegerRange(80, 120)


class AdultSlideLimitationValidator(SlideLimitationValidator):
pass
age = IntegerRange(14, 60)
weight = IntegerRange(50, 120)
height = IntegerRange(120, 220)
Comment on lines 43 to +52

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ChildrenSlideLimitationValidator and AdultSlideLimitationValidator classes inherit from SlideLimitationValidator and define specific age, weight, and height limitations for children and adults. This is a good use of inheritance to create specific behavior based on the type of visitor.



class Slide:
pass
def __init__(self, name: str,
limitation_class: SlideLimitationValidator) -> None:
self.name = name
self.limitation_class = limitation_class

def can_access(self, visitor: Visitor) -> bool:
try:
self.limitation_class(visitor.age, visitor.weight, visitor.height)
except (ValueError, TypeError)\
:
return False
else:
return True
Comment on lines 55 to +68

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Slide class represents a slide in the park. It uses a SlideLimitationValidator to determine if a visitor can access the slide. This is a good example of composition, where a class uses another class to achieve its functionality. However, the can_access method is currently catching ValueError and TypeError exceptions and returning False if they are raised. This is not a good practice, because it's hiding the real error. It would be better to let the exception propagate up and handle it at a higher level in the code.

Loading