Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SO FT WA R E
Do cu me nt o de E s t án dar es
de Pr ogr am ac ió n
Tabla de Contenidos
1. Introducción.................................................................................................................5
1.1 Convenciones Utilizadas..................................................................................................5
1.2 Actualizaciones Futuras...................................................................................................6
1.3 Referencias Básicas del Documento...................................................................................6
1.4 Ejemplos de Código.......................................................................................................6
1.5 Matriz de Cumplimiento para Desarrollo en C++...................................................................6
2. Recomendaciones Generales............................................................................................7
2.1 Cualquier modificación es permitida en mejora de la guía........................................................7
2.2 Violaciones de la reglas...................................................................................................7
3. Estructura de Proyectos en C++........................................................................................8
4. Reglas para el Control de Versiones...................................................................................9
4.1 Versionar código sin defectos...........................................................................................9
4.2 Estructura de comentarios de cambio..................................................................................9
4.3 Mantener la Rama Principal Incorrupta...............................................................................9
4.4 Asociar Cambios en las Ramas con Software de Control de Tareas. ...........................................9
4.5 Guardar los cambios frecuentemente..................................................................................9
4.6 Realizar Merge antes de todo Update..................................................................................9
4.7 Commit.....................................................................................................................10
4.8 Backups.....................................................................................................................10
4.9 Restores.....................................................................................................................10
5. Definición de Reglas Generales para el nombramiento de código C++.....................................11
5.1 Estructuración de nombres significativos...........................................................................11
5.2 Estructuración de nombres descriptivos.............................................................................11
5.3 Inicialización de variables..............................................................................................11
5.4 Variables genéricas deben usar el mismo nombre que el tipo..................................................12
5.5 Variables no genéricas deben tener como nombre el rol y tipo................................................12
5.6 Variables deben tener el mínimo alcance posible.................................................................12
5.7 Conversión de variables debe ser realizada explícitamente.....................................................12
5.8 Prueba implícita con 0 deberá usarse únicamente para variables boolean...................................12
5.9 Variables globales deberán usar el operador “::”..................................................................12
5.10 Toda variable deberá tener máximo 20 caracteres de longitud. ................................................12
5.11 Variables que representen colecciones de elementos debe escribirse en plural.............................13
5.12 Toda variable de GUI deberá tener como sufijación el nombre del tipo de componente. ................13
5.13 Toda variable que representa valores numéricos deberá incluir el prefijo “n” seguido del nombre de la
variable en mayúscula..................................................................................................13
5.14 Todo valor de punto flotante debe tener al menos un dígito antes del punto y/o un decimal. ...........13
5.15 Usar “NULL” en lugar de “0”, por ser un estándar de C aunque en C++ ya está obsoleto. ..............13
5.16 Evitar el uso de goto en lo posible....................................................................................13
5.17 Todo iterador deberá ser declarado con variables especiales como “i”, “j”, “k”. ..........................14
2
5.18 El prefijo “is” deberá ser usado para variables o métodos de tipo boolean. .................................14
5.19 Sugerencias sobre el uso de abreviaturas............................................................................14
5.20 El uso de palabras como Compute y Find deberán emplearse según su definición. .......................15
5.21 Uso de abreviaciones y/o acrónimos como nombre deberá ser escrito utilizando el estándar 5.1 ......15
5.22 El término “initialize” debe ser usado según su concepción, evitando en lo posible el uso de
abreviaturas como “init” o derivados como “load”...............................................................15
5.23 Enumeraciones............................................................................................................16
5.24 Excepciones...............................................................................................................16
5.25 Espacios de nombre (namespaces)...................................................................................16
6. Comentarios y Estilos...................................................................................................18
6.1 Comentarios...............................................................................................................18
6.1.1 En los encabezados de archivos.......................................................................................18
6.1.2 En las declaraciones de código........................................................................................18
6.1.3 En una línea de código..................................................................................................19
6.2 Estilos.......................................................................................................................19
6.2.1 Identación debe tener 2 espacios en blanco.........................................................................19
6.2.2 Espacios en blanco.......................................................................................................19
6.2.3 Construcciones “if-else” deben tener la siguiente estructuración..............................................20
6.2.4 Construcciones “switch-case” deben tener la siguiente estructuración .......................................20
6.2.5 Construcciones “for” y “while” deben tener la siguiente estructuración .....................................20
6.2.6 Unidades lógicas de código debe estar separadas por una línea en blanco..................................21
6.2.7 Construcciones “try-catch” deben tener la siguiente estructuración..........................................21
7. Control y Repetición....................................................................................................22
7.1 Evitar el uso de expresiones condicionales complejas...........................................................22
7.2 Construcción “if” con flujo regular de ejecución y “else” con flujo de excepción .........................22
7.3 Bloque de instrucción de condicionales debe ir en una línea separada.......................................22
7.4 Evitar la asignación de valores en condicionales..................................................................22
7.5 Sólo incluir variables de iteración en construcciones “for”.....................................................22
7.6 Variables de control deben ser inicializadas inmediatamente antes de ser usadas .........................23
7.7 Evitar el uso de “do..while”, usar construcciones basadas en “while” o “for” ..............................23
7.8 Evitar el uso de instrucciones “while (1)” y “for(;;)” ya que no son muy legibles .........................23
8. Archivos...................................................................................................................24
8.1 Extensiones................................................................................................................24
8.2 Incluir guards en los archivos de cabecera..........................................................................24
8.3 Orden y agrupamiento de las instrucciones “include”............................................................25
8.4 Contenido..................................................................................................................25
8.5 Evitar el uso de TAB y page break...................................................................................25
9. Declaración de Clases y Estructuras.................................................................................26
9.1 Organización de una clase o estructura (ref: Hight Integrity Rule. 3.1.1)....................................26
9.2 Restringir el uso de Herencia Múltiple..............................................................................26
9.3 Declaración de miembros...............................................................................................26
9.4 Constructores y Destructores..........................................................................................27
9.5 Utilizar Deep Copy para duplicar objetos (ref: High Integrity CPP Rule 3.1.3, 3.1.4,
3.1.5).....................................................................................................................28
9.6 Uso de Const..............................................................................................................28
9.7 Utilizar en métodos con valor en lugar de constantes...........................................................29
9.8 Reutilización el Comportamiento.....................................................................................30
9.9 Macros debe ser creadas para simplificar la escritura de código y/o reusar comportamiento genérico.
...............................................................................................................................31
9.10 Aserciones.................................................................................................................31
10................................................................................................................................................31
11. Patrones de Diseño......................................................................................................32
11.1 Patrón Observer...........................................................................................................32
11.2 Patrón Fachada............................................................................................................33
3
11.3 Patrón Abstract Factory.................................................................................................34
11.4 Patrón Factory Method..................................................................................................36
11.5 Patrón Singleton..........................................................................................................37
Ejemplo:.....................................................................................................................................37
11.6 Patrón Listener............................................................................................................38
11.7 Patrón Estrategy..........................................................................................................38
11.8 Patrón Proxy...............................................................................................................39
12. Referencias................................................................................................................41
4
Estándar de Programación y Estilos de Codificación en C++
Versión 2.0, Noviembre de 20XX
1. Introducción
El presente documento detalla las recomendaciones más comunes para las convenciones
de nombre usadas en códigos de C++. Estas recomendaciones están basadas en
estándares establecidos recolectados de un gran número de fuentes, experiencia individual,
requerimientos locales, necesidades, como también sugerencias recibidas.
Este documento trata de ser más una guía para la programación en C++ que un documento
de recomendaciones técnicas.
Las IDE’s (entornos integrados de desarrollo) permiten al programador facilitar la lectura del
código mejorando la visibilidad con colores, formato automático, etc. El programador no
debería confiase en estas características ya que la visibilidad (comprensión) del código
debería estar por encima de las ayudas que nos pueda brindar un poderoso IDE. La idea es
maximizar la comprensión y lectura del código independientemente del IDE que se utilice.
Vea También: Sección que lista las referencias a reglas o guías que
son relevantes a la regla o guía actual.
5
Referencia: Esta sección lista las fuentes de las referencias relevantes.
High·Integrity C++ Coding Standard Manual v.2.4, Diciembre del 2006 © THE
PROGRAMMING RESEARCH GROUP.
Todos los ejemplos de código estarán contenidos dentro de recuadros con fondo
gris claro y tipo de letra Courier New, 10 pts. Por ejemplo:
class ProcessTopic
{
string m_processName;
int m_priority;
int m_cpuUsage;
string m_nodeName;
}
Característica Descripción
Descripción del Desarrollo Proyecto EMPRESA XXX
Versión del Compilador GNU compiler for C++ versión 4.3
Switches del Compilador 0-3
Tipo de Hardware Hardware para gabinetes G1, G2 y G3.
Sistema Operativo Ubunto 9.10
- DDS Open Splice v.4.x
Librería de Terceras Partes
- QT v. 4.5
6
2. Recomendaciones Generales
7
3. Estructura de Proyectos en C++
Antes de trabajar con un nuevo proyecto se deberá indicar el Workspace donde este
estará contenido, en este caso se utiliza el Workspace EMPRESA XXX. Al añadir un
nuevo proyecto, ese se deberá trabajar con una instancia de la IDE de Eclipse, es decir
si se trabaja con dos proyectos a la vez se tendrán dos ventanas de la IDE una por cada
proyecto.
Cualquier proyecto nuevo se deberá estructurar con las siguientes carpetas, según se
muestra a continuación:
CARPETA PROPÓSITO
Módulo del proyecto EMPRESA XXX. Corresponde al
Proyecto
namespace
Carpeta de código fuente. Deben estar todos los archivos
source
que se producen a mano
Common Carpeta con cabeceras comunes.
Common.h,
Debug.h, Cabeceras de uso obligatorio.
Debug.cpp
Singleton.hpp,
Cabeceras de definición de patrones de programación
Uncopyable.hpp
Cabecera para definir página de documentación del
Documentacion.h
módulo
CommDDS Carpeta para el XML de entidades de DDS
Carpeta con el código generado a partir del XML de las
Autogen
entidades de DDS
<Paquete> Carpeta correspondiente al paquete y namespace.
Qacproject Carpeta con configuración del proyecto de QACPP
Output Salida del QACPP
personalities Configuración de compilador y entorno.
<Proyecto>.prj Define proyecto de QACPP
library (opcional) Librerías de terceros
Importante
8
4. Reglas para el Control de Versiones
Todo código se dará por terminado siempre que esté exento de errores de
compilación deberá ser versionados.
Ejemplo
aibanez, 16/12/2009
EMPRESA XXX.Mapping
XmlTokenizer
Corrección de errores en el método Parse.
XmlReader
Se sobrecargó el método Load para recibir un array de bytes.
La rama principal tiene una estructura que debe regir (ver cap. 3), no crear
directorios ni elementos que ya no sirvan.
Asociar la rama con una con una tarea en la herramienta de control de tareas
(Bugzilla, Mantis, Jira, etc.), esto es útil para mantener un seguimiento de avances
diários.
Los cambios a nivel de la rama principal tardan más en guardarse y por lo tanto
deberán hacerse cada 20 minutos, mientras que los cambios en las ramas
secundarias se realizarán cada 5 minutos.
Se deberá combinar los cambios de la copia local con los del servidor, de tal manera
que se tenga una versión unificada de los mismos. En caso de no existir la copia local
esta será una imagen de la existente en el servidor.
9
4.7 Commit
Cuando la copia local actualice la copia del servidor deberá siempre contar con un
comentario que detalle los cambios producidos en las clases y métodos.
4.8 Backups
4.9 Restores
Ante cualquier falla se deberá restaurar el último backup y realizar commit desde los
terminales al repositorio con la finalidad de actualizar cambios progresivos que no
estarían presentes en la última copia realizada.
10
5. Definición de Reglas Generales para el nombramiento de código C++
Todo nombre significativo deberá ser escrito en inglés americano (‘A’-‘Z’); sin incluir
números ni caracteres especiales, en donde la primera letra de cada palabra deberá
ser mayúscula. Los monosílabos serán excluidos de la nomenclatura.
La regla rige para elementos del tipo espacios de nombre, clase y elementos que
requieren un mayor énfasis en el código dada su importancia. Para el caso de
estructuras y enumeraciones se usará un prefijo correspondiente.
Ejemplo
class Node
{
public:
void setStatus(…);
}
Todo nombre descriptivo deberá ser escrito en minúscula e inglés (‘A’-‘Z’) sin incluir
números ni caracteres especiales. Si el nombre estuviera formado por dos o más
palabras, el primer carácter a partir de la segunda palabra será en mayúscula, por
ejemplo: initialize, terminate, stopRecording, startRecording, etc. Esta nomenclatura
rige tanto para operaciones miembro, campos de clases, variables en general y
parámetros.
Ejemplo
class Node
{
public:
void initialize();
void setStatus(…);
}
Importante
11
Ejemplo
class Node
{
public:
Node():m_nodeStatus(-1) {}
private:
int m_nodeStatus;
}
Ejemplo:
Ejemplo:
Las operaciones realizadas sobre variables de poco alcance son fáciles de controlar.
Ejemplo:
m_roi = static_cast<float>(50);
5.8 Prueba implícita con 0 deberá usarse únicamente para variables boolean
Ejemplo:
Ejemplo:
::mainWindow.open();
::applicationContext.getName();
Ejemplo:
12
Las variables con mayor alcance deberán tener nombres más largos. Véanse también
los ejemplos de la sección 5.5.
Ejemplo:
5.12 Toda variable de GUI deberá tener como sufijación el nombre del tipo de
componente.
Ejemplo:
5.13 Toda variable que representa valores numéricos deberá incluir el prefijo
“n” seguido del nombre de la variable en mayúscula.
Ejemplo:
5.14 Todo valor de punto flotante debe tener al menos un dígito antes del
punto y/o un decimal.
Ejemplo:
///< incorrecto
float factor = 4;
float tax = .72; /// < menos legible
///< correcto
float factor = 4.0;
float tax = 0.72; /// < más legible
5.15 Usar “NULL” en lugar de “0”, por ser un estándar de C aunque en C++ ya
está obsoleto.
Ejemplo:
///< incorrecto
if (customer == 0)
customer(“Juan Pérez”);
///< correcto
if (customer == NULL)
customer(“Juan Pérez”);
13
El uso de goto viola la estructuración de código, sólo se permite su uso en
anidamientos muy profundos
5.17 Todo iterador deberá ser declarado con variables especiales como “i”, “j”,
“k”.
Las variables “j” y “k” deberán ser utilizadas para bucles anidados solamente.
Ejemplo:
5.18 El prefijo “is” deberá ser usado para variables o métodos de tipo boolean.
El uso del prefijo “is” se da a nivel de todo ámbito por lo que se deberá evitar el uso
de la palabra “no/not” como parte del nombre.
Algunas variaciones pueden incluir el uso de prefijos como “can”, “has” o “should”.
Ejemplo Alternativos
Usar en lugar de
command cmd
copy cpy
point pt
component cmp
initialize init
Las frases de dominio específico por lo general tienen un significado propio como
abreviación/acrónimo, por lo tanto conviene mejor abreviar que usar la frase
competa.
Usar en lugar de
xml ExtensibleMarkupLanguage
roi ReturnOfInvesment
14
5.20 El uso de palabras como Compute y Find deberán emplearse según su
definición.
Ejemplo:
class Customer{
public:
float computeAnualOrders(int year) {}
Order[] findAnualOrders(int year): findAnualOrders(year, year) {}
Order[] findAnualOrders(int fromYear, int toYear) {}
}
5.21 Uso de abreviaciones y/o acrónimos como nombre deberá ser escrito
utilizando el estándar 5.1
Ejemplo:
Ejemplo:
class Customer
{
public:
Order[] findAnualOrders(int fromYear, int toYear)
{
initializeOrders();
…
return m_orders;
}
protected:
void initializeOrders();
{
m_nOrders(0);
m_orders = new Order[]{};
}
private:
Order[] m_orders;
int m_nOrders;
}
15
5.23 Enumeraciones
Ejemplo:
enum Color {
COLOR_RED = 0x10A5, ///< Valor para Rojo;
COLOR_GREEN = 0x11B2, ///< Valor para Verde;
COLOR_BLUE = 0x12C7 ///< Valor para Azul;
};
5.24 Excepciones
Toda clase de este tipo heredará de la clase Exception y deberá ser escrita
<NombreClase>Exception
Ejemplo:
Namespace de un Nivel
16
Namespace de Múltiples Niveles
}
}
Ejemplo
Namespace de un Nivel
namespace Utilities
{
... ///< declaraciones y/o variables, clases, ...
}
17
6. Comentarios y Estilos
6.1 Comentarios
Deberán ser estructurados para seguir las convenciones establecidas tanto por la
herramienta de documentación de código Doxygen como los estándares recomendados
por la herramienta QACPP. Los comentarios según su categoría pueden ir:
///
/// EMPRESA XXX PROJECT
/// \File : archivo.h/archivo.hpp/archivo.cpp
/// \Version : nroVersión.nroRevisión
/// \Author : Nombre del usuario
/// \Date : dd/mm/aaaa
///
Ejemplo:
///
/// EMPRESA XXX PROJECT
/// \File : Dictionary.hpp
/// \Version : 1.0
/// \Author : aibanez
/// \Date : 16/12/2009
///
Ejemplo:
class Dictionary {
/// \brief Serializa el diccionario a XML
18
6.1.3 En una línea de código
Son escritas a la derecha de cualquier línea de código y se usa para describirla
brevemente.
<línea-código> ///< breve desceipción.
Ejemplo:
protected:
T* m_ptr; ///< Puntero al objeto de la clase.
6.2 Estilos
class Customer
{
public:
void register(); ///< 2 espacios a la derecha de public.
private: ///< 2 espacios a la derecha de la llave de apertura.
Order [] m_orders; ///< 2 espacios a la derecha de private.
}
class Customer
{
private: ///< 2 espacios a la derecha.
Order [] m_orders; ///< 1 espacio antes y después del corchete.
protected:
void initializeOrders (); ///< 1 espacio antes del paréntesis
}
19
6.2.3 Construcciones “if-else” deben tener la siguiente estructuración
///< Con bloque de instrucciones simple
if (condición)
Instrucciones-1-Línea...
else [if (condición-alternativa)]
Instrucciones-1-Línea...
else
Instrucciones-1-Línea...
Cada instrucción case debe ir identada 2 espacios a la derecha del switch, antes
del carácter “:” deberá ir un espacio en blanco.
switch (condition) {
case ABC :
statements;
///< Fallthrough
case DEF :
statements;
break;
case XYZ :
statements;
break;
default :
statements;
break;
}
20
while (condición)
{
Instrucciones-Multiples-Líneas...
incremento;
}
6.2.6 Unidades lógicas de código debe estar separadas por una línea en blanco
Matrix4x4 matrix = new Matrix4x4();
matrix.setElement(1, 1, cosAngle);
matrix.setElement(1, 2, sinAngle);
matrix.setElement(2, 1, -sinAngle);
matrix.setElement(2, 2, cosAngle);
multiply(matrix);
21
7. Control y Repetición
Ejemplo:
7.2 Construcción “if” con flujo regular de ejecución y “else” con flujo de excepción
Ejemplo:
Ejemplo:
///< Incorrecto
if ((cust = custList.FindByCode(“033557437”)) != NULL)
printCustomer(cust);
///< Correcto
Customer cust = custList.FindByCode(“033557437”);
if (cust != NULL)
printCustomer(cust);
Ejemplo:
///< Incorrecto
for (i = 0, sum = 0; i < 100; i++)
sum += value[i];
///< Correcto
sum = 0;
for (i = 0; i < 100; i++)
sum += value[i];
22
7.6 Variables de control deben ser inicializadas inmediatamente antes de ser usadas
Ejemplo:
///< Incorrecto
bool isRegistered = false;
. . .
if (!isRegistered)
register();
///< Correcto
bool isRegistered = false;
if (!isRegistered)
register();
7.8 Evitar el uso de instrucciones “while (1)” y “for(;;)” ya que no son muy legibles
Se deberá usar como alternativa “while(true)” que resulta mucho más
comprensible y fácil de mantener.
23
8. Archivos
8.1 Extensiones
Ejemplo de cabecera:
Ejemplo de implementación:
#include “customer.hpp”
/// \brief Customer.cpp
Customer::Customer()
{
}
void Customer::register()
{
. . .
}
#ifndef MODULO_NOMBRECLASE_H
#define MODULO_NOMBRECLASE_H
class <NombreClase>
{
. . .
}
Ejemplo de cabecera:
#ifndef SALES_CUSTOMER_H
#define SALES_CUSTOMER_H
class Customer {
public:
Customer();
void register();
}
#endif ///< SALES_CUSTOMER_H
1
Se recomienda utilizar aquellas extensiones que se muestran resaltadas en negrita.
24
8.3 Orden y agrupamiento de las instrucciones “include”
Las instrucciones include deben referirse primero a archivos de más bajo nivel para
el sistema. Luego de cada grupo dejar una línea en blanco.
Las rutas siempre deben ser relativas para todos los archivos.
Ejemplo:
#include <fstream>
#include <iomanip>
#include <qt/qbutton.h>
#include <qt/qtextfield.h>
#include "EMPRESA XXX/common/ui/PropertiesDialog.h"
#include "EMPRESA XXX/common/ui/MainWindow.h"
8.4 Contenido
El ancho de columnas por línea de código deberá estar sujeto a 80 columnas por
compatibilidad con la mayoría de editores de código, impresoras, emuladores y
depuradores de código. Así mismo para mejorar la legibilidad de código.
Se recomienda:
1. Iniciar una nueva línea si existe un carácter “;” al final de la línea previa.
3. Iniciar una nueva línea alineada por la izquierda al mismo nivel de la línea
previa.
25
9. Declaración de Clases y Estructuras
9.1 Organización de una clase o estructura (ref: Hight Integrity Rule. 3.1.1)
Ejemplo
class/struct MyEntity
{
public: ///< 1°
// ...
protected: ///< 2°
// ...
private: ///< 3°
// ...
}
Ejemplo
class A
{
}
class B: A
{
}
Todo nombre de clase estará regido obligatoriamente por la estándar 5.1. Además
los miembros de una clase tendrán la siguiente convención de nombres:
26
el estándar 5.2, además del estándar 5.3 en caso de requerir
inicialización previa, por ejemplo para variables miembro con:
Ejemplo
27
Ejemplo
9.5 Utilizar Deep Copy para duplicar objetos (ref: High Integrity CPP Rule 3.1.3,
3.1.4, 3.1.5)
Ejemplo
class MyClass
{
public:
MyClass& operator=( const MyClass& objRef )
{
if(m_intRef != NULL)
delete m_intRef;
swap( temp ); /// < non-throwing
return *this;
{
int getSize()
{ Return m_size;}
private:
int * m_intRef;
int m_size;
void swap( MyClass& objRef ) throw ();
};
28
o “Const” en Operaciones Miembro: Utilizar este modificador si la
operación es de sólo lectura. (Ref. High Integrity CPP Rule 3.1.8)
Sintaxis:
<nombre-de-función> const;
Ejemplo
};
...
};
El uso de constantes globales debe ser restringido y debe usarse en casos muy
necesarios. Se recomienda usar métodos con valor en su lugar.
Ejemplo
int getMaxIterations() /// < NOT: MAX_ITERATIONS = 25
{
return 25;
};
29
9.8 Reutilización el Comportamiento
Reusando Constructores
class Dictionary {
private:
int m_capacity;
public:
/// < Reusa el segundo constructor
/// < con capacidad ilimitada
Dictionary ():Dictionary(-1)
{ }
...
};
Operación Helper
30
void resize (int position)
{
while (position < m_capacity - 1)
m_items [position] = m_items [++position];
delete m_items[--m_capacity];
}
...
};
Clase Helper
9.9 Macros debe ser creadas para simplificar la escritura de código y/o reusar
comportamiento genérico.
Ejemplo de simplificación:
#define SmartPtr std::tr1::shared_ptr
10.
9.10 Aserciones
Sintaxis:
DEBUG(<nivel>, <mensaje>, <argumentos>);
El nivel puede ser una de las siguiente macros:
Macro Valor
#define DWARNING 5
#define DASSERT 10
#define DINFO 15
#define DERROR 1
Ejemplo:
31
DEBUG(DINFO, ("OsirisCardChannel %s :: selectVideoSource",
getName().c_str()));
Ejemplo
class Subject
{
public:
Subject (void);
~Subject (void);
protected:
vector m_list;
};
class Observer
{
public:
Observer(void);
virtual void update (Subject subject) = 0;
public:
~Observer(void);
};
32
class Customer: public Subject
{
public:
Customer(void):Subject(void);
~Customer(void);
};
33
Ejemplo
class SaleManager
{
private:
SaleManager () {}
public:
static void registerSale (SaleDocument sale,
Customer customer)
{
if (customer.hasPendingPayments ())
throw new CustomerException ("Cliente es moroso");
try
{
if (!customer.exists () && sale.isInvoice())
{
Customer.register ();
sale.setOwner (customer);
}
sale.register ();
}
catch (Exception ex)
{
throw ex;
}
}
}
SaleManager::registerSale(sale, customer);
}
34
Ejemplo
Notación UML
35
11.4 Patrón Factory Method
o Participantes
Creator: <NombreClase>
ConcreteCreator: <NombreClase>
o Método de Fabricación: Create<NombreClaseConcreteProduct>
Product: <NombreClase>
ConcreteProduct: <NombreClase>
Ejemplo
36
11.5 Patrón Singleton
Utilizar este patrón para crear elementos de comunicación DDS así como
para las fábricas.
Ejemplo:
~Singleton()
{
m_isCreated = False;
delete m_instance;
}
private:
static T * m_instance;
static Bool m_isCreated;
///
/// \brief Do not create any object by calling Constructor.
///
Singleton()
{
}
}
37
11.6 Patrón Listener
Ejemplo:
38
Ejemplo:
Utilizar este patrón para invocar objetos del servidor, objetos demandados
u objetos con nivel de acceso protegido.
o Participantes
Client: <NombreClase>
Subject: <NombreClase>
RealSubject: <NombreClase>
Proxy: <NombreClase>Proxy
39
Ejemplo:
40
12. Referencias
High·Integrity C++ Coding Standard Manual Version 2.4, The Programming Research Group,
2006.
http://www.programmingresearch.com/QAHICPP.html
41