Где разместить правила для создания карты между двумя наборами данных? - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть класс MasterData, экземпляры которого содержат некоторую общую информацию обо всех возможных гаджетах.

У меня есть другой класс CustomerData, экземпляры которого содержат:

  • некоторую конкретную информацию оподмножество этих гаджетов, предоставленное нам клиентом
  • , ссылка от каждого гаджета на тот же гаджет в конструкторе MasterData

CustomerData принимает в качестве параметров:

  • файл, предоставленный клиентом
  • модуль Python, который я написал для каждого клиента, который содержит различные сведения о файле клиента в форме переменных уровня модуля;например, в нем указано, какое поле клиента содержит идентификатор продукта;и т. д.

Связывание было таким же простым, как получение соответствующего идентификатора из файла клиента и поиск его в соответствующем поле основных данных.Имена полей, которые содержали соответствующие идентификаторы (customer и master), были предоставлены, среди прочего, в модуле customer.Реальное связывание было выполнено в конструкторе CustomerData.

Все работало нормально, пока мы не пришли к новым, намного более сложным, соответствующим правилам.Каждое правило сопоставления применимо только к конкретному клиенту, поэтому я решил поместить все возможные правила сопоставления в модуль для каждого клиента, а затем позволить приложению выбрать, какое правило оно хочет использовать.Но, к сожалению, новые правила сопоставления требуют работы с основными данными, и модуль, естественно, является «пассивным» объектом, который даже не имеет ссылки на основные данные.

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

Или я должен разместить правила соответствия в другом месте?

1 Ответ

1 голос
/ 07 февраля 2012

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

Как правило.

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

Это не должен быть модуль.Это не неправильно .Но это может сбивать с толку.

Подумайте об изменении вещей, чтобы у вас было что-то вроде этого.

class AbstractCustomerData( object ):
   """Generic features common to all customer data."""

Тогда.У каждого клиента есть модуль, который имеет

from the_master_copy import AbstractCustomerData

class ThisCustomerData( AbstractCustomerData ):
    """All the various kinds of overrides and whatnot."""
    def the_matching_rule( self, master_data_object_or_collection_or_whatever ):
        """This customer's override."""

. Таким образом, вы можете использовать свои экземпляры ThisCustomerData в модуле клиента.Модуль не аргумент ни к чему;модуль содержит код клиента.

Тогда установка вашего приложения клиентом выглядит следующим образом

import generic_stuff
from customer_module import ThisCustomerData, other_feature, yet_more

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...