При написании приложений с графическим интерфейсом я использую класс верхнего уровня, который «контролирует» или «координирует» приложение. Класс верхнего уровня будет отвечать за координацию таких вещей, как инициализация сетевых подключений, обработка действий пользовательского интерфейса приложения, загрузка файлов конфигурации и т. Д.
На определенных этапах элемент управления приложения GUI передается другому классу, например, основной элемент управления переключается с экрана входа в систему на экран ввода данных после аутентификации пользователя. Различные классы должны использовать функциональность объектов, принадлежащих элементу управления верхнего уровня. В прошлом я просто передавал объекты подчиненным элементам управления или создавал интерфейс. В последнее время я перешел к передаче делегатов методов вместо целых объектов по двум основным причинам:
- При юнит-тестировании намного проще издеваться над методом, чем классом,
- Это делает код более читабельным, документируя в конструкторе классов, какие именно методы используются подчиненными классами.
Ниже приведен несколько упрощенных примеров кода:
delegate bool LoginDelegate(string username, string password);
delegate void UpdateDataDelegate(BizData data);
delegate void PrintDataDelegate(BizData data);
class MainScreen {
private MyNetwork m_network;
private MyPrinter m_printer;
private LoginScreen m_loginScreen;
private DataEntryScreen m_dataEntryScreen;
public MainScreen() {
m_network = new Network();
m_printer = new Printer();
m_loginScreen = new LoginScreen(m_network.Login);
m_dataEntryScreen = new DataEntryScreen(m_network.Update, m_printer.Print);
}
}
class LoginScreen {
LoginDelegate Login_External;
public LoginScreen(LoginDelegate login) {
Login_External = login
}
}
class DataEntryScreen {
UpdateDataDelegate UpdateData_External;
PrintDataDelegate PrintData_External;
public DataEntryScreen(UpdateDataDelegate updateData, PrintDataDelegate printData) {
UpdateData_External = updateData;
PrintData_External = printData;
}
}
Мой вопрос заключается в том, что, хотя я предпочитаю этот подход, и он имеет смысл для меня, как следующий разработчик найдет его? В примерах и с открытым исходным кодом интерфейсы кода C # являются предпочтительным подходом для разделения, тогда как этот подход использования делегатов больше склоняется к функциональному программированию. Могу ли я заставить последующих разработчиков ругаться под нос за то, что для них является нелогичным?