2 Stimmen

Besserer Rubinstein - ist es möglich, Teile einer Funktion nicht zu wiederholen?

Ich habe eine kleine Sinatra-API, die ich versuche zu verschönern. Die meisten meiner Routen sind einfache Datenbankoperationen, aber einige beinhalten das Aufrufen eines externen Dienstes, bevor Datenbankoperationen durchgeführt werden. In allen Fällen ist der größte Teil des Codes gleich, außer wie ich auf die Antwort des Dienstes reagiere. Gibt es einen raffinierten funktionalen Programmieransatz?

Hier ist ein Beispiel einer dieser Routen:

  get '/update_x' do
    validateParams(params,:x)
    xid = params[:x]
    xName = getNameFromId(xid)

    if xName
      # Anfrage an Proxy-Service senden
      rid = generateRandomHexNumber(16) # requestId generieren
      params['m'] = 'set'
      params['rid'] = rid

      json = "{}"      
      begin
        response = @resource["/"+"?rid=#{rid}&id=#{xid}&json=#{json}"].get
        status = response.code
        body = response.body

        parsed_json = JSON(body)
        if parsed_json['response'] and parsed_json['response']['success'] and parsed_json['response']['success']=='false'
          msg = {:success => "false", :response => "unknown error"}
          if parsed_json['response']['response']
            msg = {:success => "false", :response => parsed_json['response']['response']}
          end
          content_type :json
          msg.to_json
        else

         #### Hier steht spezifischer Code für diesen API-Aufruf

          updateDBHelper(xid,buildUpdateOptions(params))

          params['ss_status'] = status
          content_type :json
          params.to_json

          #### Ende spezifisch für API-Aufruf
        end 
      rescue Exception=>e
        params['ss_status'] = status
        params['exception'] = e
        content_type :json
        params.to_json
      end
    else
      msg = {:success => "false", :response => "Not found"}
      content_type :json
      msg.to_json
    end
  end

3voto

Jakub Hampl Punkte 38490

Im Allgemeinen, wenn Sie ein allgemeines Muster mit beliebigem Code haben, der sich jedes Mal ändert, dann wäre das einfachste, einen Block mit diesen Anpassungen zu akzeptieren.

def make_api_request(some, params)
  # tu, was du tun musst
  yield(variables, that, your_custom_code, needs)
  # mache vielleicht noch etwas, vielleicht aufräumen
end

get '/some_route' do
  make_api_request do |variables, that, your_custom_code, needs|
    # hier benutzerdefinierte Dinge machen
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X