کمک برای ارتقا کد

ruby

#1

سلام من يك اپ نوشتم كه كليه فايلهای داخل يك دایرکتورى رو ميخونه و اطلاعات مکانی عکس رو در میاره
میشه بهش ادرس پاس داد و میشه خروجی رو بین csv و html تغییر داد
میخواستم اساتید اینجا میتونن یه نگاه بهش بندازن ببینن چطوری میتونم بهترش بکنم
و یا اگه جایی از کد به نظرشون میشه بهتر نوشته بشه کجاست

 require 'exifr/jpeg'
require 'csv'
require 'optparse'
require 'ostruct'
require 'pp'
require 'builder'
require "crafty"

include Crafty::HTML::Basic
$fileList = []
def self.headers
  ['Name', 'Path', 'Latitude', 'Longitude']
end

def self.parse(args)
  options = OpenStruct.new
  options.result_type = :csv
  opt_parser = OptionParser.new do |opts|
    opts.banner = "Usage: app.rb [options]"
    opts.separator ""
    opts.separator "Specific options:"

    opts.on("-p", "--path PATH", "The Path of Image files to executing.") do |v|
      options.path = v
    end

    opts.on("--type [TYPE]", [:csv, :html],
              "Select result type (csv ->Defult, html)") do |t|
        options.result_type = t
    end

    opts.separator ""
    opts.separator "Common options:"

    opts.on_tail("-h", "--help", "Show this message") do
      puts opts
      exit
    end

  end

  opt_parser.parse!(args)
  options
end

def self.generateCsvFile
  CSV.open("result.csv", "w") do |csv|
     $fileList.each do |file|
        next if File.directory? file
        fileExif = EXIFR::JPEG.new(file)
        fileName = File.basename file
        csv << headers if csv.lineno.eql? 0
        csv << [fileName , file] if fileExif.gps.nil?
        csv << [fileName, file , fileExif.exif.gps.latitude , fileExif.exif.gps.longitude] if !fileExif.gps.nil?
     end
  end
end

def self.generateHtmlFile
  pp generateHtml
  File.open('result.html', 'w') do |file|
    file.write(generateHtml)
  end
end

def generateHtml
  table do
    tr do
      headers.each do |header|
        th header
      end
    end
      $fileList.each do |file|
        tr do
          next if File.directory? file
          fileExif = EXIFR::JPEG.new(file)
          fileName = File.basename file
          td fileName
          td file
          td fileExif.exif.gps.latitude if !fileExif.gps.nil?
          td fileExif.exif.gps.longitude if !fileExif.gps.nil?
        end
      end
  end
end

options = parse(ARGV)
librbfiles = options.path.nil? ?  File.join("**", "*.jpg") : File.join(options.path,"**", "*.jpg")
$fileList = Dir.glob(librbfiles)
pp options.result_type

case options.result_type
  when :csv
    generateCsvFile
  else
    generateHtmlFile
end

#2

اول از همه اینکه از جم thor استفاده کن. دوم اینکه تا جایی که می تونی از متغیر ها global استفاده نکن. سوم اینکه کلاس متد بدون کلاس استفاده نکنی بهتره. و در آخر اینکه style کدت رو هم بهتر کنی عالی میشه. مثلا از پاراگراف استفاده کنی


#3

مرسی سمیر جان بابت وقتی که گذاشتی
اول از همه من دو تا ورژن از کدم درست میکنم یکی با thor اون یکی هم بدونش
دوم سوالم اینه که چرا بهتره global استفاده نکنم و اگه نکنم بهترین استراتژی جایگزینش چیه؟ خوشحال میشم یه مثال بزنی


#4

استفاده از global var به دلایل زیادی مناسب نیست که چنتارو خلاصه میگم؛
سختی در مدیریت حافظه، سخت شدن تستینگ , tight coupling, قابل تغییر بودن متغیر در کل برنامه، ناخوانا شدن کد به دلیل لوکال نبودن متغیرها.
و احتمالا موارد مهم دیگه که الان حضور ذهن ندارم :thinking: . هرکدوم از این موارد بتنهایی میتونه کلی خطا تولید کنه.
این موارد در همه زبان ها باید در نظر گرفته بشود اما شاید در functional programming کمتر دردسر ساز باشه چون عملا متغیری وجود نداره اما معنیش این نیست که کلا Globalize کردن فکر خوبیه حتی در FP