Consecuencias de no practicar

Para una demostración que realizaré en abril tengo que llevar a cabo varias tareas. Una de ellas, muy sencilla (en español) es separar una frase en cada una de las palabras que la componen (es fácil porque entre ellas siempre hay un espacio; en japonés no).

En sí no es nada complicado, pero como quise ponerme a recordar lo poco que sabía de C++ y estudiar lo que ignoraba, decidí llevar a cabo todo mediante un Singleton. Siendo un proceso sencillo, era la excusa perfecta para pasar más tiempo en la definición de la clase en sí… pero nunca imaginé que entre la separación en sí, las definiciones de los miembros de la clase y la compilada, me tomaría cerca de 2 horas echarlo a andar.

En Java, un Singleton es muy sencillo. Aquí el que creé nada más para contrastar. Tiempo: 2 minutos (4 incluyendo la clase de prueba):

StringSplitter.java:

package org.mmg.tests;
public class StringSplitter {
private StringSplitter() {}
public static String [] split (String text) {
if (text != null && !text.equals(""))
return text.split("\\s");
else
return null;
}
}

TestStringSplitter.java:

package org.mmg.tests;
public class TestStringSplitter {
  public static void main (String a[]) {
    int count = 0;

    if (a.length != 1) {
      System.err.println("Need a sentence to separate");
    }
    else {
      String [] tokens = StringSplitter.split(a[0]);
      if (tokens != null)
        for (String s : tokens) {
	    System.out.println("Token " + ++count + ": " + s);
	  }
    }
  }
}

En cambio, en C++ es todo el rollo siguiente:

tokenizer.h:

#ifndef __TOKENIZER_H
#define __TOKENIZER_H

using namespace std;

class Tokenizer {

 private:
  static Tokenizer * pInstance;
  Tokenizer();
  Tokenizer(Tokenizer const&);
  Tokenizer& operator=(Tokenizer const&);
  ~Tokenizer();

 public:
  vector<string> * tokenize(char const * text);
  static Tokenizer * getInstance();

};
#endif

tokenizer.cpp:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>
#include "tokenizer.h"
using namespace std;

Tokenizer * Tokenizer::pInstance = NULL;

Tokenizer::Tokenizer() {}

Tokenizer * Tokenizer::getInstance() {
  if (!pInstance)
    pInstance = new Tokenizer;

  return pInstance;
}

Tokenizer::~Tokenizer() {
  if (pInstance != NULL)
    delete pInstance;
}

vector<string> * Tokenizer::tokenize(char const * text) {
  string * sentence = new string(text);
  vector <string> * tokens = new vector<string>;
  istringstream iss(*sentence);
  copy(istream_iterator<string>(iss),istream_iterator<string>(), back_inserter<vector<string> >(*tokens));
  delete sentence;

  return tokens;
}

testtokenizer.cpp:

#include "tokenizer.cpp"
#include <vector>
#include <string>
using namespace std;

int main(int argc, char ** argv) {
  int count = 0;

  if (argc != 2) {
    cout << "Need a sentence to separate" << endl;
    return 1;
  }
  else {
    vector<string> * tokens = Tokenizer::getInstance()->tokenize(argv[1]);
    for (vector<string>::iterator it = tokens->begin(); it != tokens->end(); it++) {
      cout << "Token " << ++count << ": " << *it << endl;
    }

    delete tokens;
    return 0;
  }
}

La salida de ambos programas es la misma. En Java:

[mmedina@yggdrasil StringSplitter]$ java -cp ./bin org.mmg.tests.TestStringSplitter “Esto es una simple prueba”
Token 1: Esto
Token 2: es
Token 3: una
Token 4: simple
Token 5: prueba

Y en C++:

[mmedina@yggdrasil demo-searchengine]$ ./testtokenizer “Esto es una simple prueba”

Token 1: Esto

Token 2: es

Token 3: una

Token 4: simple

Token 5: prueba

Posiblemente haya algunas clases ya hechas en C++ que faciliten la separación, pero el punto de todo esto no es en sí la acción, sino la definición y creación del Singleton 🙁

Definitivamente estoy muy acostumbrado a Java (además de que te facilita la vida en muchos sentidos), pero personalmente sigo prefiriendo C/C++. No sé, es como nostálgico porque me recuerda mis años en la Universidad de Guadalajara, aprendiendo C por mi cuenta (porque había maestros que decían que había que cambiarle el nombre a las variables cuando un programa no corría).

Buenas noches 😀

11 Replies to “Consecuencias de no practicar”

    1. Sí, había leído acerca de boost, pero como quería ver qué onda en C++, me incliné por hacer el copy usando un string stream. Después usaré boost, pero aquí quería más bien crear un Singleton. Ya que lo ves y entiendes, tiene mucho sentido, pero de entrada es más complicado que en Java.

  1. @_@ recordé lo que me dijo el Master

    cout << STL '+' C'++ ' '=' Programs <<endln;

    obviamente con mi sintaxis truena el código. OMG, me estoy quedando rusty en la programada.

  2. Es muy complicado todo esto de programación de sistemas operativos, je je , pero como dices hay que practicar para no olvidar, ya que esta área es una de las más prominentes por ser de las que cambian y se desarrollan constantemente, practicamente la herramienta de muchas otras áreas.
    Suerte!!
    Saludos!!

  3. es cierto yo desde hace varios semestres no practico C/C++ solo nos enseñan java 🙁 y casi no me gusta me va tocar buscar tutoriales y reaprender lo olvidado 😀

  4. Perdon si suena un poco Spam este post, pero no supe donde comentarte lo siguiente:

    Me encantaria que pudieras hacer un podcast amigo. Es muy interesante tu blog y las cosas que te atraen. Eres muy inquieto; y por desarrollarte en un área tan apasionante como lo es la AI, en un país avantgardt en esta área. Y como méxicano me siento muy orgulloso contigo.. viviendo en un pais tan hermoso como me imagino que lo es japón.. y sobre por su gente. ¡Es espectacular, de verdad.. te felicito! A mi me encantaría visitar allá y algún dia quedarme para siempre. Yo estudíe Mate Aplicada en la UNAM y me acerque mucho a las redes neuronales y a la lógica diffuzza. Te mando un muy caluroso saludo Bro!

    Y respecto tu post de la practica, relexione lo siguiente:

    Siempre ha sido un dogma invisible lo de: “la practica hace al maestro.. ”
    y yo complementandolo:

    “..y la más poética abstraccion nace de este hecho.”

    Y para hacer la poesía más facinante hay que mantener tu corazón enamorado.

    Viendo el “cotorreo” que tuviste que hacer, en contrastes, deseo que sigas teniendo, al menos un poquito de “flirt”, con el C++ 😉

    saludos kawaii!

  5. Saludos desde México. C:

    Hahahaha que C tan más escandaloso xD, cuando en Java, un simple StringTokenizer hace el trabajo en una sola linea.

    Y ya siento las consecuencias de no practicar, a C lo distingo pero no le hablo 😀 Así que mejor a darle caña. xD

    Otro descuidado es “Turbo Pascual” hahahahaha pero ese es más nostálgico.

    En fin, saludos a todos por allá y aunque creo que ya lo oiste… “soy tu fan”. Un día cuando obtenga la beca de maestría y me vaya a Japón pasaré a visitarte. C:

    Bueno, adios.

  6. xD en lo personal me gusta mas java (sera por que ese es el que me enseñaron) bueno almenos se ahora como se ve un c++ :p saludos desde la tierra del nopal xD feliz dia de muertos atrasado!!!

  7. Ese Alejanjim esta re-burro ni diga que es de IT, obvio que en Java muchas cosas las haces con una sola linea y sabes por que ? Ese StringTokenizer es igual una funcion/libreria que contiene un codigo igual o parecido al de C….burro !! no creo que llegues a Japon 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.