Я очень часто создаю объект, который не имеет открытых методов и самодостаточен. Обычно он обрабатывает события аргументов, передаваемых его конструктору в своих закрытых методах, и не вызывает никаких событий и не предоставляет открытых методов.
Я называю этот тип объектов "пассивными" объектами - объектами, для которых не определены общедоступные методы. Все взаимодействие происходит внутри них в приватных методах и событиях аргументов, передаваемых в конструктор.
Обычно это какой-то служебный класс, например, такой, который гарантирует, что две формы будут склеены:
public class StickyForm : IDisposable
{
private readonly Form form;
private readonly Form parentForm;
public StickyForm(Form form, Form parentForm)
{
this.form = form;
this.form.StartPosition = FormStartPosition.Manual;
this.parentForm = parentForm;
this.parentForm.LocationChanged += new EventHandler(parent_LocationChanged);
this.parentForm.SizeChanged += new EventHandler(parent_SizeChanged);
SetLocation();
}
void parent_SizeChanged(object sender, EventArgs e)
{
SetLocation();
}
void parent_LocationChanged(object sender, EventArgs e)
{
SetLocation();
}
private void SetLocation()
{
//compute location of form based on parent form
}
public void Dispose()
{
this.parentForm.SizeChanged -= parent_SizeChanged;
this.parentForm.LocationChanged -= parent_LocationChanged;
}
}
Но иногда это также своего рода контроллер, обеспечивающий взаимодействие между двумя представлениями:
public class BrowseController
{
private IBrowserView view;
private IFolderBrowser folderBrowser;
public BrowseController(IFolderBrowser folderBrowser, IBrowserView view)
{
this.view = view;
this.folderBrowser = folderBrowser;
this.folderBrowser.NodeOpened += folderBrowser_NodeOpened;
}
private void folderBrowser_NodeOpened(object sender, Core.Util.TEventArgs<IPictureList> e)
{
this.Browse(e.Value);
}
public void Browse(IPictureList content)
{
//stripped some code
AddItemsToView(content);
}
private void AddItemsToView(IPictureList browser)
{
//call methods on view
}
}
Считают ли такие "пассивные" объекты хорошей практикой проектирования?
Есть ли лучшее название для этого класса?