Редактирование: Designing Qt-Style C++ APIs
Материал из Wiki.crossplatform.ru
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 25: | Строка 25: | ||
* <b>Быть интуитивным:</b> как и другие вещи в компьютере, API должен быть интуитивным. Опыт и различные предпосылки приводят к различному восприятию того, что является интуитивным, а что - нет. API является интуитивным, если пользователь среднего класса начинает работу без чтения документации, и если программист, не знающий API, может понять исходный код, написанный с использованием этого API. | * <b>Быть интуитивным:</b> как и другие вещи в компьютере, API должен быть интуитивным. Опыт и различные предпосылки приводят к различному восприятию того, что является интуитивным, а что - нет. API является интуитивным, если пользователь среднего класса начинает работу без чтения документации, и если программист, не знающий API, может понять исходный код, написанный с использованием этого API. | ||
* <b>Быть легко запоминаемым:</b> Чтобы сделать API простым для запоминания, выберите согласованную и точную политику именования. Используйте узнаваемые шаблоны и концепции, и избегайте сокращений. | * <b>Быть легко запоминаемым:</b> Чтобы сделать API простым для запоминания, выберите согласованную и точную политику именования. Используйте узнаваемые шаблоны и концепции, и избегайте сокращений. | ||
- | * <b>Способствовать | + | * <b>Способствовать читабельности кода:</b> Код пишется однажды, но читается (и отлаживается, и изменяется) множество раз. Иногда написание читабельного кода может занять много времени, но это в результате сэкономит время в течении всего жизненного цикла продукта. |
Наконец, имейте в виду, что разные пользователи будут использовать различные части вашего API. В то время как использование экземпляров классов Qt должно быть интуитивно понятным, логично предполагать, что пользователь прочтет документацию перед использованием класса. | Наконец, имейте в виду, что разные пользователи будут использовать различные части вашего API. В то время как использование экземпляров классов Qt должно быть интуитивно понятным, логично предполагать, что пользователь прочтет документацию перед использованием класса. | ||
Строка 52: | Строка 52: | ||
== Ловушки булевых параметров == | == Ловушки булевых параметров == | ||
- | Булевые параметры часто приводят к не читаемому коду. В частности, практически всегда будет ошибкой добавление <tt>булевого</tt> параметра в функцию. В Qt, традиционным примером является функция <tt>repaint()</tt>, которая принимает не обязательный <tt>булевый</tt> параметр, указывающий, | + | Булевые параметры часто приводят к не читаемому коду. В частности, практически всегда будет ошибкой добавление <tt>булевого</tt> параметра в функцию. В Qt, традиционным примером является функция <tt>repaint()</tt>, которая принимает не обязательный <tt>булевый</tt> параметр, указывающий, олжен ли очищаться задний фон (по умолчанию) или нет. Это приводит к такому коду: |
{{code|qt|code= | {{code|qt|code= | ||
widget->repaint(false); | widget->repaint(false); | ||
Строка 148: | Строка 148: | ||
}} | }} | ||
- | Когда значения перечисления могут быть использованы с оператором 'или' и как флаги, традиционным решением является сохранение результата операции 'или' в переменной типа <tt>int</tt>, который не является типобезопасным. | + | Когда значения перечисления могут быть использованы с оператором 'или' и как флаги, традиционным решением является сохранение результата операции 'или' в переменной типа <tt>int</tt>, который не является типобезопасным. Qt4 предлагает шаблон <tt>QFlags<T></tt>, где <tt>T</tt> - тип перечисления. Для удобства в Qt есть ряд typedef'ов, так что вы можете писать <tt>Qt::Alignment</tt> вместо <tt>QFlags<Qt::AlignmentFlag></tt>. |
По соглашению мы даём имена типам в единственном числе (так как он может содержать один флаг в один момент времени), а имена флагов - во множественном числе. Например: | По соглашению мы даём имена типам в единственном числе (так как он может содержать один флаг в один момент времени), а имена флагов - во множественном числе. Например: | ||
Строка 192: | Строка 192: | ||
* Иногда, отсутствие приставки вводит в заблуждение, тогда мы используем приставку <tt>is</tt>-: | * Иногда, отсутствие приставки вводит в заблуждение, тогда мы используем приставку <tt>is</tt>-: | ||
** <tt>isOpenGLAvailable()</tt>, вместо <tt>openGL()</tt> | ** <tt>isOpenGLAvailable()</tt>, вместо <tt>openGL()</tt> | ||
- | ** <tt>isDialog()</tt>, вместо <tt>dialog()</tt> | + | ** <tt>isDialog()</tt>, вместо <tt>dialog()</tt> |
+ | |||
+ | *(От функции <tt>dialog()</tt>, мы обычно ожидаем, что она вернет [[Qt:Документация_4.3.2/qdialog | QDialog]] <tt>*</tt>.) | ||
Название сеттера получается из имени геттера, путем замены приставки <tt>is</tt> на <tt>set</tt>, например, <tt>'''set'''Down()</tt> и <tt>'''set'''ScrollBarsEnabled()</tt>. Имена свойств определяются подобно именам геттеров, но без приставки <tt>is</tt>. | Название сеттера получается из имени геттера, путем замены приставки <tt>is</tt> на <tt>set</tt>, например, <tt>'''set'''Down()</tt> и <tt>'''set'''ScrollBarsEnabled()</tt>. Имена свойств определяются подобно именам геттеров, но без приставки <tt>is</tt>. | ||
Строка 214: | Строка 216: | ||
}} | }} | ||
- | Только по первой строке можно понять, что с большой вероятностью <tt>h</tt>, <tt>s</tt> и <tt>v</tt> будут модифицированы в методе <tt> | + | Только по первой строке можно понять, что с большой вероятностью <tt>h</tt>, <tt>s</tt> и <tt>v</tt> будут модифицированы в методе <tt>gwtHsv()</tt>. |
<div id="casestudyqprogressbar"></div> | <div id="casestudyqprogressbar"></div> | ||
Строка 229: | Строка 231: | ||
int progress() const; | int progress() const; | ||
- | const QString &progressString() const; | + | const QString &progressString() const; |
bool percentageVisible() const; | bool percentageVisible() const; | ||
void setPercentageVisible(bool); | void setPercentageVisible(bool); | ||
Строка 246: | Строка 248: | ||
protected: | protected: | ||
- | virtual bool setIndicator(QString &progressStr, | + | virtual bool setIndicator(QString &progressStr, |
int progress, | int progress, | ||
int totalSteps); | int totalSteps); |