Я разрабатываю / пишу небольшой инструментарий пользовательского интерфейса (в целях самосовершенствования, что еще?), И я не уверен, какой API будет лучше в следующих смыслах:
Некоторые важные элементы:
window
класс представляет собой окно, и может быть показано, скрыто, свернуто, развернуто, развернуто на весь экран и закрыто.proxy_property
класс, которому могут быть назначены произвольные функции get и set, например, отражает текущее значение, которое должно быть извлечено или установлено через некоторый внешний вызов API.property
класс, к которому можно подключиться (т.е. наблюдать), и когда ему будет назначено новое / другое значение, он сообщит это новое значение своим наблюдателям.Я не уверен, что лучший способ обработать состояние окна:
hide()
, isVisible()
и др. функции-члены, стиль Qt.hide()
, show()
и т. д. получают и обновляют соответственно.proxy_property
которому может быть назначено новое состояние, в результате чего hide()
, show()
и т. д. или их комбинацию при назначении нового значения.На первый взгляд, я предпочел бы номер 3 по причине 3, но в свете других условий я не уверен, насколько хорошо этот дизайн выдержит. Достаточно сказать, что я не видел, чтобы мой номер 3 использовался где-либо, и я боюсь слишком сильно опираться на мой proxy_property
Концепция, поскольку это может повлечь за собой больше накладных расходов, чем стоит (с другой стороны, это код пользовательского интерфейса, о котором мы говорим, поэтому накладные расходы, тем не менее, будут).
Для ясности:
enum class window_state { windowed, hidden, minimized, maximized, fullscreen_maximized };
class window
{
public:
proxy_property<window_state> state;
//....
};
Так можно сделать
some_window.state = window_state::minimized;
На самом деле сделать что-то более традиционно сделанное, например,
some_window.minimize();
Конечный результат будет функционально идентичен, конечно. Это просто API, который совершенно другой.
Я думаю, что вы должны быть осторожны, чтобы различать свойства, которые вы можете установить (например, скажем, visibility
из свойств, которые вы можете наблюдать (например, isVisible
), потому что во многих случаях наблюдаемые свойства зависят не только от настроек.
Контроль, например isVisible
если это имеет visibility == true
И это контейнер isVisible
,
Там нет причин, чтобы сделать контроль visibility
установление наблюдаемого, и это факт, что, вероятно, приведет к ошибкам.
По этой причине я бы предпочел сеттеры и геттеры для visibility
и прослушиваемое свойство для isVisible
,
Других решений пока нет …