Lab5 Rafael Siqueira

aluno: Rafael Siqueira
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 15/12/2008 (?)

Introdução

No labs 5. a idéia era realizar o desenvolvimento de uma aplicação cliente-servidor simples, mas completa, feita em Ruby, e cuja funcionalidade era de gerenciar uma espécie de bolão virtual, no qual apostadores fazem apostas referentes aos placares de jogos de futebol. Os principais conceitos abordados pelo laboratório são threads e concorrência, noções de input/output em yaml, e os padrões de projeto Decorator e Builder.

Desenvolvimento

O programa não foi inteiramente desenvolvido. Apenas foram implementadas as melhorias nas classes decorativas e foram criadas os builders de MatchList e UserList. Os códigos referentes a tal seguem abaixo.

1) Melhoria nas classes decorativas

Thread Safety

MatchThreadSafeDecorator

require 'monitor'
require 'decorators/decorator'
module Decorators
  class MatchThreadSafeDecorator < Decorator
    include MonitorMixin
 
    def make_bet(score, user)
      synchronize do
        @decorated.make_bet(score, user)
      end
    end
 
    def finalize(final_score)
      synchronize do
        @decorated.finalize(final_score)
      end
    end
 
  end
end

MatchListThreadSafeDecorator

require 'decorators/decorator'
module Decorators
  class MatchListThreadSafeDecorator < ListThreadSafeDecorator
 
    def initialize(decorated)
      old_match_decorator = decorated.item_decorator
      decorated.item_decorator = lambda do |match|
        MatchThreadSafeDecorator.new( old_match_decorator.call(match) )
      end
      super
    end
  end
end

Persistance

MatchPersistanceDecorator

require 'monitor'
require 'decorators/decorator'
module Decorators
  class MatchPersistanceDecorator < Decorator
    include MonitorMixin
 
    def initialize(decorated,list)
      super(decorated)
      @list=list
    end
 
    def make_bet(score, user)
      @decorated.make_bet(score, user)
      @list.save
    end
 
    def finalize(final_score)
      @decorated.finalize(final_score)
      @list.save
    end
 
  end
end

MatchListPersistanceDecorator

require 'decorators/decorator'
module Decorators
  class MatchListPersistanceDecorator < ListPersistanceDecorator
 
    def initialize(decorated,filename)
      old_match_decorator = decorated.item_decorator
      decorated.item_decorator = lambda do |match|
        MatchPersistanceDecorator.new( old_match_decorator.call(match),self )
      end
      super
    end
  end
end

2) Builders de MatchList e UserList

MatchList

MatchListBuilder

class MatchListBuilder
 
  def initialize
    @match_list = MatchList.new
    @added_persistance = nil
  end
 
  def add_persistance
    @match_list = MatchListPersistanceDecorator.new(@match_list,"matchList.yml")
    @added_persistance = true
  end
 
  def add_logging
    @match_list = MatchListLoggerDecorator.new(@match_list)
  end
 
  def add_thread_safety
    @match_list = MatchListThreadSafeDecorator.new(@match_list)
  end
 
  def add_all
    self.add_persistance
    self.add_logging
    self.add_thread_safety
  end
 
  def match_list
    @match_list.load_list if @added_persistance
    @match_list
  end
end

UserList

UserListBuilder

class UserListBuilder
 
  def initialize
    @user_list = UserList.new
    @added_persistance = nil
  end
 
  def add_persistance
    @user_list = ListPersistanceDecorator.new(@user_list,"userList.yml")
    @added_persistance = true
  end
 
  def add_logging
    @user_list = UserListLoggerDecorator.new(@user_list)
  end
 
  def add_thread_safety
    @user_list = ListThreadSafeDecorator.new(@user_list)
  end
 
  def add_all
    self.add_persistance
    self.add_logging
    self.add_thread_safety
  end
 
  def user_list
    @user_list.load_list if @added_persistance
    @user_list
  end
end

Conclusão

Da parte que foi desenvolvida, pôde-se obter conhecimento e realmente entender o conceito de multi-threading através do uso de monitores, exclusividade de Ruby; e, principalmente, os padrões de projeto Decorator (o qual eu ainda não tinha entendido na essência e no caráter de aplicação) e Builder. O laboratório em si era muito longo e foi impossível, para mim, realizá-lo por inteiro nessa época conturbada de fim de ano.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License