How to refactor these codes ,could you help me!

hi,these codes is my working codes recently.I am not satisfied with the
codes for too much repeated codes,I try to reduce duplex codes but
failed.
I think DZHFileProperty and HXFileProperty concentrate all file property
, that could not be changed.

I find that if codes below could be refactor
      module DzhSelfStockFile module HxSelfstockFile
          DzhFileProperty include HxFileProperty
                            > >
                            > >
                           \ /
                            \ /
         module SelfStockFile
           include FileProperty(dynamic include according arg Hx or Dzh)

    merge DZHBlock HxBlock to Block, merge DzhSelfStockFile
HxSelfStockFile to SelfStockFile . but i canot to dynamic incluce module
according to argument.could you help me ,thank you !

module DzhFileProperty

  def initialize()
      @file="d:\\ProgramFiles\\DZH\\userdata\\block\\自选股.BLK"
      @start="\245\000Q\377"
      @internal="\000\000\000\000"
      @backup_file=@file+".tmp"
      @code_regular_expression=/S[H|Z]\d{6}/
  end

  def after_read_each(stock)
    return stock
  end

  def before_yield_each(stock)
    return stock
  end

end

module DzhSelfStockFile

  include DzhFileProperty

  def initialize
    super
  end

  def display
    open(@file,'rb').each { |x| p x}
  end

  def backup
    open(@backup_file,'wb') {|f| f<< read}
  end

  def restore
    open(@file,'wb') {|f| f<< read_backup}
  end

  def clean_zero
    puts "@file = nil" if (@file==nil)
    open(@file,'wb') {|f| f<< @start}
  end

  def read
    IO.read(@file)
  end

  def read_backup
    IO.read(@backup_file)
  end

  def codes
    @codes=[]
    read.scan(@code_regular_expression).each do |w|
      @codes<<(after_read_each w)
    end
    @codes.sort.uniq
  end

  def write(stock)
    write_array_of [stock]
  end

  def write_array_of(stocks)
    add_stocks_string=yield_all_string stocks
    open(@file,'wb') {|f| f << add_stocks_string;f.flush}
  end

  def del(stock)
    stockArray=codes.delete_if {|x| x==stock}
    open(@file,'wb'){|f| f << (yield_string stockArray)}
  end

  def yield_all_string(stocks)
    yield_string (codes+stocks).sort.uniq
  end

  def yield_string(stocks)
    stocks_string=@start
    stocks.sort.uniq.each do |stock|
      stocks_string+=(before_yield_each(stock)+@internal)
    end
  end

  private :yield_all_string,:yield_string
end

class DzhBlock

  include DzhSelfStockFile

  def initialize
    super
  end

  def clean
    clean_zero
  end

  def have
    codes
  end

  def add(stock)
    add_batch [stock]
  end

  def add_batch(stocks)
    write_array_of stocks
  end

  def del(stock)
    super stock
  end

end

···

==============================================================
module HxFileProperty

  def initialize
    @file="D:\\ProgramFiles\\hxzq\\T0002\\blocknew\\ZXG.blk"
    @start=""
    @internal="\r\n"
    @backup_file=@file+".tmp"
    @code_regular_expression=/\d{7}/
  end

  def after_read_each(stock)
    return stock="SH"+stock[1,7] if stock[0,1]=="1"
     return stock="SZ"+stock[1,7] if stock[0,1]=="0"
  end

  def before_yield_each(stock)
    return stock="1"+stock[2,6] if stock[0,2]=="SH"
    return stock="0"+stock[2,6] if stock[0,2]=="SZ"
  end

end

module HxSelfstockFile

  include HxFileProperty

  def initialize
    super
  end

  def display
    open(@file,'rb').each { |x| p x}
  end

  def backup
    open(@backup_file,'wb') {|f| f<< read}
  end

  def restore
    open(@file,'wb') {|f| f<< read_backup}
  end

  def clean_zero
    puts "@file = nil" if (@file==nil)
    open(@file,'wb') {|f| f<< @start}
  end

  def read
    IO.read(@file)
  end

  def read_backup
    IO.read(@backup_file)
  end

  def codes
    @codes=[]
    read.scan(@code_regular_expression).each do |w|
       @codes<< (after_read_each w )
    end
    @codes.sort.uniq
  end

  def write(stock)
    write_array_of [stock]
  end

  def write_array_of(stocks)
    add_stocks_string=yield_all_string stocks
    open(@file,'wb') {|f| f << add_stocks_string;f.flush}
  end

  def del(stock)
    stockArray=codes.delete_if {|x| x==stock}
    open(@file,'wb'){|f| f << (yield_string stockArray)}
  end

  def yield_all_string(stocks)
    yield_string (codes+stocks).sort.uniq
  end

  def yield_string(stocks)
    stocks_string=@start
    stocks.sort.uniq.each do |stock|
      stocks_string+=(before_yield_each(stock)+@internal)
    end
    stocks_string
  end

  private :yield_all_string,:yield_string
end

class HxBlock

  include HxSelfstockFile

  def initialize
    super
  end

  def clean
    clean_zero
  end

  def have
    codes
  end

  def add(stock)
    add_batch [stock]
  end

  def add_batch(stocks)
    write_array_of stocks
  end

  def del(stock)
    super stock
  end
end

--
Posted via http://www.ruby-forum.com/.