Hadouken de Ifs nasceu de um meme, ilustrado abaixo. Basicamente é um conjunto de ifs aninhados, normalmente um conjunto de validações, que, por conta de inexperiência ou inabilidade do desenvolvedor, acaba por formar uma estrutura difícil de compreender e consequentemente mais difícil de ser mantida, implicando em maiores custos de manutenção do código.
(mais…)Tags: c++
O pattern Factory Methods é uma forma de encapsular o construtor de forma a tornar a criação de objetos muito mais flexível e acessível às classes derivadas. Basicamente é um método estático chamado no lugar no operador new para alocar uma nova instância da classe. Veja o exemplo a seguir:
#include <iostream>
#include <string>
class Part {
private:
protected:
std::string id;
Part() {
id = "";
std::cout << " -> New empty part constructor" << std::endl;
}
Part(std::string id) {
this->id = id;
std::cout << " -> New part constructor by id" << std::endl;
}
Part(std::string name, std::string instance, std::string rev) {
std::cout << " -> query for part on database" << std::endl;
std::cout << " -> New part construcutor by part data" << std::endl;
}
public:
~Part() {
std::cout << "-> Part destructor" << std::endl;
}
static Part* createPart() {
std::cout << "-> Execute checks and preparations for new empty part" << std::endl;
return new Part();
}
static Part* createPart(std::string id) {
std::cout << "-> Execute checks and preparations for new part by id" << std::endl;
return new Part(id);
}
static Part* createPart(std::string name, std::string instance, std::string rev) {
std::cout << "-> Execute checks and preparations for new part by part data" << std::endl;
return new Part(name, instance, rev);
}
};
int main() {
Part* first = Part::createPart();
Part* second = Part::createPart("0123456789ABCDEF");
Part* third = Part::createPart("Name", "1", "1");
delete first, second, third;
}
Neste exemplo o retorno para os objetos é em forma de ponteiros, mas é possível também ser feito por valor, ou referência, facilitando a gestão da memória.
Cuidados
Muito cuidado com a documentação de códigos deste tipo. É necessário deixar bem documentado a forma de desalocação dos objetos alocados, seja deixando a responsabilidade da desalocação (delete) pelo método que efetuou o chamado, ou por um método específico para isso (Part::destroyPart(), por exemplo).
Profissionalmente
Algumas equipes não aceitam a utilização do operador new, sendo obrigatório sempre haver um Factory Method, outras apenas incentivam quando há necessidade.
Quanto maior a complexidade de inicialização de um objeto, mais indicado é o Factory Method. Uma máquina de estados é um bom exemplo, ainda mais se os estados e suas conexões dependerem de uma fonte de dados externa, como um arquivo ou uma base de dados.
A partir desta semana vamos começar uma série de artigos sobre Design Patterns, snippets tão úteis como controversos. Apesar das críticas contrárias a sua utilização, sua importância é inegável, não apenas como uma biblioteca de padrões mas principalmente como uma forma de estudar diferentes abordagens a soluções comuns no dia-a-dia do desenvolvimento.
(mais…)Há alguns meses apareceu na lista cppbrasil uma dúvida, como retornar o(s) caracteres do meio de uma string. Por exemplo:
- AMARELO -> R
- VERMELHO -> ME
- AZUL -> ZU
- VERDE -> R
No post de hoje vamos citar os novos métodos da std::string no C++11, alguns são muito bacanas e implementam funcionalidades populares em outras linguagens. Vamos avaliá-las conforme a versão em que estão disponível com exemplos.
(mais…)Hoje uma nova seção no Lab C++. As sextas-feiras serão reservadas para solução de exercícios e problemas encontrados em provas, cursos técnicos, superior, concursos, entrevistas de emprego, etc. Esta seção é voltada para tirar dúvidas dos leitores, portanto envie suas dúvidas, suas sugestões. Todas vão entrar na fila, serão resolvidas e publicadas na sequência.
A solução de hoje um problema ao qual fui submetido recentemente. Um avaliador pediu pra eu fazer um programa que validasse a abertura e fechamento de parênteses, colchetes e chaves.
(mais…)std::pair já existe há um bom tempo em C++, é a estrutura de dados que recupera os dados de um std::map através de iterators. Já std::tuple foi adicionado no C++11 e apesar de armazenar a mesma coisa é uma classe muito mais completa. Vamos conhecer a diferença entre os dois.
(mais…)Loop é uma construção básica em uma linguagem de programação estruturada, e o loop for uma das formas mais comuns. Em C++ temos 5 formas de implementar loops for.
(mais…)Semana passada falamos sobre a história e as versões da linguagem C, hoje vamos falar sobre C++. Assim como a linguagem C, muitos novatos acham que a linguagem C++ é desatualizada e pouco utilizada, mas não sabe que é uma das linguagens mais utilizadas do mundo, e peça chave no desenvolvimento de muitos softwares recentemente desenvolvidos.
(mais…)Normalmente estudamos algoritmos para ordenar vetores, mas dificilmente para embaralhar. Apesar disso existem dois STL Algorithms para embaralhar containers não ordenados. Obviamente esses algoritmos não funcionam com containers ordenados, como std::map, std::set ou std::list, por exemplo, mas funciona muito bem com std::vector, ou mesmo arrays padrão C.
(mais…)