====== TWSG Code Conventions ====== O documento principal do TWSG Code Conventions pode ser encontrado no [[http://www.dpi.inpe.br/twsg/media/pub/restrito/code-conventions-2007-14-10-draft-pt-br.pdf|link]] (protegido). Este artigo no Wiki tende a ser um complemento deste manual de convenções de código. ===== Estrutura geral dos arquivos .h ===== Segundo o manual de convenções de código do TWSG, os arquivos de cabeçalho (.h) devem seguir esta estrutura: Header_File | |--LICENSE_HEADER | |--FILE_IDENTIFICATION | |--HEADER_FILE_GUARD | |--INCLUDES_SECTION | |--NAMESPACE_DECLARATION | |--CLASSES_DECLARATION | FUNCTIONS_DECLARATION | |--END_HEADER_FILE Estes componentes são discutidos brevemente nas subseções seguintes. ==== License header ==== A licença atualmente adotada no TerraOGC é a [[http://www.gnu.org/licenses/licenses.html#GPL|GNU GPL v3]]. Portanto todos os arquivos de cabeçalho, e os de implementação também (.cpp) devem iniciar pelas seguintes linhas: /* Copyright (C) 2007-2009 TerraLib Web Services Group. This file is part of TerraOGC - a framework for Web-GIS development. TerraOGC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. TerraOGC Framework is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TerraOGC. See COPYING. If not, write to TerraLib Web Services Group at or see the online site: http://www.dpi.inpe.br/twsg. */ Para adicionar o //License header// a um conjunto de arquivos já existentes numa pasta, você pode usar o seguinte comando no Linux: for i in `find . -name "*.js"`; do cp $i $i.bkp; cat ../header.txt $i.bkp > $i; rm -f $i.bkp; done Apenas altere o ''*.js'' para a extensão dos seus arquivos e crie o arquivo ''header.txt'' na pasta abaixo, com o conteúdo descrito neste tópico. Para personalizar ainda mais o comando basta olhar o funcionamento do comando ''find'' do shell. Por exemplo, você quer colocar o //License header// em todos os arquivos .h e .cpp de uma pasta, então você pode criar o ''header.txt'' com o conteúdo correto (lembrar de deixar uma linha em branco no final) e executar o seguinte comando nesta pasta: for i in `find . -name "*.h" -or -name "*.cpp"`; do cp $i $i.bkp; cat header.txt $i.bkp > $i; rm -f $i.bkp; done ==== File identification ==== Em seguida, todos os arquivos devem ser identificados com informações sobre seu nome, breve descrição e autor(es), segundo o exemplo abaixo: /** \file TeCGIUtils.h * \brief This file contains commom routines for dealing with CGI applications. * \author Gilberto Ribeiro de Queiroz * \author Emerson M A Xavier */ ==== Header file guard ==== As convenções do File header guard estão descritas no documento de referência. A principal alteração é a troca do prefixo ''OGWS'' por ''TERRAOGC'', segundo exemplo abaixo: #ifndef __TERRAOGC_COMMON_INTERNAL_TECGIUTILS_H #define __TERRAOGC_COMMON_INTERNAL_TECGIUTILS_H ==== Includes section ==== A seção de includes deve seguir os seguintes princípios: - Usar, sempre que possível, //forward declarations// - Colocar primeiro os arquivos do mesmo pacotes (diretório fonte) através de aspas - Colocar depois os arquivos de outros pacotes (outros diretórios) através de ''<'' e ''>'' - Iniciar cada lista de pacotes (inclusive do atual) com um comentário Exemplo: // TerraOGC WFS Utils include files #include "TeWFSUtilsConfig.h" // TerraOGC GML include files #include // Shapelib include files #include ==== Namespace declaration ==== Apenas inserir a declaração do namespace padrão do grupo. As //forward declarations// ocorrem antes e/ou depois desta declaração, dependendo do namespace ao qual as classes pertencem. Veja os exemplos: - Namespace sem //forward declarations//: namespace TeOGC { - Namespace com //forward declarations//: // Forward declarations class TeTable; namespace TeOGC { // Forward declarations class TeWFSInsertElement; class TeWFSUpdateElement; ==== Classes and Functions declarations ==== Seguir o manual. Existem vários exemplos no próprio CVS. ==== End header file ==== Apenas um fecho para o arquivo. Contém o final das declarações do namespace e do file header guard. Exemplo: } // end namespace TeOGC #endif // __TERRAOGC_COMMON_INTERNAL_TECGIUTILS_H Sempre lembrar de deixar **uma linha em branco** no final do arquivo