Какой шаблон проектирования я бы использовал, чтобы передать один пользовательский выбор всем классам, где наследование не кажется подходящим? - PullRequest
0 голосов
/ 11 марта 2020

Я создаю приложение Python, которое рассчитывает объем продаж, доступные запасы и требуемые запасные части, которые сначала предлагают пользователю выбрать свой отдел из списка.

Какой дизайн следует использовать, чтобы наилучшим образом информировать все классы в рамках заявление о выборе отдела? Как только отдел выбран, он остается используемым во всем приложении и в течение жизненного цикла экземпляра приложения.

class Sales:

    def __init__(self, departmentname):
        self.departmentname = departmentname
        self.conn = pyodbc.connect(jsonhandler.get_json('connections.json'))


    def calculate_sales(self):
        with self.conn:
            departmentsalesvalues = pd.read_sql_query(f"""SELECT productcode, quantity, salesprice
                                      FROM salestable 
                                      WHERE department = ?""", self.conn, 
                                      params=(self.departmentname))
        return departmentsalesvalues

Это работает, но кажется неуклюжим / плохим дизайном. Я считаю, что мне не хватает концепции / шаблона, который был бы полезен на всех языках программирования. Может кто-нибудь указать мне правильное направление, пожалуйста?

Вопросы, которые я задавал себе сам: Должен ли я создать класс Департамента? Но поскольку отдел не похож на другие классы, в любом случае наследование, кажется, не может быть и речи. Должен ли я передавать эту информацию в классе Main / App? (Что я сейчас и делаю.) Должен ли я иметь класс 'orchestrator', который взаимодействует с классом Main / App?

Я довольно новичок в создании масштабируемых приложений, но я нахожу такой вопрос проектирования возникающим все больше и больше в моих проектах.

1 Ответ

1 голос
/ 11 марта 2020

Для переменной, которая используется повсеместно и в течение срока службы приложения, я вижу два пути, которые будут выполнять sh задачу. А) Создайте глобальную переменную (я знаю, что глобальные переменные плохие . Но для этого конкретного сценария, когда все, что вам нужно - это отдел, и он нужен вам везде, глобальная переменная лучше, чем переписывать все ваши классы, чтобы принять значение конструктора) B) Создайте класс «Context», в котором в качестве переменной будет выбран отдел. Элемент контекста передается всем вашим функциям при вызове, и вы можете добавить дополнительную информацию в класс контекста, если это необходимо.

Для масштабируемых приложений вы должны хранить эту информацию в файле конфигурации или в специальной таблице в базе данных. Тогда у вас будет контекст и промежуточное ПО.

Контекст - это словарь, который передается всем вашим бизнес-функциям.

Промежуточное программное обеспечение - это список классов, которые каким-либо образом изменяют контекст.

У вас будет класс промежуточного программного обеспечения под названием "UserChoices", который имеет функцию:

def alterContext(context={}):
    context["DepartmentChoice"] = readDBvalue()
    return context

Тогда вы получите следующий контекст:

def getContext():
    context ={}
    for m in middlewares:
        context = m(context)
    return context

И тогда вы сможете использовать свои бизнес-функции следующим образом:


def businessFunc(context):
    return stuff
businessFunc(getContext())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...