Qt Coding Style/es: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
(Update from english version)
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
'''Spanish''' [[Qt_Coding_Style|English]] [[Qt_Coding_Style_Russian|Русский]] [[Qt_Coding_Style_Japanese|日本語]]
{{LangSwitch}}


[[Category:Developing_Qt::Guidelines]][[Category:Spanish]]<br />[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]
[[Category:Developing_Qt::Guidelines]]


= Guia de estilo de código Qt =
Esta es una revisión a bajo nivel de las convenciones de escritura de programación utilizando Qt.
Ir a [[Coding Conventions]] para las convenciones de alto nivel.


Este es un resumen de las practicas de codificación que usamos al escribir el código de Qt.
Los datos han sido recopilados desde las fuentes de Qt, foros de discusión, discusiones por email y a través de colaboraciones de los desarrolladores.


Los datos han sido recogidos de diferentes fuentes relacionas con Qt, foros de discusión, discusiones de correo electrónico y mediante la colaboración de los desarrolladores.
== Indentación ==


== Sangrado (Indentación) ==
* 4 espacios por indentación
* Espacios, no tabs!


* Usar 4 espacios para sangrar
== Declaración de variables ==
* Espacios, no tabulaciones!


== Declarando variables ==
* Declarar cada variable en una línea distinta
* Evitar nombres sin sentido y cortos (ejemplo: "a", "rbarr", "nughdeget")
* Nombres de variables de solo un carácter serán aceptado solo para contadores y variables temporales, donde el propósito de la variable es obvio
* Solo declarar una variable hasta cuando será utilizada


* Declarar cada variable en una linea separada
<code>
* Evitar nombres cortos siempre que sea posible (ej. &quot;a&amp;quot;, &quot;rbarr&amp;quot;, &quot;nughdeget&amp;quot;)
// Incorrecto
* Se recomiendan nombres de variables de un solo caracter solamente para usar en contadores y dónde el propósito de la variable es obvio.
int a, b;
* Esperar hasta que sea necesario para declarar una variable
char *c, *d;


<code><br /> // Incorrecto<br /> int a, b;<br /> char *c, *d;
// Correcto
int height;
int width;
char *nameOfThis;
char *nameOfThat;
</code>


// Correcto<br /> int height;<br /> int width;<br /> char *nameOfThis;<br /> char '''nameOfThat;<br /></code>
* Variables y funciones comienzan con una letra minúscula. Cada palabra consecutiva en el nombre de la variable comienza con una letra mayúscula
* Evitar abreviaciones


<br />''' El nombre de las variables y las funciones comienza con una letra minúsculas. Las siguientes palabras en el nombre de la variable empiezan con una letra mayúscula.
<code>
// Incorrecto
short Cntr;
char ITEM_DELIM = ' ';


* Evitar la abreviaturas
// Correcto
short counter;
char itemDelimiter = ' ';
</code>


<code><br /> // Incorrecto<br /> short Cntr;<br /> char ITEM_DELIM = '';
* Las clases siempre comienzan con mayúscula. Las clases públicas comienzan con una 'Q' (QRgb) seguida de una letra en mayúscula. Las funciones públicas habitualmente comienzan con una 'q' (qRgb).
* Los acrónimos utilizan camel-case (ejemplo: QXmlStreamReader, no QXMLStreamReader).


// Correcto<br /> short counter;<br /> char itemDelimiter = '';<br /></code>
== Espacios en blanco ==
 
* Utilizar líneas vacías para agrupar declaraciones relacionadas
* Siempre utilizar solo una línea vacía
* Siempre utilizar un espacio en blanco despues de una palabra clave y antes de un paréntesis redondo:
 
<code>
// Incorrecto
if(foo){
}
 
// Correcto
if (foo) {
}
</code>
 
* Para punteros o referencias, siempre utilizar un solo espacio en blano entre el tipo y el '*' o '&', pero sin espacios entre '*' o '&' y el nombre de la variable:
 
<code>
char *x;
const QString &myString;
const char * const y = "hola";
</code>
 
* Rodear operadores binarios con espacios
* No utilizar espacios despues de un cast
* Evitar cast con estilo de "C" cuando es posible
 
<code>
// Incorrecto
char* blockOfMemory = (char* ) malloc(data.size());
 
// Correct
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
</code>
 
* No escribir multiples declaraciones en una línea
* Por extensión, utilizar una nueva línea para el cuerpo de una declaración de flujo de control:
 
<code>
// Incorrecto
if (foo) bar();
 
// Correct
if (foo)
    bar();
</code>
 
== Paréntesis ==
 
* Utilizar llaves adjuntas: La llave the abre va en la misma línea que la declaración. Si la llave que cierra es seguida por otra palabra clave, se incluye en la misma línea:
 
<code>
// Incorrecto
if (codec)
{
}
else
{
}
 
// Correcto
if (codec) {
} else {
}
</code>
 
* Excepción: Las implementaciones de funciones (no lambdas) y las declaraciones de clases  siempre deben tener la llave izquierda al comienzo de una línea:
 
<code>
static void foo(int g)
{
    qDebug("foo: %i", g);
}
 
class Moo
{
};
</code>
 
* Utilizar paréntesis de llave solo cuando el cuerpo de una declaración de condición contiene mas de una línea:
 
<code>
// Incorrecto
if (address.isEmpty()) {
    return false;
}
 
for (int i = 0; i < 10; ++i) {
    qDebug("%i", i);
}


* Los nombres de las Clases siempre comienzan con una letra mayuscular. Clases publicas comienzan con una 'Q' (QRgb). Las funciones publicas a menudo comienzan con una 'q' (qRgb).
// Correcto
if (address.isEmpty())
    return false;


== Espacios en blanco ==
for (int i = 0; i < 10; ++i)
    qDebug("%i", i);
</code>
 
* Excepción 1: Utilizar paréntesis también si la declaración padre cubre varias líneas:
<code>
// Correcto
if (address.isEmpty() || !isValid()
    || !codec) {
    return false;
}
</code>


* Usar lineas en blanco para agrupar declaraciones
* Excepción 2: Simetria de paréntesis: Utilizar paréntesis también en bloques if-then-else
* Siempre usar una linea en blanco
donde el código de if o de else considera varias líneas:
* Siempre usar un espacio en blanco despues de un carácter, y antes de un corchete


<code><br /> // Incorrecto<br /> if(foo){<br /> }
<code>
// Incorrecto
if (address.isEmpty())
    qDebug("empty!");
else {
    qDebug("%s", qPrintable(address));
    it;
}


// Correcto<br /> if (foo) {<br /> }<br /></code>
// Correcto
if (address.isEmpty()) {
    qDebug("empty!");
} else {
    qDebug("%s", qPrintable(address));
    it;
}


* Para punteros o referencias, siempre usar un espacio en blanco entre el '' o '&amp;', pero no usarlos entre '' o '&amp;' y el nombre de la variable
// Incorrecto
if (a)
    ...
else
    if (b)
        ...


<code><br /> char '''x;<br /> const QString &amp;myString;<br /> const char''' const y = &quot;hello&amp;quot;;<br /></code>
// Correcto
if (a) {
    ...
} else {
    if (b)
        ...
}
</code>


* Envuelva los operadores binarios con espacios
* Utilizar parentesis de llave cuando el cuerpo de la declaración de un condicional está vacío.
* Ningún espacio después de un &quot;cast&amp;quot;
* Evitar los &quot;cast&amp;quot; como en C, en la medida de lo posible


<code><br /> // Incorrecto<br /> char* blockOfMemory = (char* ) malloc(data.size());
<code>
// Incorrecto
while (a);


// Correcto<br /> char '''blockOfMemory = reinterpret_cast&amp;lt;char'''&gt;(malloc(data.size()));<br /></code>
// Correcto
while (a) {}
</code>


== Llaves ==
== Paréntesis  ==


* Como regla básica, el corchete izquierdo debe estar en la misma linea de inicio de la declaración:
* Utilizar paréntesis para agrupar expresiones:


<code><br /> // Incorrecto<br /> if (codec)<br /> {<br /> }
<code>
// Incorrecto
if (a && b || c)


// Correcto<br /> if (codec) {<br /> }<br /></code>
// Correcto
if ((a && b) || c)


* Las implementaciones de funciones y las declaraciones de clase siempre tendrán el corchete izquierdo en una nueva línea:
// Incorrecto
a + b & c


<code><br /> static void foo(int g)<br /> {<br /> qDebug(&quot;foo: %i&amp;quot;, g);<br /> }
// Correcto
(a + b) & c
</code>


class Moo<br /> {<br /> };<br /></code>
== Declaración de Switch ==


* Usar llaves cuando el cuerpo de una declaración condicional contenga mas de una linea, y también si una declaración de una simple linea es algo compleja.
* Las etiquetas case deben estar en la misma columna que el switch
* Cada case debe tener un break (o return) al final o utilizar <kbd>Q_FALLTHROUGH()</kbd> para indicar que no hay intencionalmente un break, a menos que otro case comience inmediatamente


<code><br /> // Incorrecto<br /> if (address.isEmpty()) {<br /> return false;<br /> }
<code>
switch (myEnum) {
case Value1:
  doSomething();
  break;
case Value2:
case Value3:
  doSomethingElse();
  Q_FALLTHROUGH();
default:
  defaultHandling();
  break;
}
</code>


for (int i = 0; i &lt; 10; +''i) {<br /> qDebug(&quot;%i&amp;quot;, i);<br /> }
== Declaración de saltos (break, continue, return, y goto) ==
<br /> // Correcto<br /> if (address.isEmpty())<br /> return false;
<br /> for (int i = 0; i &lt; 10;i)<br /> qDebug(&quot;%i&amp;quot;, i);<br /></code>
<br />* Excepción 1: Use llaves a si la declaración padre abarca muchas lineas
<br /><code><br /> // Correcto<br /> if (address.isEmpty() || !isValid()<br /> || !codec) {<br /> return false;<br /> }<br /></code>
<br />* Excepción 2: Use llaves también en bloques if-then-else, donde el código 'if' o el código 'else' ocupen varias lineas.
<br /><code><br /> // Incorrecto<br /> if (address.isEmpty())<br /> return false;<br /> else {<br /> qDebug(&quot;%s&amp;quot;, qPrintable(address));<br />it;<br /> }
<br /> // Correcto<br /> if (address.isEmpty()) {<br /> return false;<br /> } else {<br /> qDebug(&quot;%s&amp;quot;, qPrintable(address));<br />it;<br /> }
<br /> // Incorrecto<br /> if (a)<br /> if (b)<br /> …<br /> else<br /> …
<br /> // Correcto<br /> if (a) {<br /> if (b)<br /> …<br /> else<br /> …<br /> }<br /></code>
<br />* Use llaves cuando el cuerpo de una sentencia condicional este vacía
<br /><code><br /> // Incorrecto<br /> while (a);
<br /> // Correcto<br /> while (a) {}<br /></code>
<br />h2. Paréntesis
<br />* Use paréntesis para agrupar expresiones:
<br /><code><br /> // Incorrecto<br /> if (a &amp;&amp; b || c)
<br /> // Correcto<br /> if ((a &amp;&amp; b) || c)
<br /> // Incorrecto<br /> a'' b &amp; c


// Correcto<br /> (a + b) &amp; c<br /></code>
* No escribir 'else' despues de declaraciones de salto:


== Declaraciones Switch ==
<code>
// Incorrecto
if (thisOrThat)
    return;
else
    somethingElse();


* El case debe estar en la misma columna que el switch
// Correcto
* Cada declaración case debe tener un break (o return) al final o un comentario que indique porque intencionalmente no hay un break
if (thisOrThat)
    return;
somethingElse();
</code>


<code><br /> switch (myEnum) {<br /> case Value1:<br /> doSomething();<br /> break;<br /> case Value2:<br /> doSomethingElse();<br /> // fall through<br /> default:<br /> defaultHandling();<br /> break;<br /> }<br /></code>
* Excepción: Si el código simétrico, el uso de'else' está permitido para visualizar dicha simetria.


== Saltos de linea ==
== Quiebres de línea ==


* Limite el largo de las lineas a 100 caracteres, inserte saltos de linea si son necesarios
* Mantener líneas con menos de 100 caracteres; el quebrado es posible si es necesario
** Líneas de comentarios/apidoc deben tener menos de 80 columnas de texto. Adjustar a los alrededores, e intentar continuar el flujo del texto para evitar párrafos "jagged".
* Las comas van al final de las líneas quebradas; los operadores comienzan al inicio de las líneas nuevas. Un operador al final de la línea es fácil de ignorar si el editor es muy estrecho.


* Las comas van al final de una línea quebrada, los operadores deben empezar al principio de la nueva línea. Un operador al final de la línea no es fácil de ver si el editor es demasiado estrecho.
<code>
// Incorrecto
if (longExpression +
    otherLongExpression +
    otherOtherLongExpression) {
}


<code><br /> // Correcto<br /> if (longExpression<br /> + otherLongExpression<br /> + otherOtherLongExpression) {<br /> }
// Correcto
if (longExpression
    + otherLongExpression
    + otherOtherLongExpression) {
}
</code>


// Incorrecto<br /> if (longExpression +<br /> otherLongExpression +<br /> otherOtherLongExpression) {<br /> }<br /></code>
== Excepciones generales ==


== Herencia y la keyword `virtual` ==
* Cuando se siga alguna regla y haga que el código se vea mal, existe total libertad para romper dicha regla


* Cuando reimplemente un método virtual, ''no'' ponga la keyword `virtual` en el archivo header.
== Estilo artístico ==
El siguiente 'snippet' puede utilizarse para darle un nuevo formato artístico al código:<code>
--style=kr
--indent=spaces=4
--align-pointer=name
--align-reference=name
--convert-tabs
--attach-namespaces
--max-code-length=100
--max-instatement-indent=120
--pad-header
--pad-oper
</code>


== Excepción general ==
Notar que "unlimited" --max-instatement-indent es utilizado solo  porque astyle no es suficientemente inteligente para agrupar el primer argumento si las líneas siguientes necesitan limitaciones de indentación. Se le recomienda limitar manualmente in-statement-indent a aproximadamente 50 columnas:
<code>
    int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
            first_argument, second_argument, third_arugment));
</code>

Latest revision as of 09:18, 6 February 2018

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

Esta es una revisión a bajo nivel de las convenciones de escritura de programación utilizando Qt. Ir a Coding Conventions para las convenciones de alto nivel.

Los datos han sido recopilados desde las fuentes de Qt, foros de discusión, discusiones por email y a través de colaboraciones de los desarrolladores.

Indentación

  • 4 espacios por indentación
  • Espacios, no tabs!

Declaración de variables

  • Declarar cada variable en una línea distinta
  • Evitar nombres sin sentido y cortos (ejemplo: "a", "rbarr", "nughdeget")
  • Nombres de variables de solo un carácter serán aceptado solo para contadores y variables temporales, donde el propósito de la variable es obvio
  • Solo declarar una variable hasta cuando será utilizada
 // Incorrecto
 int a, b;
 char *c, *d;

 // Correcto
 int height;
 int width;
 char *nameOfThis;
 char *nameOfThat;
  • Variables y funciones comienzan con una letra minúscula. Cada palabra consecutiva en el nombre de la variable comienza con una letra mayúscula
  • Evitar abreviaciones
 // Incorrecto
 short Cntr;
 char ITEM_DELIM = ' ';

 // Correcto
 short counter;
 char itemDelimiter = ' ';
  • Las clases siempre comienzan con mayúscula. Las clases públicas comienzan con una 'Q' (QRgb) seguida de una letra en mayúscula. Las funciones públicas habitualmente comienzan con una 'q' (qRgb).
  • Los acrónimos utilizan camel-case (ejemplo: QXmlStreamReader, no QXMLStreamReader).

Espacios en blanco

  • Utilizar líneas vacías para agrupar declaraciones relacionadas
  • Siempre utilizar solo una línea vacía
  • Siempre utilizar un espacio en blanco despues de una palabra clave y antes de un paréntesis redondo:
 // Incorrecto
 if(foo){
 }

 // Correcto
 if (foo) {
 }
  • Para punteros o referencias, siempre utilizar un solo espacio en blano entre el tipo y el '*' o '&', pero sin espacios entre '*' o '&' y el nombre de la variable:
 char *x;
 const QString &myString;
 const char * const y = "hola";
  • Rodear operadores binarios con espacios
  • No utilizar espacios despues de un cast
  • Evitar cast con estilo de "C" cuando es posible
 // Incorrecto
 char* blockOfMemory = (char* ) malloc(data.size());

 // Correct
 char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
  • No escribir multiples declaraciones en una línea
  • Por extensión, utilizar una nueva línea para el cuerpo de una declaración de flujo de control:
 // Incorrecto
 if (foo) bar();

 // Correct
 if (foo)
     bar();

Paréntesis

  • Utilizar llaves adjuntas: La llave the abre va en la misma línea que la declaración. Si la llave que cierra es seguida por otra palabra clave, se incluye en la misma línea:
 // Incorrecto
 if (codec)
 {
 }
 else
 {
 }

 // Correcto
 if (codec) {
 } else {
 }
  • Excepción: Las implementaciones de funciones (no lambdas) y las declaraciones de clases siempre deben tener la llave izquierda al comienzo de una línea:
 static void foo(int g)
 {
     qDebug("foo: %i", g);
 }

 class Moo
 {
 };
  • Utilizar paréntesis de llave solo cuando el cuerpo de una declaración de condición contiene mas de una línea:
 // Incorrecto
 if (address.isEmpty()) {
     return false;
 }

 for (int i = 0; i < 10; ++i) {
     qDebug("%i", i);
 }

 // Correcto
 if (address.isEmpty())
     return false;

 for (int i = 0; i < 10; ++i)
     qDebug("%i", i);
  • Excepción 1: Utilizar paréntesis también si la declaración padre cubre varias líneas:
 // Correcto
 if (address.isEmpty() || !isValid()
     || !codec) {
     return false;
 }
  • Excepción 2: Simetria de paréntesis: Utilizar paréntesis también en bloques if-then-else
donde el código de if o de else considera varias líneas:
 // Incorrecto
 if (address.isEmpty())
     qDebug("empty!");
 else {
     qDebug("%s", qPrintable(address));
     it;
 }

 // Correcto
 if (address.isEmpty()) {
     qDebug("empty!");
 } else {
     qDebug("%s", qPrintable(address));
     it;
 }

 // Incorrecto
 if (a)
     ...
 else
     if (b)
         ...

 // Correcto
 if (a) {
     ...
 } else {
     if (b)
         ...
 }
  • Utilizar parentesis de llave cuando el cuerpo de la declaración de un condicional está vacío.
 // Incorrecto
 while (a);

 // Correcto
 while (a) {}

Paréntesis

  • Utilizar paréntesis para agrupar expresiones:
 // Incorrecto
 if (a && b || c)

 // Correcto
 if ((a && b) || c)

 // Incorrecto
 a + b & c

 // Correcto
 (a + b) & c

Declaración de Switch

  • Las etiquetas case deben estar en la misma columna que el switch
  • Cada case debe tener un break (o return) al final o utilizar Q_FALLTHROUGH() para indicar que no hay intencionalmente un break, a menos que otro case comience inmediatamente
 switch (myEnum) {
 case Value1:
   doSomething();
   break;
 case Value2:
 case Value3:
   doSomethingElse();
   Q_FALLTHROUGH();
 default:
   defaultHandling();
   break;
 }

Declaración de saltos (break, continue, return, y goto)

  • No escribir 'else' despues de declaraciones de salto:
 // Incorrecto
 if (thisOrThat)
     return;
 else
     somethingElse();

 // Correcto
 if (thisOrThat)
     return;
 somethingElse();
  • Excepción: Si el código simétrico, el uso de'else' está permitido para visualizar dicha simetria.

Quiebres de línea

  • Mantener líneas con menos de 100 caracteres; el quebrado es posible si es necesario
    • Líneas de comentarios/apidoc deben tener menos de 80 columnas de texto. Adjustar a los alrededores, e intentar continuar el flujo del texto para evitar párrafos "jagged".
  • Las comas van al final de las líneas quebradas; los operadores comienzan al inicio de las líneas nuevas. Un operador al final de la línea es fácil de ignorar si el editor es muy estrecho.
 // Incorrecto
 if (longExpression +
     otherLongExpression +
     otherOtherLongExpression) {
 }

 // Correcto
 if (longExpression
     + otherLongExpression
     + otherOtherLongExpression) {
 }

Excepciones generales

  • Cuando se siga alguna regla y haga que el código se vea mal, existe total libertad para romper dicha regla

Estilo artístico

El siguiente 'snippet' puede utilizarse para darle un nuevo formato artístico al código:

--style=kr 
--indent=spaces=4 
--align-pointer=name 
--align-reference=name 
--convert-tabs 
--attach-namespaces
--max-code-length=100 
--max-instatement-indent=120 
--pad-header
--pad-oper

Notar que "unlimited" --max-instatement-indent es utilizado solo porque astyle no es suficientemente inteligente para agrupar el primer argumento si las líneas siguientes necesitan limitaciones de indentación. Se le recomienda limitar manualmente in-statement-indent a aproximadamente 50 columnas:

    int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
            first_argument, second_argument, third_arugment));