LINUX.ORG.RU

внешний файл конфигурации

 ,


0

4

Пишу на Python, но суть не в этом..

class Config:
    config_dict = {}

    def __init__(self):
        with open('config.json') as file:
            self.config_dict = json.load(file)

    def get_property(self, section, prop):
        return self.config_dict[section][prop]

И есть несколько вариантов как передать конфиг в классы

  • в конструкторе каждого класса вызывать конструктор класса Config
  • наследовать каждый класс от класса Config
  • создать константы для каждого параметра и передавать их в классы
  • Предложите паттерн

Чем воспользоваться лучше? Есть ли подходящий паттерн? P.S. Шутки про пять-звезд скорее всего не избежать, я понимаю :)

★★★★★

Последнее исправление: sniper21 (всего исправлений: 4)

У тебя каждый вариант тупее предыдущего.

  1. Можно пробрасывать объект конфига везде, где он требуется.
  2. Получать параметры через контекст.
  3. Если у тебя заваедомо один инстанс приложения с единым конфигом в рамках процесса, можно не быть дрочливой обезьяной и не выделываться, а просто запилить конфигурационный модуль, где всё будет да хоть в виде констант при инициализации задано.
WitcherGeralt ★★
()

В конструкторе каждого класа принимать только те параметры от которых зависит функционал этого класса. При необходимости - копировать их из конфигурации или других источников на уровне создания объектов класса.

Всё остальное - RAD и ведёт к неподдерживаемой какше(сначала опечатался, но потом оставил как вышло, хорошее слово, отражает суть вещей). Да не сразу, нет - точно ведёт, видел на практике множество раз.

pon4ik ★★★★★
()

вынося за скобки целесообразность и природу config object, очевидный паттерн - DI:

import inject
from cfg import CfgA,CfgB

class C:
  @inject.autoparams
  def __init__(self, arg, cfgA : CfgA, cfgB : CfgB):
    ...

inject.configure(...)
o = C(1)

anonymous
()

Чем воспользоваться лучше? Есть ли подходящий паттерн?

Передавать в конструктор класса либо отдельные значения из конфига, либо весь конфиг (уже сконструированный, разумеется), ну и ещё ничего не передавать (синглтон), но это моветон. Твои варианты - какая-то дичь, или ты что-то важное умалчиваешь.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от sniper21

конфиги редактируют другие люди

И они же лучше знают локальные особенности?

DonkeyHot ★★★★★
()
Ответ на: комментарий от slovazap

Твои варианты - какая-то дичь, или ты что-то важное умалчиваешь.

Нет, странно что никаких особых паттернов для решения такой повсеместной задачи вроде бы как нет.

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Передать аргумент в класс - это даже не задача, каких ты для этого хочешь паттернов?

slovazap ★★★★★
()

Предложите паттерн

Builder.

Nastishka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.