Разные функции или одно присваиваемое свойство с побочными эффектами?
Я разрабатываю / пишу небольшой инструментарий пользовательского интерфейса (в целях самосовершенствования, что еще?), И я не уверен, какой тип API будет лучше в следующих смыслах:
- самый низкий WTF? уровень.
- самый гибкий.
- самый краткий, но описательный
- лучше всего подходит со стандартом C++.
Некоторые важные элементы:
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, который совершенно другой.
1 ответ
Я думаю, что вы должны быть осторожны, чтобы различать свойства, которые вы можете установить (например, скажем, visibility
из свойств, которые вы можете наблюдать (например, isVisible
), потому что во многих случаях наблюдаемые свойства зависят не только от настроек.
Контроль, например isVisible
если это имеет visibility == true
И это контейнер isVisible
,
Там нет причин, чтобы сделать контроль visibility
установление наблюдаемого, и это факт, что, вероятно, приведет к ошибкам.
По этой причине я бы предпочел сеттеры и геттеры для visibility
и прослушиваемое свойство для isVisible
,