(По общему признанию, название не слишком велико. Пожалуйста, простите мой английский, это лучшее, что я мог придумать.)
Я пишу скрипт на python, который будет управлять почтовыми доменами и их учетными записями, и я также новичок в ООП-дизайне. Мои две (связанные?) Проблемы:
- Класс Domain должен выполнять специальную работу по добавлению и удалению учетных записей, например добавлять / удалять их в базовой реализации
- как управлять операциями с учетными записями, которые должны проходить через их контейнер
Чтобы решить предыдущую проблему, я бы добавил фабричный метод в класс Domain, который создаст экземпляр Account в этом домене, и метод remove ( anti-factory ?) Для обрабатывать удаления.
Для последнего это кажется мне «анти-опа», поскольку логически это будет операция с учетной записью (например, изменение пароля), которая всегда должна ссылаться на содержащий домен. Мне кажется, что я должен добавить ссылку на домен в учетную запись и использовать ее для получения данных (например, имени домена) или вызова методов в классе домена.
Пример кода (элемент использует данные из контейнера), который управляет базовой Vpopmail системой:
class Account:
def __init__(self, name, password, domain):
self.name = name
self.password = password
self.domain = domain
def set_password(self, password):
os.system('vpasswd %s@%s %s' % (self.name, self.domain.name, password)
self.password = password
class Domain:
def __init__(self, domain_name):
self.name = domain_name
self.accounts = {}
def create_account(self, name, password):
os.system('vadduser %s@%s %s' % (name, self.name, password))
account = Account(name, password, self)
self.accounts[name] = account
def delete_account(self, name):
os.system('vdeluser %s@%s' % (name, self.name))
del self.accounts[name]
Другим вариантом было бы для Account.set_password вызвать метод Domain, который бы выполнял реальную работу - что для меня звучит одинаково безобразно.
Также обратите внимание на дублирование данных (имя учетной записи также является ключом dict), оно звучит логично (имена учетных записей являются «первичным ключом» внутри домена), но учетные записи должны знать свое имя.
РЕДАКТИРОВАТЬ: обратите внимание, приведенный выше код является лишь кратким примером, представьте его как псевдокод. Он намеренно не заботится об ошибках или проблемах безопасности и является неполным в данных и методах классов (параметры нежелательной почты для каждого пользователя, автоответчики, пересылки, размер почтового ящика и т. Д.).
Кроме того, этот пример у меня под рукой, но я думаю, что он может быть обобщен на другие различные логические структуры, подобные деревьям, где узлы должны знать о своих детях, а дети должны вызывать родителей (или предков верхнего уровня), чтобы сделать вещи.
Для меня это звучит логически похоже на наследование классов, но применяется к экземплярам разных типов (классов), связанных друг с другом.