Sto lavorando su una piccola applicazione che dovrebbe analizzare / analizzare un sito Web e mi chiedo quale sarebbe il modo migliore per ottenere ciò (tenendo DRY / SOLID in mente).
Ecco alcuni pseudocodici:
class ScraperScheduler
def perform
SraperWorker.perform_async(ParserTypeOne.new)
SraperWorker.perform_async(ParserTypeTwo.new)
SraperWorker.perform_async(ParserTypeThree.new)
SraperWorker.perform_async(ParserTypeFour.new)
end
end
class ScraperWorker
def initialize(scraper)
@scraper = scraper
end
def perform
html = RestClient.get(@scraper.url)
@scraper.perform_async(html)
end
end
class ParserTypeOne
def perform(html)
#parse page with nokogiri
page = Nokogiri::HTML(html)
parserd_objects.each do |o|
PersistToDB.perform(o)
end
end
end
class PersistToDB
def perform(o)
# split o into several ActiveRecord objects
# check if unique and save to db
end
end
La classe ScraperScheduler
è fondamentalmente solo un cronjob che verrà chiamato con sidekiq-scheduler una volta al giorno . I metodi di esecuzione ci sono, quindi posso sostanzialmente fare i lavori di sidkiq al di fuori di tutto, ma non penso che questo sia necessario per ognuna di queste classi. Alcune domande / dubbi che ho:
- ScraperWorker fondamentalmente esegue solo la richiesta HTTP. Nel mio esempio, tuttavia, conosce le proprietà
url
eperform_async
del parser. Un modo per farlo in un modo più "sciolto"? - Il lavoro
ParserTypeOne
dovrebbe semplicemente estrarre i dati dall'HTML con nokogiri. È troppo strettamente collegato a PersistToDB? Come posso chiamare PersistToDB in modo diverso? - Qualche altro suggerimento?
So che questo funzionerebbe correttamente. Mi interesso solo di alcune idee su come migliorarlo. Suggerimenti?