Это немного странный сценарий. У меня был класс, который быстро становился классом Бога. Это делало слишком много. Внезапно я нарушил СРП. Класс отвечал за X и Y и Z, о и A, и B, не забывайте C. Так что я решил реорганизовать его. Причина, по которой он стал таким большим, заключается в том, что класс выполняет большую работу с коллекцией, и я проделал большую работу по синхронизации доступа к ней, поскольку это многопоточная система, использующая ReaderWriterLockSlim.
Итак, я определил основные обязанности. Есть часть, которая кормит коллекцию. Иногда может потребоваться сделать новый элемент в коллекции. У меня есть объект, который очищает коллекцию по таймеру. Поэтому, когда таймер истекает, я ищу элементы, которые можно удалить из коллекции. Тогда у меня есть объект, который должен извлечь вещи из коллекции. Он должен запросить каждый элемент в коллекции, поэтому он должен повторяться.
Ранее объект делал все это сам. Прост в управлении с точки зрения блокировки. Не так легко провести юнит-тест. Слишком много всего происходит, слишком много насмешек. Это было просто противно. Разбиение его на части значительно облегчает тестирование модулей, НО значительно усложняет блокировку.
Таким образом, каждая часть, устройство подачи, очиститель и ретривер должны иметь экземпляр этого объекта. Так что я должен вставить его в конструктор, а затем я могу его смоделировать, и тестирование легко. Но теперь, поскольку коллекция является общей для многих объектов, я не могу предоставить каждому прямой доступ к ней. Мне нужно предоставить своего рода оболочку синхронизации.
Я думал, что, когда устройство подачи запрашивает новый элемент в коллекции, упаковщик блокирует коллекцию, создает новый элемент, передает его устройству подачи и уведомляет уборщика о наличии нового элемента в коллекции. Уборщик добавляет этот предмет в свою копию коллекции.
Когда уборщик запускается, он просматривает свою версию коллекции, когда он находит что-то, что может быть удалено, он удаляет его из своей коллекции и информирует обертку, а обертка уведомляет устройство подачи, которое вынимает ее из своей коллекции. Ретривер использует цикл foreach. Таким образом, оболочка может реализовывать IEnumerator и IDispose. Затем, когда счетчик создан, я могу заблокировать коллекцию, а когда он удаляется, я могу выйти из блокировки.
- Есть ли шаблон дизайна для того, что я пытаюсь сделать?
- Есть ли лучший способ сделать это?
- Какое хорошее название для этой обертки?
Я подумал о следующем:
- Провайдер (но это больше, чем просто предоставление)
- Maintainer (немного расплывчато)
- Синхронизатор (мне этот нравится больше всего)