Sobes.tech
Middle

რა არის დეკორატორი?

sobes.tech AI

პასუხი AI-სგან

დეკორატორი — ეს სტრუქტურული დიზაინის ნიმუშია, რომელიც საშუალებას აძლევს დინამიურად დაამატოთ ახალი ქცევა ობიექტებს, მათ სპეციალურ დეკორატორულ ობიექტებში ჩასმა.

ძირითადი პრინციპები:

  • კომპოზიცია მემკვიდრეობაზე. დეკორატორი აფართოებს ობიექტის ფუნქციონალობას, არ იცვლის მისი კლასი და არ იყენებს მემკვიდრეობას.
  • გლუვობა. საშუალებას აძლევს დაამატოთ ან წაშალოთ ობიექტის მოვალეობები შესრულების დროს.
  • სათანადოობა. დეკორატორებს და შეფუთულ ობიექტებს აქვთ საერთო ინტერფეისი, რაც საშუალებას აძლევს მათ ურთიერთგამომრიცხველად გამოყენებას.

სტრუქტურა:

  • კომპონენტი (Component): ინტერფეისი ობიექტებისთვის, რომელთაც შეუძლიათ დინამიურად დაამატოთ ახალი მოვალეობები.
  • კონკრეტული კომპონენტი (ConcreteComponent): კომპონენტის რეალიზაცია.
  • დეკორატორი (Decorator): აბსტრაქტული კლასი ან ინტერფეისი, რომელიც აფართოებს კომპონენტს და შეიცავს მის მისამართს.
  • კონკრეტული დეკორატორები (Concrete Decorators): დეკორატორის რეალიზაციები, რომლებიც დამატებით უნარებს აძლევენ.

მაგალითი (Python):

// კომპონენტის ინტერფეისი
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// კონკრეტული კომპონენტი
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "სუფთა ყავა"

// საწყისი დეკორატორი
class CoffeeDecorator(Coffee):
    def __init__(self, decorated_coffee):
        self._decorated_coffee = decorated_coffee

    def get_cost(self):
        return self._decorated_coffee.get_cost()

    def get_description(self):
        return self._decorated_coffee.get_description()

// კონკრეტული დეკორატორი (რძე)
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._decorated_coffee.get_cost() + 0.5

    def get_description(self):
        return self._decorated_coffee.get_description() + ", რძე"

// გამოყენება
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # სუფთა ყავა: 1.0

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # სუფთა ყავა, რძე: 1.5

უპირატესობები:

  • უფრო მოქნილი გზაა ფუნქციონალობის გაფართოებისთვის, ვიდრე მემკვიდრეობა.
  • თავიდან აცილება მემკვიდრეობის დაკავშირებული ქვესაფართოებების ზრდას.
  • საშუალებას აძლევს ერთ ობიექტს რამდენიმე "ფენას" ქცევას.

მცირედი:

  • შეიძლება გაართულოს კოდი მცირე ობიექტების დიდი რაოდენობის გამო.
  • შეფუთვის წესრიგი შეიძლება იყოს მნიშვნელოვანი.

QA / ავტომატიზაციის გამოყენება:

  • არსებული მეთოდების ლოგირების დამატება, მათი საწყისი კოდის შეცვლის გარეშე.
  • გამონაკლისების დამუშავების განხორციელება კონკრეტული ზარებისათვის.
  • დროის გაზომვა ან შესრულების მეტრიკების დამატება.
  • ავტომატიზაციის ბიბლიოთეკების გამოყენება (მაგალითად, Page Object pattern-ში, შემოწმებების ან ლოგირების დამატებისთვის ელემენტებთან ურთიერთობის დროს).