Что лучший способ состоит в том, чтобы обработать круговые зависимости среди объектов?

Можете ли вы изменить выражение SQL SELECT на следующее и посмотреть, решит ли это вашу проблему:

cur.execute("SELECT COUNT(*) FROM cart WHERE id_users = " + str(uid) +";")

, а затем измените следующее на:

noOfItems = cur.fetchone()
return noOfItems[0]

noOfItems будет удерживайте кортеж с одним элементом, значение COUNT(*), т.е. количество товаров в вашей корзине, где идентификатор пользователя равен uid.

Надеюсь, это поможет!

6
задан JamesEggers 6 May 2009 в 19:19
поделиться

4 ответа

Я бы создал следующее:

ErrorConfig _errorConfig = ...; 
// ErrorConfig is a new config object containing only ErrorManager Configuration
ErrorManager _errorManager = new CustomErrorManager(_errorConfig);
ConfigManager _configManager = new CustomConfigManager(_errorManager);

Теперь ConfigManager может использовать готовый к запуску ErrorManager без проблем с начальной загрузкой, когда ErrorManager не готов обрабатывать ошибки.

3
ответ дан 17 December 2019 в 04:52
поделиться

Циклические ссылки обычно лучше всего очищать путем рефакторинга третьего класса, от которого оба зависят. Например, у вас может быть что-то вроде этого:

BootstrapConfigManager _bcm = new BootstrapConfigManager();
ErrorManager _errorManager = new CustomErrorManager(_bcm);
ConfigManager _configManager = new CustomConfigManager(_bcm, _errorManager);
2
ответ дан 17 December 2019 в 04:52
поделиться

Выполните рефакторинг кода. Вероятно, вы можете разбить классы, чтобы изолировать часть, которую вы можете инициализировать в первую очередь и передать обоим классам.

0
ответ дан 17 December 2019 в 04:52
поделиться

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

Переданный объект добавит связь, а затем вызовет метод AddRelationship другого:

static void AddRelationship(this ConfigManager configMgr, ErrorManager errMgr)
{
    this.ErrorManager = errMgr;
    if (this != errMgr.ConfigManager)
        errMgr.AddRelationship(this);
}

static void AddRelationship(this ErrorManager errMgr, ConfigManager configMgr)
{
    this.ConfigManager = configMgr;
    if (this != configManager.errMgr)
        configMgr.AddRelationship(this);
}

Это означает, что вы можете добавить отношения с помощью любого объекта.

ConfigManager cfg = new ConfigManager();
ErrorManager err = new ErrorManager();
//Assign using either:
err.AddRelationship(cfg);
//Or
cfg.AddRelationship(err);

Вам также следует создать расширения RemoveRelationship.

static void RemoveRelationship(this ConfigManager configMgr, ErrorManager errMgr)
{
    if (this.errorManager == errMgr)
    {
        this.errorManager = null;
        if (errManager.configManager == this) 
            errMgr.RemoveRelationship(this);
    }
}

static void RemoveRelationship(this ErrorManager errMgr, ConfigManager cfgMgr)
{
    if (this.ConfigManager == cfgMgr)
    {
        this.configManager = null;
        if (cfgMgr.errorManager == this)
            cfgMgr.RemoveRelationship(this);
    }
}

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

0
ответ дан 17 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: