Resultados 1 a 2 de 2

Tópico: O Design Pattern Singleton no Ruby

  1. #1
    Moderador ingresso Avatar de _Guga_
    Data de Ingresso
    Apr 2006
    Localização
    Salvador - BA
    Posts
    2.136
    Post Thanks / Like

    O Design Pattern Singleton no Ruby

    Salve pessoal, tudo bem com vcs? O meu publico alvo com este post são os intermediarios na linguagem de programação Ruby.
    Essa linguagem vem ganhando mto espaço nas aplicações web e desktop e por isso eu acho q merece ser destacada aqui tmb.

    O que faz o pattern singleton? Bem, ele n faz nada. Os Design Patterns são geralmente definidos como soluções já testadas para problemas recorrentes =)

    No caso do Singleton, trata-se de uma classe que só instancia uma unica vez apenas.

    em C++, uma aplicação do pattern Singleton seria:

    Código:
    #include <iostream>
    using namespace std;
    class Single
    {
    public: 
       
        void Show() 
        { 
            cout << this->_buf << flush; 
        } 
    
        static Single* getInstance(char* _str) 
        { 
            static Single* instance = 0; 
            
            if( !instance )   
                   return (instance = new Single(_str) ); 
            else   
                   return instance;
        }
    
    private: 
        Single(char* _str) : _buf(_str) {} 
        ~Single() {}
         Single* operator=(Single* right) { return right; } 
        char* _buf;
    };
        
    int main()
    { 
        Single* obj = Single::getInstance("Guga =P"); 
    
        obj->Show();
    
        cout << "\n";  
    
        Single* other_obj = Single::getInstance("teste123456789"); 
    
        other_obj->Show();
    
        cin.get();
        return 0;
    }
    Output:


    Guga =P
    Guga =P

    bem grotesco, nao? >.<

    no codigo vc pode notar, q uma vez definida a instancia, jamais possivel redefini-la, ela permanece ate a morte do programa inalterada,
    pois so pode ser instanciada uma unica vez.

    bem, em qualquer linguagem POO eh possivel implementar o pattern Singleton, no Ruby n eh diferente.

    no Ruby temos duas formas de se usufruir do Singleton:



    •Forma convencional, bastante grotesca e deselegante


    •Reutilizando a "biblioteca" do Ruby, fazendo um mixin



    a forma convencional seria usar uma variavel de classe @@ q serviria como a instancia propriamente dita da classe, e um metodo getInstance q verifica
    se ela ja foi instanciada, caso nao, instancia ela, caso sim, retorna ela mesma


    Código:
    class Single   
    
        # new se transforma em um metodo privado DA CLASSE,    
        # ou seja, vc n pode mais invoca-lo de fora da classe.    
        private_class_method :new    
    
        @@instance = nil # tem q inicializar toda classe de instancia    
    
        def self.getInstance( _str )   
      
            @@instance = new( _str ) unless @@instance   
       
            @@instance       ## por questoes de legibilidade n utilizei a         
                     ## forma equivalente instance ||= new( _str )   
        end   
    
        def initialize( _str )           
            @a = _str    
        end  
    
        def to_s   # metodo para que o objeto se "converta" numa string        
            @a    
        end
    end
    
    obj = Single::getInstance("Guga =P")
    
    puts obj
    
    other_obj = Single::getInstance("teste123456789")
    
    puts other_obj
    
    gets
    Output:

    Guga =P
    Guga =P

    a filosofia do Ruby eh um codigo inteligivel, porem compacto. PARA QUÊ fazer esse amontoado de codigo quando se tem uma alternativa prontinha pra ser usada?

    essa alternativa é o mixin que o Ruby nos oferece ;D

    basta dar um Require em 'Singleton' e dentro da classe fazer o mixin: include Singleton

    Eis a forma simples:

    Código:
    require 'Singleton'
    
    class Single    
         include Singleton      
    
         def begin( _str ) # eu escolhi o nome "begin", se vc quiser escrever                      
                   # PINDAMONHANGABA tmb pode ;D        
    
             @n = _str     
         end     
    
         def to_s       
            @n    
         end
    
    end 
    
    # ridiculo de simples xD
    
    Single.instance.begin("Guga =P")
    
    puts Single.instance
    
    gets


    espero que tenham gostado amigos, um forte abraço e ate a proxima =P
    I must not fear. Fear is the mind killer.

  2. #2
    Wannabe Avatar de unn4m3D_BR
    Data de Ingresso
    Dec 2007
    Posts
    616
    Post Thanks / Like
    Boas práticas de programação, Design Pattern e afins.. sempre fatos interessantes que só se é dado valor com algum tempo de desenvolvimento ..

    bjxx ..
    Reversing is my life!
    www.brcrackers.org

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •