Редактирование: 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>Способствовать читабельности кода:</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>, который не является типобезопасным. Вместо этого Qt4 предлагает шаблон <tt>QFlags<T></tt>, где <tt>T</tt> - тип перечисления. А для удобства в Qt есть ряд typedef'ов, так что вы можете писать <tt>Qt::Alignment</tt> вместо <tt>QFlags<Qt::AlignmentFlag></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><br />(От функции <tt>dialog()</tt>, мы обычно ожидаем, что она вернет [[Qt:Документация_4.3.2/qdialog | QDialog]]<tt>*</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>getHsv()</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 &amp;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 &amp;progressStr,
                               int progress,
                               int progress,
                               int totalSteps);
                               int totalSteps);

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Wiki.crossplatform.ru:Авторское право). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!


Шаблоны, использованные на текущей версии страницы: